弱菜开始学数论了,不定时更新。。。
一.素数定理
素数分布:小于x的素数大约有 x/ln(x)个
推论:如果Pn为第n个素数 那个Pn约等于n*ln(n);
二.素数测试
1.sqrt(n)的朴素测试。这个就不多说了,数据范围小的时候比较方便
2.nlogn的筛法
voidsetprime()
{
memset(prime, 0, sizeof(prime));//为了方便赋值。令prime[i]=0 表示 i是素数for (int i=2; i
{for (int k=i*i; k
prime[k]=1;
}return;
}
3.线性筛
2中筛法会重复筛掉部分合数,因此复杂度还可以优化,得到线性筛
voidsetprime()
{for(long i = 2 ; i < N ; i ++)
{if(!isNotPrime[i])
prime[num_prime++]=i;for(long j = 0 ; j < num_prime && i * prime[j] < N ; j ++)
{
isNotPrime[i* prime[j]] = 1;if( !(i %prime[j] ) )break; //关键优化
}
}return;
}
此筛法的关键在于注释中的break。prime[]数组记录素数。当i可以整除prime[j]的时候break,原理见 http://blog.c