QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4081|回复: 0
打印 上一主题 下一主题

[转帖]产生素数的算法

[复制链接]
字体大小: 正常 放大
lckboy        

26

主题

1

听众

218

积分

升级  59%

  • TA的每日心情

    2014-2-22 20:49
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    群组2014美赛MCMA题备战群

    群组2014美赛MCMB题备战群

    跳转到指定楼层
    1#
    发表于 2004-6-7 11:54 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    Solovag-Strasson
    0 O, o' O' u2 n6 \" _Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
    " f( E, Q9 v2 b( ^) |! M
    # Q- n" Z& ]0 F" ~+ D(1) 选择一个小于p的随机数a。 9 o& z8 ^# k3 K
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 $ \+ ]% o6 N0 H, M4 H! }
    (3) 计算j=a^(p-1)/2 mod p。
    7 h8 o' e4 m, b& q! }9 W5 r" ~& {" I(4) 计算雅可比符号J(a,p)。
    + c/ O* @1 @3 m: B(5) 如果j<>J(a,p),那么p肯定不是素数。
    - o! P6 `2 Z, i' |5 K% f(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    * w3 o5 M$ Q2 q' Z. V: o( L& B8 ]: w  M8 O4 d( w
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 $ c* d) ~; o3 h8 \( T- u) r

    # j6 y# b* G6 ^9 N' F- x! W& mLehmann " W# A3 l" R8 R7 ]: F7 u
    另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: ) L7 ?, i6 Q3 I* \! p
    : ]* C; l% G( W
    (1) 选择一个小于p的随机数a。 ) J$ d- C- }3 G2 x' P
    (2) 计算a^(p-1)/2 mod p ; c* L: t$ k* R( L7 K
    (3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 $ j0 I" s6 N8 F# _7 V
    (4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
    " t5 D! v" R* O- z# g
    : E- Q9 y2 j& S同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    - Q4 f3 ?: V* [* D2 \: U
    9 b9 Z, o5 J7 I- F' JRabin-Miller
    ( V2 j' T7 }7 `; F! d% W. @这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
    4 s" y- V5 A9 ]; M6 W: W1 O- J! ?! K8 t5 g
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 2 d0 x: }0 K- `' ^2 ?( n
    ( ^! p. C0 ?5 W9 u
    (1) 选择一个小于p的随机数a。
    7 y" L1 N. Y% x! V(2) 设j=0且z=a^m mod p
    $ u9 L4 g, A, P  W$ P$ q: @(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    - T4 f$ }) J7 Y( E4 E(4) 如果j>0且z=1, 那麽p不是素数 : x" \; d8 {7 _4 a2 l9 V/ c6 K  Q: g8 P
    (5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 4 Z' l7 _  R8 P- C- Q6 Y
    (6) 如果j=b 且z<>p-1,不是素数
    * D: z4 O" k% d' E8 X9 o% s8 w$ R6 H- r
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。 / C$ V& }% R( Y0 _

    8 j2 g) H; q% ~5 `( a* Z实际考虑:
    . y1 ?. Z2 x( U6 l0 Z: d在实际算法,产生素数是很快的。 2 B; b" Z2 s3 l! v$ p4 F

    6 w) V7 P) ]' H0 H$ M' J; `' }2 y" x; n(1) 产生一个n-位的随机数p
    " H/ c3 D( p7 `2 n6 h(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    : r3 s) h( X: x* C6 J(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    0 S& s% |; Z! `) E  i(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 # c& N' w" h. [( B# L0 R
    1 ]5 p: V7 Z# s: O4 e, J5 _9 I8 o: {

    & ]+ o4 M) Q0 F4 s1 \2 I$ h9 L在Sparc II上实现: 2 .8秒产生一个256位的素数
    $ s0 x7 S9 }7 l  @! ]24.0秒产生一个512位的素数 3 r7 J# f7 y4 o. K' p( r: G
    2分钟产生一个768位的素数 . N9 y) R; T( L  J& R: ?
    5.1分钟产生一个1024位的素数
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-18 16:19 , Processed in 0.286794 second(s), 51 queries .

    回顶部