(1)Fermat's little theorem
defination: if p is a prime,then for every 1<= a < p,
a^(p-1) ≡1(mod p)
这是一个充分条件,不是必要条件。比如341 = 11 *31,但是2^340 mod 341 = 1。
所以不能从结果推出某个数是不是素数,但是我们还是还是先把代码写在这
//随机的选一个整数a<p
if a^p-1 mod p = 1
return yes;
else
return no;
(2)扩展
主要就是想说说关于费马小定理的一个引论。
Lemma: if a^(p - 1) mod p != 1 for some a relatively prime to p,then it must hold for at least half the choices of a < p
这是一个非常重要的引理,因为他给了我们费马小定理判断一个数是否为素数的条件
从费马小定理和这个引理我们可以总结:
(1) If p 是素数,那么
a^(p-1) ≡1(mod p)一定成立(1 <= a < p)。
(2)if p 是合数,那么a^(p-1) ≡1(mod p)只对最多一半的a成立(1 <= a < p)。
那么,对于上面的代码来说,P1(return yes when N is prime) = 1
P2(reutrn yes when N is not prime) <= 1/2
可以发现,当我们多次使用费马小定理时,那么P2(return yes when N is not prime)<= 1/ (2^n)(n为使用次数)。
此时,其概率是非常小的(真的非常小),我们可以近似的吧这个判断素数算法看做是正确的。
//随机的选一个整数ai<p
if ai^p-1 mod p = 1(for i = 1,2,....,n)
return yes;
else
return no;
P表示概率