数学建模社区-数学中国

标题: [转帖]产生素数的算法 [打印本页]

作者: lckboy    时间: 2004-6-7 11:54
标题: [转帖]产生素数的算法
Solovag-Strasson
# Y. j# f+ p% @0 yRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: ! q' K% I# _9 ?$ k
" j/ X" `4 l- ^6 r/ B2 L$ V0 l
(1) 选择一个小于p的随机数a。
) R  C9 o/ \& A' G; `3 B(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
- i, F  @: y) k# p) C(3) 计算j=a^(p-1)/2 mod p。
& r7 a) J( K( h; Q(4) 计算雅可比符号J(a,p)。
5 O+ j6 ]" [4 ?; \# X(5) 如果j<>J(a,p),那么p肯定不是素数。 $ @! r5 F% H$ y; x8 R
(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% 8 J& v- c7 d+ p& P8 `" N  V
0 s1 p( [! a: y+ C' ~
数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 / o" i$ s9 W# E

7 i  ?, X% }8 V# X' T2 nLehmann
3 k: E- J8 y% J另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
% m/ I  i7 @# v7 I3 T/ L
4 V& _# M7 \& M; n(1) 选择一个小于p的随机数a。
" ?; \; A. K% h; I. J6 }$ Q$ o& R(2) 计算a^(p-1)/2 mod p
% r3 u4 r( r" O0 g+ w4 d* ]+ a( Z3 A(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
% Z" E6 ]' {" O  ^(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% 4 u7 M* e' W3 u/ T8 I" ^! Y! C

' A( ]7 S, i7 [. A  A! i同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
) X0 b. e: \' {9 |
$ j5 v  G; }1 p2 w& d9 v7 I9 LRabin-Miller 2 _9 |! R  [* ^3 [: p1 |
这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 # x! s3 O1 T7 O4 R0 P" H0 n. [( E

5 f! ?; v3 [6 g5 @8 k3 B首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 8 q7 s4 b# P9 r* n  X2 `& [; D- n
: N9 J$ }# {# g
(1) 选择一个小于p的随机数a。 3 P4 ?; b" R& v+ t0 ^
(2) 设j=0且z=a^m mod p ! f% F( a1 K% r% g
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 1 j8 C* G: x3 N# o& z
(4) 如果j>0且z=1, 那麽p不是素数 7 M8 X1 q/ A% d2 h/ Y4 P) M
(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 4 q% p+ _6 t- i" L- O  W" k
(6) 如果j=b 且z<>p-1,不是素数
6 K! I" e2 ^3 b( Z
0 q' |; R3 `& w& N3 [" a' d这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。 + `% r0 N& s& c0 |4 k9 R0 H

: w% `# x5 x. ^" O6 O实际考虑: 4 d$ ]# X! b* ]7 [
在实际算法,产生素数是很快的。 4 p/ l& W8 h5 ?! e8 q% @, z/ d$ K

. I2 D& X1 l' M0 w: R# k& x- `(1) 产生一个n-位的随机数p
& }. }' m. L9 E, ]/ \3 H1 @" V(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
: S; K$ |- U9 g  K- ^0 c( D(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 + W. i2 n/ x; ?) C4 }4 f" c
(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
2 l- t: N* p7 O6 K! O7 B% B& N- H$ f4 X. T1 v

  x5 |4 a/ @" U7 W1 K/ T在Sparc II上实现: 2 .8秒产生一个256位的素数
. v, G. L2 o" g# D) I24.0秒产生一个512位的素数
6 Q& p2 X& ~7 X: @6 Y2分钟产生一个768位的素数
' }3 O8 P0 k" a5.1分钟产生一个1024位的素数




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5