费马小定理
定义:如果p是质数,并且a不能被p整除,那么a^(p-1) ≡ 1 mod p。
(据说现在是小学五年级的奥数定理、、、我大天朝崛起指日可待了、、、)
定理解释:如果p是一个质数(也就是素数),而且a不能被p整除,那么就会有a^(p-1) % p == 1。不过这只是个必要条件,也就是说,所有的素数都能通过这个测试,但是有一类数(卡米克尔数)就不能通过这个测试。也就是说有些合数也可以通过这个测试。
关于素性测试
蒙特卡罗素性测试(随机性测试数字素性)
蒙特卡罗素性测试,就是充分利用费马小定理。
过程:
(1)随机选择一个数a<p,并且判断这个数a是否能被p整除,如果不能,重新选择。
(2)如果a^(p-1) % p != 1 ,那么直接退出循环,证明这个数不是素数。
(3)如果a^(p-1) % p == 1,那么这个数有可能是素数、、、(毕竟还有个卡米克尔数)
(4)多做几次1~3步,并返回答案。
代码如下:
int isPrime(int p){ srand(time(NULL)); for(int i =0 ;i< 1000 ;++i){ int a; while(1){ a = rand() % p; cout<<a<<endl; if(a == 0) continue; if(p % a) break; } if( pow(a,(p-1))% p != 1) return false; } return true; }