素数检验法

 数的素性检验方法问题在近几年得到了飞速的发展,过去,要检验一个数 n 是否是素数,最简单的方法是用试除法,用小于n的平方根以下的所有素数去除n,若都除不尽,则n就是素数,否则为合数.这对于比较小的数来说还适用,若用计算机编成程序,对于10位数,几乎瞬间即可完成,对于一个20位数,则需要2个小时,对于一个50位数就需要一百亿年,令人吃惊的是,要检验一个一百位数,需要的时间就猛增到10^36年.到了1980年,这种困难的情况得到了改观,阿德曼(Adleman),鲁梅利(Rumely),科恩(Cohen),和伦斯特拉(Lenstra)研究出一种非常复杂的技巧,现在以他们的名字的首字母命名的ARCL检验法,检验一个20位数只消10秒钟,对于一个50位数用15秒钟,100位数用40秒钟,如果要他检验一个1000位数,只要用一个星期也就够了.但是大部分的素性检验法都不能分解出因数来,只能回答一个数是否是素数.
       我们知道,费马小定理是现代素数判定方法的基础,如果该定理的逆命题成立那该多好,只要计算一下ap-a是否能被p整除,能则p是素数,否则p是和数.遗憾的是这只对1    ARCL检验法改进了费马检验,它不再受伪素数的愚弄.这种检验法需要相当多的高深的数学知识.现在我还不能提供这个方法的详细情况,以后可能会的.在下面我将要讲的是n-1检验法和n+1检验法.
    1.n-1 检验法
如果对于奇数 n,我们已经知道了n-1的素因子分解式,那么如下的n-1检验法将是有效的.在1891年,E.卢卡斯将费马小定理改进成对于检验素数很实用的形式,后来又由克拉奇科和莱默进一步改进:

定理一:设n>1是一个奇数,如果对于n-1的每一个素因子q存在一个整数a使得:


           an-1 = 1 (mod n), and

           a(n-1)/q ≠ 1 (mod n);

则n是素数.

这个定理的不足之处是需要知道n-1的全部因子,那么能不能不需要如此呢?下面一个定理是泊克林顿(Pocklingdon)在1914年发现的:

泊克林顿定理:设n-1=qkR,这里q是素数,并且R不能被q整除.如果存在一个整数a使得an-1=1并且
gcd(a(n-1)/q-1,n) = 1,则n的每一个素因子q都具有qkr+1的形式.

利用这个定理,我们可以将定理一改进如下:

定理二:假定 n-1 = FR, 这里 F>R, gcd(F,R)=1 并且已知 F的素因子分解.如果对于F的每一个素因子q 都存在一个整数a >1 使得
           an-1 = 1 (mod n)
           gcd(a(n-1)/q-1,n) = 1;
则 n 是素数. (注意对每一个 q 都可以用不同的 a).

定理二还可以进一步改进如下:如果 F

    在我们转向另一种检验法之前,让我们把如下定理二的两种应用记述如下:
佩班(Pepin)检验法(1877): 让 F(n) 第n个费马数 ( F(n) = 22n+1) 并且 n>1.

           F(n) 是素数当且仅当
           3(F(n)-1)/2 = -1 (mod F(n)).

普罗斯(Proth)定理 (1878): 让 n = h.2k+1且 2k > h. 如果存在一个整数a使得:
a(n-1)/2 = -1 (mod n), 则 n 是素数. (这个定理已经有一个程序,欢迎下载)

定理三 : 让 n = h.qk+1 且 q 是素数 并且 qk > h. 如果存在一个整数a使得 an-1 = 1 (mod n), 并且 gcd(a(n-1)/q-1,n) = 1, 则 n 是素数.

 

    2. n+1 检验法和Lucas-Lehmer检验法

    有许多已知的大素数具有形式N-1, 而 N 是很容易分解因数的,为什么这些形式的数能被检验呢?因为对它们可以应用一种类似于费马小定理的有趣定理来对付它们.
  
    假定我们选择两个整数 p 和 q 使得 p2-4q 不是模 n的一个平方剩余, 则多项式 x2-px+q 有两个不同的根, 其中之一是 r = (p+sqrt(p2-4q))/2, 并且很容易推导出 r 的幂具有如下形式:

引理 1: rm = (V(m) + U(m)sqrt(p2-4q))/2

这里 U 和 V 分别定义如下:

U(0) = 0, U(1) = 1, U(m) = pU(m-1) - qU(m-2)

V(0) = 2, V(1) = p, V(m) = pV(m-1) - qV(m-2)

这就是关于 p 和 q的卢卡斯序列. 一个众所周知的特例是令 p=1, q=-1, 则 U(m) 斐波拿契数列.卢卡斯序列有许多特性,使得它们能很快地进行计算(用一种类似于我们在计算 xm 时所用的重复平方的方法):

          U(2m) = U(m)V(m)

          V(2m) = V(m)2-2qm

现在我们来叙述这种类似于费马小定理的定理:

引理 2: p, q 和 r 同上 (使得 p2-4q 不是模 n的一个平方剩余),
       让 2r = a+bsqrt(p2-4q) (mod n) .
       如果 n 素数, 则 2rn = a-bsqrt(p2-4q) (mod n).

这样说有点太混乱, 让我们用我们的 U 序列(即sqrt(p2-4q)的系数). 

引理 3: (p, q 同上) 如果 n 是素数, 则 U(n+1) = 0 (mod n).

现在我们可以重新叙述一下定理了:

定理 4: 让 n > 1 是一个奇整数. 如果对于 n+1 的每一个素因子 r 都存在相应的素数 p 和 q (这里 p2-4q 不是 n 的平方剩余)使得:

U(n+1) = 0 (mod n),并且

U((n+1)/r) is not 0 (mod n);

则 n 是素数.(确定一个数 d 是否是 modulo n 的一个平方剩余很容易用 Jacobi 符号来决定,这在任何一本数论书中都可以找到.)
    一个重要的有趣特例是设S(k) = V(2k+1)/22k

卢卡斯-莱默检验法(1930): 让 M(n) 是第 n 个梅森素数 (即 M(n) = 2n-1). M(n) 是素数当且仅当    S(n-2) = 0 (mod M(n)) 这里 S(0) = 4 并且 S(k+1) = S(k)2-2.

这个检验法计算特别快,因为它不需要做乘法,只要做移位即可.编写程序也很容易.

你可能感兴趣的:(算法和密码学)