数学建模社区-数学中国
标题:
[转帖]产生素数的算法
[打印本页]
作者:
lckboy
时间:
2004-6-7 11:54
标题:
[转帖]产生素数的算法
Solovag-Strasson
% u9 J( K+ M6 P3 q
Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
6 j. e. P+ d8 R! F+ f9 Z2 u
+ X# S' h& E( j" K! L9 p
(1) 选择一个小于p的随机数a。
0 L3 w/ o3 Q! P: F
(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
/ y' N4 ^2 u5 h; n* i2 w+ x! d( H" U
(3) 计算j=a^(p-1)/2 mod p。
. u% y$ q3 {# L+ z% i# J: @7 v% t2 b
(4) 计算雅可比符号J(a,p)。
E( `8 x1 ^) D4 G% p( W9 x" J
(5) 如果j<>J(a,p),那么p肯定不是素数。
/ R5 {9 c. b- v
(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
+ @( y$ O: k5 P/ t0 y
; ^2 b: p( f6 `2 G
数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
8 C- t( ~& p( f; A- i: [
; t$ c& g1 ?: C, _8 P$ Y. T3 ^
Lehmann
' ^) P& }$ v5 ]7 @0 f. }1 i
另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
b' @( N- T- c, r; N
# z- L W/ S2 B) S/ @- r7 J
(1) 选择一个小于p的随机数a。
: f5 R: c" D+ S( c
(2) 计算a^(p-1)/2 mod p
( w5 L0 x8 [( h7 @
(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
7 }) R' A; P$ U2 G% I( V1 j: U
(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
# S% I$ w6 m7 l# G. J
s# g1 Y& O. Y# _( h" a
同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
e( c \8 [9 Y5 b4 d
/ T5 t6 E* E$ S; R' k7 O4 y5 ^
Rabin-Miller
; a: Z% s+ H* e. E& j8 Z2 f7 ^
这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
e( U+ Y/ g+ p/ g$ e% L
. ]1 Y/ o' X+ S
首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
# y4 p8 k! \+ `( A7 n/ [; V
$ D L* X) F$ z; K; D2 j3 J
(1) 选择一个小于p的随机数a。
; v1 q4 L0 E4 ]8 U8 Z
(2) 设j=0且z=a^m mod p
$ ]/ x' f1 N. b) w
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
8 X7 L6 c' J: H
(4) 如果j>0且z=1, 那麽p不是素数
! I; h1 n+ L3 n a. B5 L
(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
% t" x' P' w' Z& {% X
(6) 如果j=b 且z<>p-1,不是素数
7 @) [4 w% k$ U. x/ I/ d
9 S! y* U' N: r3 M! t7 ?# N+ \" v
这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
' |( a& w) x9 J8 v' B, R
; y5 V y) k2 `' j
实际考虑:
O; w0 A# w: n* |& m
在实际算法,产生素数是很快的。
" B, L. a& _' N9 r( m7 G' s
: a# y% v& y9 l/ g
(1) 产生一个n-位的随机数p
W: n# `. t/ m# F: V
(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
8 y* ~, l. k8 o0 |/ @! w
(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
! {9 W+ ?3 W: Z k/ t2 S
(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
, h3 P: I% @. T8 V* C& W
- I3 v' @3 V+ q, R4 @. X
0 ]2 {' d; t6 k
在Sparc II上实现: 2 .8秒产生一个256位的素数
- ]9 S( V7 Y! h9 B/ r$ T7 C
24.0秒产生一个512位的素数
2 v3 i' ~2 t. Z
2分钟产生一个768位的素数
5 ]# r. g3 m# W0 S0 G' Z% ~
5.1分钟产生一个1024位的素数
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5