QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4086|回复: 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 6 G* D7 [. {7 x0 ?% T: X6 A( B
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: 8 ^( S& x1 Z5 y+ q7 j

    + Q2 e' [! E8 m(1) 选择一个小于p的随机数a。 3 Y& p4 |2 j* u5 m& t! |
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 ) V) V$ `- e! g* E
    (3) 计算j=a^(p-1)/2 mod p。
    ; Z7 Y! \5 A' V; [(4) 计算雅可比符号J(a,p)。
    + N7 S; S& _5 x# {(5) 如果j<>J(a,p),那么p肯定不是素数。 1 ?8 f5 h8 c5 j. u& p( f
    (6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    " K1 n  \' a' [. \+ P$ l6 h. \& r- H  \- Z% E' e5 Y" ?% a
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
      l4 I' G0 u4 N' o  G. ]+ `6 w$ l/ K- g; D
    Lehmann
    5 f+ A4 ^! w2 D: x% k& ^8 H另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    ' c5 d- \( s0 T3 Z. Z
    ' P0 {+ u9 x& L6 d(1) 选择一个小于p的随机数a。
    & p2 ]# [2 s! i(2) 计算a^(p-1)/2 mod p
    1 b, O4 H4 e" {(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    0 q; A9 m# z# T% v7 @(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
    ' |8 Q" Y, h; \6 a7 A( J
    + P3 F' u3 I8 [& W同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    ' W+ m+ F% G& U. j+ {. j1 J8 t& r- R0 h3 }
    Rabin-Miller
      Q1 H& ]3 w5 `& n- B; v% j% |" ~这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 . d6 c7 L  }/ \: b
    ( U$ k5 `  u7 k$ [; d1 r
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 3 K2 q, I) X& U7 {, D: v# k

    & f, o3 g' z% e, W- \) G(1) 选择一个小于p的随机数a。
    " p- R) W) Z. G2 ]6 ?% R9 N(2) 设j=0且z=a^m mod p
    + _' y  U3 n( F(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    " \9 y, u! B; S  r& r. U( A9 B7 W(4) 如果j>0且z=1, 那麽p不是素数
    ( w2 n: _/ V) D5 ~( j(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 ) }; a$ Y- L% j$ o
    (6) 如果j=b 且z<>p-1,不是素数
    7 V& I& R( A- B/ m$ W5 n
    3 B6 r6 k2 X* u- x' [% N这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    & ~/ P9 n/ I6 k3 k# J5 {: w  i. Y
    7 w. @! O3 K% M9 W' j0 z实际考虑:
    7 ?; g: ?4 Z+ ?在实际算法,产生素数是很快的。
    & @" w, ~2 @( G; @4 c( `4 l2 N1 f7 _2 ^
    (1) 产生一个n-位的随机数p ) r3 K$ w7 H+ x9 ?: U
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) 1 ?% j, J( k2 q, K3 K1 i( V
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    / f2 h& k! Z/ S(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
    8 E% J' |  r2 t: F
      J+ ]- v6 k* ?: n& [: z! P( s, ~5 C# i2 _  Q1 c$ Z' m' M6 ?5 t
    在Sparc II上实现: 2 .8秒产生一个256位的素数
    5 b2 Y# j& q% z; S, L- o9 O24.0秒产生一个512位的素数
    1 ^' U  J9 j. e8 D. Y, b7 \2分钟产生一个768位的素数
    - N' h, v) u8 q0 X% Z5.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-21 03:51 , Processed in 0.629223 second(s), 51 queries .

    回顶部