- 在线时间
- 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
- F1 J6 F$ E+ [4 j6 O4 [Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
0 _0 V. {$ }# u
/ I/ R: L. A9 f/ b' p6 o! z5 _6 A(1) 选择一个小于p的随机数a。 1 W( W6 t- w* u( K+ _, g
(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
: `5 m: e) B" B4 @ C6 C& ~1 E(3) 计算j=a^(p-1)/2 mod p。
) t; I: C4 w2 O/ b7 j7 t9 {! U9 o+ j(4) 计算雅可比符号J(a,p)。 0 v% I# a: j `( L- y! K. X
(5) 如果j<>J(a,p),那么p肯定不是素数。 4 R- h8 Z0 X2 ]" E+ z7 g1 o5 C
(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
8 C- M5 @. w' @+ M; C
7 X" A" s) }3 L# s数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 / x5 F& X3 M0 c% {6 R6 O8 u; ~& P% @
7 M! \7 x# r: v
Lehmann 7 N* K( p) P" @ P9 `' i m; p
另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
/ m1 T0 Q9 M6 j) t" N! o* Q8 m
(1) 选择一个小于p的随机数a。
5 p7 Z% z) D% @; P(2) 计算a^(p-1)/2 mod p
/ e( `; l3 x+ b(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 # c: o% `2 ?5 e$ j
(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
" X8 D. x( v0 }) U
) ^ C Y- }$ _, p同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 6 }/ n, m9 E+ U/ ~6 K. b0 {( x* s* y
+ K5 H5 Q8 d. n& @' m7 ^3 MRabin-Miller
2 v! o8 C5 ]/ d这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 8 v- P5 X# P( U+ h, E
& }+ V8 `/ a' c% C1 f. |! f9 j首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
5 h% _- ~, D0 b# q R; J( s: m# R7 W1 {
(1) 选择一个小于p的随机数a。 8 w. G e5 k; g6 |5 _5 l
(2) 设j=0且z=a^m mod p ' w W$ r5 Z: \
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 * P+ F8 V* I0 W' E" j: h
(4) 如果j>0且z=1, 那麽p不是素数 2 `$ J0 \# z+ C8 c' r
(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 ; H; d( a2 c) b+ r/ M
(6) 如果j=b 且z<>p-1,不是素数 " h7 q9 i; A$ ?5 T# u
2 o4 G/ G6 K/ M$ M; c
这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。 , g7 `- z; u* H: E- X" f
. D2 Z! n2 n: w$ T7 ]实际考虑:
$ Z& e' g# ^+ {$ G+ S5 G+ J在实际算法,产生素数是很快的。 * _* Y# p/ s8 N: _ W
+ I. o; a4 P6 ~ }9 r- E
(1) 产生一个n-位的随机数p 8 S/ ]5 P% G* w9 {. b9 u
(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
1 }' @3 P, h3 Q; D# o# k: Y(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 . h* Z4 v8 w/ v' X9 y
(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
) L9 l& N* k4 S3 K% z( g ?& c0 W% T1 M# x$ p A
+ ?5 {/ j ^. W3 s; ?在Sparc II上实现: 2 .8秒产生一个256位的素数 # y/ M) x& _# N* G+ O7 a
24.0秒产生一个512位的素数 3 l% z$ k. I( U* [4 S" M0 Z
2分钟产生一个768位的素数 : s$ Q8 _% M9 w/ ?7 V
5.1分钟产生一个1024位的素数 |
zan
|