- 在线时间
- 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
5 a- a! a2 K+ b; b& i% N2 gRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: ! A4 p: V2 B- y( C) U. g
: v0 E; V( r3 M
(1) 选择一个小于p的随机数a。 5 U) p; |* ]) n. n- u; R* s
(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 + y" q$ Q! m7 Z+ V7 R" g
(3) 计算j=a^(p-1)/2 mod p。
~4 s& K) Z% s( Z! S(4) 计算雅可比符号J(a,p)。
1 c, A/ v. O4 I1 s4 v, b(5) 如果j<>J(a,p),那么p肯定不是素数。
, `4 k/ ~# X9 f) N(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
" C8 u' k3 V) }- e6 O8 T( v3 M0 Q
数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 ( j) F" Q' w" q* O% {) g; x
4 e" w/ @1 A& x% o6 n6 W1 t0 ]
Lehmann
& ^( D; C# N9 M1 \* E' d6 {) w另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
3 y6 {. l0 H# a$ H
+ w( A, l2 J) r(1) 选择一个小于p的随机数a。 : M- W7 h$ J3 Q
(2) 计算a^(p-1)/2 mod p
! k3 |3 n. S& k+ ?; A$ \(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
n9 Q- ?# p4 F" m(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
* ^* |2 f% J1 x
1 b0 h; C- i% x- u同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 7 w& X3 j! \( `9 ? R
4 ?+ j$ ^3 S3 J* E
Rabin-Miller
& I3 ?4 [# x/ G, M6 G2 r这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 . [" `2 T$ q& s; \9 U+ k/ {. c
+ x# l! y6 l* f# W! {# @' W' k
首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 + l) B: g. @5 A! Y/ _' q
% L* c4 i/ m* l! [2 N& B
(1) 选择一个小于p的随机数a。 6 W- ] Y" [5 A9 H
(2) 设j=0且z=a^m mod p 7 N! f% M4 u: G& {
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
7 W+ n* M% v. f s2 l(4) 如果j>0且z=1, 那麽p不是素数
( s8 X) m% Z* y' {/ p4 O" K(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
+ i# s2 U5 ]6 I$ _2 z# p" o: d(6) 如果j=b 且z<>p-1,不是素数
8 x0 w( d* B8 s# J
& c- w- z, M# x7 q+ n: P4 o这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
4 Q* L m8 Y- V' s! l7 ]" j: F
实际考虑:
$ i6 a z7 w# a/ n6 o/ |在实际算法,产生素数是很快的。 & S7 R8 M7 S" Q! c0 g4 ?: L) y
r' ?% P& Q. v& d6 t(1) 产生一个n-位的随机数p 2 E+ G X# i4 Y8 `$ q/ L" c) ]% o* I
(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) 8 M6 o( B% c; R7 W8 v' r2 C
(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
9 S/ |4 `0 I v# d f+ [0 J(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 ( n/ R& q) J, ]6 R; Z
# t6 n& u( L$ `! E# Z! u
. K. [- p# X; l+ Q* G4 M. w. }3 z
在Sparc II上实现: 2 .8秒产生一个256位的素数 ) X" z3 H; y0 S' s9 C9 g; \' F! s
24.0秒产生一个512位的素数
+ O0 g8 m% }4 W, ~2分钟产生一个768位的素数 * Z; R0 y2 |8 s) ?3 b6 m
5.1分钟产生一个1024位的素数 |
zan
|