对于许多的数学家来说,质数一定是非常可爱的,在质数身上,有太多太多令人着迷的特性和谜题。
所以。。。。这玩意是真的难,我都快学吐了QAQ
不过嘛。。。经过几番对线,终于还是学到了那么一丢丢有关质数的知识,所以来这里做个笔记,如果有有缘人的话就分享一下也不错呀,嘿嘿。
1.质数的概念
质数的概念,其实我们在很早很早以前就学过了(依稀记得好像小学就已经学了呢)。但是为了防止某些二傻子(比如我)忘记它的概念,所以还是说一下吧:
质数是指,大于1,且只能被1和它本身整除的自然数集。
概念还是很好记的,有没有像我一样只记素数(质数的另一个名字),忘了质数的小伙伴QwQ
那么,我们要继续深入的了解素数,首先,就先得会判断一个数是不是质数。
2. 试除法判定素数
试除法判断素数是判断一个数是否是素数的最简单最粗暴的方法,而且效率也还阔以,时间复杂度是O(n)。思路就是把2到n-1,所有数都和n除一遍,如果都不能整除,那很显然,n就是个质数了。
代码长成介个样子
bool check_prime(int n)
{
if(n < 2) return false;
for(int i = 2; i < n; i ++)
{
if(n % i == 0) return false;
}
return true;
}
当然,这个代码我们是可以优化一下的,把复杂度优化成O(sqrt(n))。
那么优化思路是怎样的呢,我们首先要了解一个性质,假设有一个数n,他可以被d整除,那么nj就也可以被n / d整除,其实这个性质是很好想通的。
那么由此可以看出,一个数的约数,都是成对出现的,所以我们在枚举的时候,可以之枚举较小的那一个,大的那一个也就被自然排除了。
那么,我们就可明确,我们在枚举时,只用枚举条件满足d <= n / d的数,我们可以很容易的化简出d <= sqrt(n),这样我们就可以把复杂度降成O(sqrt(n))了
代码其实就是把判定条件改一下下
bool check_prime(int n)
{
if(n < 2) return false;
for(int i = 2; i <= n / i; i ++)
{
if(n %