关于素数的研究已有相当长的历史,近代密码学的研究又给它注入了新的活力.在关于素数的研究中素数的测试是一个非常重要的问题.Wilson 定理给出了一个数是素数的重要条件.
Wilson 定理 对于给定的正整数 n,判定 n 是一个素数的充要条件是
(n-1)!≡ -1(mod n)
Wilson 定理有很高的理论价值.但实际用于素数测试所需要计算量太大,无法实现对较大素数的测试.到目前为止,尚未找到素数测试的有效的确定性算法.
首先容易想到下面的素数测试概率算法Prime
bool Prime(unsigned int n)
{
//rnd.Random(n)返回0~n-1之间的随机整数
RandomNumber rnd;
int m=floor(sqrt(double(n)));
unsigned int a=rnd.Random(m-2)+2;
return (n%a!=0);
}
算法Prime返回false时,算法幸运地找到n的一个非平凡因子,因此可以肯定n是一个合数.但是对于上述算法Prime来说,即使n是一个合数,算法仍可以高概率返回true.例如,当n=2653=43*61时,算法在2~51范围内随机选择一个整数a,仅当选择到a=43时,算法返回false.其余情况均返回true.在2~51范围内选到a=43的概率约为2%,因此算法以98%的概率返回错误的结果true.当n增大时,情况就更糟.
著名的费马小定理为素数判定提供一个有力的工具
费马小定理: