- 在线时间
- 8 小时
- 最后登录
- 2016-1-23
- 注册时间
- 2004-5-7
- 听众数
- 1
- 收听数
- 0
- 能力
- 0 分
- 体力
- 610 点
- 威望
- 0 点
- 阅读权限
- 30
- 积分
- 218
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 70
- 主题
- 26
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   59% TA的每日心情 | 怒 2014-2-22 20:49 |
|---|
签到天数: 13 天 [LV.3]偶尔看看II
 群组: 2014美赛MCMA题备战群 群组: 2014美赛MCMB题备战群 |
Solovag-Strasson 0 p) Q$ L' ~! Z0 ~1 J
Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
$ H) G* ]3 Z% M0 \1 w6 ~0 [8 _$ L o
(1) 选择一个小于p的随机数a。
% S+ I- ?* Z" ?& A(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 / T' g7 I+ b# ]
(3) 计算j=a^(p-1)/2 mod p。
2 Z% v0 [8 u! H4 b3 \4 Z- Y, P: v(4) 计算雅可比符号J(a,p)。
: {+ w% x0 h$ Y7 V; @) z(5) 如果j<>J(a,p),那么p肯定不是素数。 % P1 L0 R0 s2 M. P i: ^* K7 c# n
(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
+ b! E1 l% d- a9 }4 \! x
! M* c4 ^4 x4 O& R数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
# J- @5 j) J9 B9 t
3 H! T4 D* t# ^6 p* xLehmann + {0 v k: f& m6 V, K
另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
# ~3 R% N1 K/ y
% ^7 Z! @* d3 F# S(1) 选择一个小于p的随机数a。 1 R% c4 M5 {0 k. }& B
(2) 计算a^(p-1)/2 mod p
; d! T, d' u& W9 C+ L9 ]' g" O/ e(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 5 x9 _ w0 Z2 s) \
(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
/ M6 k2 ]/ S; Q- u$ X$ I5 T/ B+ Y9 L% p+ B( \' B- @
同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 $ z9 n# f/ P; S3 H. f8 B7 p
" B. T& T" u! ?! M! n" XRabin-Miller
% L+ L. R. i. Q: T这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
4 J# y9 S2 ]/ R8 h3 a% U! M
( _) _& N! B1 k4 r首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
5 E2 f/ A( e- k+ D! @. } Z
2 @2 V) E- [- d$ G# a) |1 g, Q(1) 选择一个小于p的随机数a。
1 P! y/ m) \! {6 ](2) 设j=0且z=a^m mod p " Y4 J% `2 j2 x7 }% G. Q' i
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 . F3 h6 H1 H5 p z5 u
(4) 如果j>0且z=1, 那麽p不是素数
8 m% c* a" G/ p9 B/ n% J s% o7 ~(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 & y/ g1 d5 M( |& W
(6) 如果j=b 且z<>p-1,不是素数
8 V1 k9 x. l: W$ E0 k1 ?! e+ [8 ~, H( I$ B
这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
8 ?6 H7 `. G$ D |# E7 ^
& K' n _+ V9 v6 U3 |/ v- @6 j实际考虑:
1 b1 m' a, h5 ^& R* j3 q; c在实际算法,产生素数是很快的。 1 g' {. R) Q; R# }8 u5 a2 X( z9 ^
0 z2 T/ S: x5 r& ^
(1) 产生一个n-位的随机数p 8 k K R' m) h \9 s5 l" z' _
(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
% C3 t9 K" a7 `! G0 \(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 7 ?/ \9 ?9 G$ w/ a/ h& O& X
(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 % t2 ~; K5 ]4 ?( K
7 {" K) S' K8 N3 z* Y3 c4 C+ y
- N" j% m; V" T$ Y在Sparc II上实现: 2 .8秒产生一个256位的素数
: C/ F5 t9 C2 J' W& ~' h24.0秒产生一个512位的素数 % L" c3 |. n$ H5 O+ b
2分钟产生一个768位的素数
% M" K- S5 S' ^7 e- G5.1分钟产生一个1024位的素数 |
zan
|