- 在线时间
- 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
1 O, R r! O ]3 @: DRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: . n& [! B7 u4 a" x* d1 C( ^
" h7 X6 S: f3 o T$ `(1) 选择一个小于p的随机数a。
& a8 U& O, C; X) Q# J& `$ o(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
& I8 z: Z8 T+ r I2 r! b9 C- @(3) 计算j=a^(p-1)/2 mod p。
% g$ V; K6 S |(4) 计算雅可比符号J(a,p)。
: {& L6 ~" D2 P; h(5) 如果j<>J(a,p),那么p肯定不是素数。
! O: v y" n- g4 P( S( N$ o(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
! G/ X j' [2 a; t6 h" N% d" ^# e8 d5 w* z
数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
# K- d/ i' x' O2 ]6 \4 A
+ E. o4 j9 `6 A* J8 u$ [Lehmann
* z, m$ W4 K' @, {, E另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
- L9 I# {6 q4 V" J1 K7 m
* ^& q& g& w$ d" r+ Z(1) 选择一个小于p的随机数a。 7 K3 x. e& v; b" X* I
(2) 计算a^(p-1)/2 mod p
( l+ l. o; B5 u7 w, ?4 P6 L9 B! u(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
q: x$ u9 _+ [ e3 b. ~+ o(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
* L- F' h: m- c+ d8 S% n* h& A/ p3 ^! i( G+ d6 \. I K! E
同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 7 x9 n! a4 S2 H/ d
5 l2 H% n, l% k" ]+ y
Rabin-Miller 8 B% i! j$ ~3 \! f: E/ [2 V! n
这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
7 j$ V! m+ ?. T; i' K( e
* n& g9 G7 U- y, P$ B* t, X2 a4 o$ X首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 , h2 L! k6 {( i! d8 y* P
( ~$ o1 a ]; H0 h2 ~ x(1) 选择一个小于p的随机数a。 Y% _: t: B7 T) X/ X/ k2 A B! Q' r8 k
(2) 设j=0且z=a^m mod p * T7 n* W# k: u" l: B2 t/ S
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 ( f$ y& g8 h/ s4 b, Z# e6 [2 D4 d
(4) 如果j>0且z=1, 那麽p不是素数 4 }5 {& d* m+ E0 C# H
(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
& n' I; `! y- E(6) 如果j=b 且z<>p-1,不是素数
4 z% p+ L) g' d$ M' f( W
6 T' e% q0 G. J0 x: M这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
, W& S7 H' k+ _' G) E
) m4 I) v4 i4 p3 Z6 y) s实际考虑:
" z2 A- b3 E( O1 D5 ~在实际算法,产生素数是很快的。 ( Z1 t4 i6 D! f# @
) b8 l! Z; M# Q5 Z
(1) 产生一个n-位的随机数p
/ M/ j2 }" t( c: U! u9 ~, n8 e& p(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
! K8 y6 @* l& z4 i- o& o(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 1 r' ~- x6 G5 J8 w7 N8 `; G
(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 & L1 @, @' W L3 H; L4 w
2 @3 Z; M7 D& g9 e, c/ p, z& m
: r$ b* _- h7 U8 f8 ^1 b# |在Sparc II上实现: 2 .8秒产生一个256位的素数 4 G( ~2 f- b' }1 ^3 Y
24.0秒产生一个512位的素数 , u6 }9 k# c( L8 v4 \+ X
2分钟产生一个768位的素数 ' C# p+ t. _& t
5.1分钟产生一个1024位的素数 |
zan
|