@lunar
2016-04-09T00:51:50.000000Z
字数 1338
阅读 1777
HiHo
HiHo一下的合集参见这里,不断更新
第1行:1个正整数t,表示数字的个数,10≤t≤50
第2..t+1行:每行1个正整数,第i+1行表示正整数a[i],2≤a[i]≤10^18
第1..t行:每行1个字符串,若a[i]为质数,第i行输出"Yes",否则输出"No"
//样例输入
3
3
7
9
//样例输出
Yes
Yes
No
素数一直是数论的重要一环,这里给出有关素数的四个有趣的性质的证明,来自Matrix67的blog。
然后就是本题中会用到的算法的原理————费马小定理(Fermat's Little Theorem)
这个定理的逆命题并不正确,即若,p不一定为素数(但是若不满足这个调节一定不是素数)。但是这时候p为素数的概率非常大,也就有了Fermat测试,取a=2,计算,若等于1,说明有可能为素数,然后可以试试不同的a,也可以制作一张伪素数表,查找p是否是伪素数。
但是如果不用伪素数表,那么在前10亿个自然数中使用单次Fermat测试,出错的概率是0.00011,有点高了。所以人们想到改进这个算法。
Miller和Rabin在Fermat测试上,建立了Miller-Rabin质数测试算法。
与Fermat测试相比,增加了一个二次探测定理:
如果p是奇素数,则 x^2 ≡ 1(mod p)的解为 x ≡ 1 或 x ≡ p - 1(mod p)
如果a^(n-1) ≡ 1 (mod n)成立,Miller-Rabin算法不是立即找另一个a进行测试,而是看n-1是不是偶数。如果n-1是偶数,另u=(n-1)/2,并检查是否满足二次探测定理即a^u ≡ 1 或 a^u ≡ n - 1(mod n)。