数论之素数及其相关定理
一、素数定义
基本概念:素数又称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
唯一分解定理:一个数n肯定能被分解成 n=p1^a1 * p2^a2 . . .*pn^an(p是素因子,a是素因子的个数)
因为一个数肯定是由合数和质数构成的,合数又可以分解成质数和合数,最后递归下去就会变成质数的乘积
最后化成了质数相乘的形式
二、素数的判定
朴素算法(时间复杂度O(n)):
bool isprime(int x){
for(int i=2;i<=x;i++){
if(x%i==0) return false;
}
return true;
}
进阶算法(时间复杂度O(sqrt(n))):
可以注意到如果在2~n-1中,存在n的约数,不妨设为k,即n%k==0,那么由k*(n/k)==n可知,n/k也是n的一个约数,且k与n/k中一定满足其中一个小于等于sqrt(n)、另一个大于等于sqrt(n),其中sqrt(n)为根号n。那么只需要判定n能否2,3…sqrt(n)中的一个整除,即可判定n是否为素数。
bool isprime(int n){
if(n<=1) return false;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0) return false;
}
return true;
}
三、筛法求素数
1、埃氏筛法(时间复杂度O(nloglogn))
素数筛法的关键就在于一个“筛”字。算法从小到大枚举所有数,对每一个素数,筛去它的所有倍数,剩下的即为素数。
const int maxn=