素数定义
定义1: 我们把仅有两个正因数的正整数叫做素数,不是素数又不是1的正整数叫做合数
定义2: 除了1和它本身以外,不存在其它的正因数的数的正整数叫做素数,不是素数又不是1的正整数叫做合数
素数判断
根据定义写出一个朴素的判断素数的函数
bool isprime(int n){
if( n ==1 ) return 0;
for(int i =2;i<n;i++){
if(n%i==0) return 0;
}
return 1;
}
优化:
设命题p(n)表示,整数n是一个素数
命题q(n),存在两个正整数x,y,x⩽y且x=1∧y=1,使得n=x⋅y
显然p(n)⇔q(n),两者是等价命题
显然x的取值范围是[2,n],
显然∃x(∈[2,n]∧x∈N)∧y∈N→x⋅y=n⇔¬p(n)
所以我们只需要检测是否存在这样的整数x,就能判断这个数字n是否是素数
bool isPrime(int n){
if( n == 1) return 0;
for(int i =2;i*i <= n;i++)
if( n%i == 0) return 0;
return 1;
}
埃氏筛
例3找出1一100中的全部素数.
解:只需把1与1~100之间的合数去掉即可.而对于1~100之间的每个合数a,它
一定能被某个不超过√a的素数整除,从而能被不超过√100=10的素数整除.我们知道,
不超过10的素数为2,.3,5,7.在1~100中首先去掉1,然后分别去掉2,3,5,7除自
身以外的倍数,最后剩下的数就是不超过100的全部素数.具体做法如下表:
111213141516171819121222324252627282923132333435363738393414243444546474849451525354555657585956162636465666768696717273747576777879781828384858687888989192939495969798999102030405060708090100因此不超过100的素数为2,3,5,7,11,13,17,19,23,29,31,37,41,43,
47,53,59,61,67,71,73,79,83,89,97,共25个.这种寻找索数的方法叫做埃
拉托斯特尼(Eratosthenes)。
筛法
欧拉筛
TODO