数学建模社区-数学中国

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

作者: lckboy    时间: 2004-6-7 11:54
标题: [转帖]产生素数的算法
Solovag-Strasson ' h; j. ]6 ~: ~
Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
& }) a7 {. p+ d" v8 U" J! w3 d
% u! E  M; w2 v8 ]/ R! W5 q+ B' F# J(1) 选择一个小于p的随机数a。 ( |, i7 ]: }$ Z' m: i7 w
(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
1 O! v% J" e: P/ ~% l(3) 计算j=a^(p-1)/2 mod p。
- p3 a1 q+ W( ^; x# X(4) 计算雅可比符号J(a,p)。 ) H4 _* S' C; {1 J/ K( p8 @
(5) 如果j<>J(a,p),那么p肯定不是素数。 4 n* N4 G' N( z- k! z# k: `  I
(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% % t0 h9 U( ~7 d0 \+ D
" v, t3 \7 F' d3 o% c. H# R
数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
: b/ X, b) R6 X' A% r# S, I. j( D0 v8 S( D5 `* c3 E
Lehmann
: k4 j2 c" l9 \另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: / c; q" D# w4 o' R5 ?$ ]

3 N- j2 W- |; `% w* `% Z) s  Z(1) 选择一个小于p的随机数a。 / ~1 W. N6 x. z0 W1 f3 n$ X. h  c
(2) 计算a^(p-1)/2 mod p
0 k+ j0 O0 b% b3 _. H(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 ) t. `; [- @. N% j$ c+ W
(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
7 F2 B  L4 d6 V- E, u# b4 n
4 x: a4 w/ V$ d( M* A7 ]同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 + b6 M8 ]; z1 v' W# y5 P5 @

( N8 K- {% C/ g) N5 j1 NRabin-Miller
9 C% m. P0 V' J. C" p这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 " |- @( F" a: |9 k! F

8 V5 e, u8 N! |- ^( D, z  W+ w首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
9 ?! [- H0 N, i9 W
" W; z! p  x& q3 s! D* v! D(1) 选择一个小于p的随机数a。
( l8 q6 }  z! E  h- H(2) 设j=0且z=a^m mod p
# _& z$ T3 W# T" C& ]8 \(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 7 j( E) o6 s7 m8 o% b1 K
(4) 如果j>0且z=1, 那麽p不是素数
/ M5 i+ K( g& Q) A(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
! J+ f$ f3 }% l+ p1 i% u# i(6) 如果j=b 且z<>p-1,不是素数
6 E9 q* T2 D5 c& {) s, U/ z- M% G4 j& b$ B3 z4 Q3 j- M
这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
! r4 E3 M! E# C/ P0 A! w3 R5 j- X" q. l0 I9 R! K' A# D
实际考虑:
" J% |. h7 ]1 J在实际算法,产生素数是很快的。
; D0 d% q/ r* w, t* C8 [# v# I) a/ ~- B( T' o# a5 C
(1) 产生一个n-位的随机数p
' ]2 u; p3 _8 O# D7 c. B6 e- P1 e(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
. l$ V7 [- B% c. w8 f(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
3 x9 M4 q( ]3 e+ I7 z(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
* ?  p$ B! e" D+ S% @
, \% n( k- f  g% ?' ~" {& L6 a' E% o7 p& I; F# `
在Sparc II上实现: 2 .8秒产生一个256位的素数 * D7 a0 |9 ~) t3 u
24.0秒产生一个512位的素数 - F, o; m( A3 h- @5 K, x3 N
2分钟产生一个768位的素数 * S. X6 Z! x, o# _7 s  v
5.1分钟产生一个1024位的素数




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