- 在线时间
- 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
: A, S! G3 Q: R8 kRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: ) {1 e; A6 q; ~ {3 Y
9 Q, @* j; B" y$ B' s. s% e
(1) 选择一个小于p的随机数a。 / k. u6 r, ~) P# A6 ^; q" Y" w
(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
! t7 z- P! E- a(3) 计算j=a^(p-1)/2 mod p。 9 i1 a& U, j, Q4 o
(4) 计算雅可比符号J(a,p)。
8 K. }% \8 p9 a& S* J, g- u(5) 如果j<>J(a,p),那么p肯定不是素数。 7 U! n9 `9 y* u: @
(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% " \( O5 H- r1 s$ ~ I- R5 R/ o K
) ^6 x4 A2 r# C+ t0 d. y1 }数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
8 B+ J( ^' y. w6 }; E# z' ]# ^' p+ f" |2 ?0 r/ K; \: \; Q# i2 k- Y, @ {
Lehmann
+ v1 G5 {. _- @' n; D& Y另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: $ Q% Y' G5 a I7 ~" ^( N
/ ~7 ]( P: h' x5 Y7 q(1) 选择一个小于p的随机数a。 ^; t0 B/ s3 }3 b; Q/ I* y i
(2) 计算a^(p-1)/2 mod p + d# K3 {7 `3 t- C* O D
(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 # D# d' R% u( k) M
(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% 1 C/ `5 w4 R; @0 z
' S7 }4 _' q7 ]; m- }
同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
# A9 T, s# n. D8 d7 r5 S* |# [
Rabin-Miller
- s% F9 W% v% @! q0 L这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
$ Z' }% i1 p0 ~( L+ R; w% x7 y$ R9 l0 n% R2 V. K' [- L) V
首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 $ P# [3 ?0 {- C6 E7 t; i3 }/ c! U ~
% N T q7 \2 E8 g1 Y
(1) 选择一个小于p的随机数a。 1 K0 W |8 M" {* R# W/ L+ }$ ?
(2) 设j=0且z=a^m mod p
6 M7 S6 x5 S* r$ ` ]5 B- ~0 |(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
7 Q$ } d: K( v, t(4) 如果j>0且z=1, 那麽p不是素数
' s9 O) l1 K8 u; R1 ~; Z2 j) M(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 ' a' H. k7 o! F) s( ^0 h3 L
(6) 如果j=b 且z<>p-1,不是素数 , r* {/ V# e$ f {/ u
6 i6 Q% A6 M5 H2 O9 P这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
" K$ _* [- G2 \ N
# e6 r' Y& y7 T+ A! s. n3 n实际考虑: / ^9 E8 G5 ^% l! r2 ~! b
在实际算法,产生素数是很快的。 $ h' ?6 \/ w4 M* ]: x
3 ?, u) l. K2 m6 n8 o5 ?
(1) 产生一个n-位的随机数p 2 N# ^3 h. \0 ~
(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) 4 T5 E/ g/ O X
(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 - k6 Z2 D6 B! H& m8 R% c
(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
% W, o5 J. d1 p3 J/ {
; w7 |) `- b! |1 o; J7 U( z- q6 O7 ]7 H: _* y! T4 @% z( G/ O
在Sparc II上实现: 2 .8秒产生一个256位的素数 # i6 `( V. R; ` n% ?# h5 q( I
24.0秒产生一个512位的素数 & o7 [ k' W# d7 L' h* m9 c* R
2分钟产生一个768位的素数 ' S4 P1 U+ F. E6 U: O% B. X
5.1分钟产生一个1024位的素数 |
zan
|