QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4105|回复: 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 7 X* K9 Q* K. l0 `: u; Q
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: 3 \& d8 W/ i; R

      y1 f  v# M3 K: h, w(1) 选择一个小于p的随机数a。 , V5 y) x/ s: w# Y0 e- v
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
    ) s1 X! D7 M3 k* n5 G! @(3) 计算j=a^(p-1)/2 mod p。 ; g8 r# S5 M. {  O6 K
    (4) 计算雅可比符号J(a,p)。 7 j4 n8 d5 a( i# u; e
    (5) 如果j<>J(a,p),那么p肯定不是素数。
    - u5 G3 A, [+ W( M7 d(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    3 @4 g: {2 s- ^9 @( `8 g# q) p3 F' O% @: m  p+ L1 j+ M& N- H6 R. n
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
    0 ]: s! ^1 p, g0 q
    # u5 Q/ a2 Z* f3 a$ F9 }Lehmann
    ! e6 {3 X6 i! Q另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    ' H. O3 H: e/ B. H; ~" E' _* N) Z/ u- v- g5 [+ c. B( e
    (1) 选择一个小于p的随机数a。 0 |+ G  R4 }1 y7 @
    (2) 计算a^(p-1)/2 mod p
    7 i5 _) `2 x4 c(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 ( N3 d; s+ n7 ]
    (4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% ! n  c& X7 s. x2 W7 m" F

    & x+ Z8 }) `5 f1 w$ Z同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    , v. n: c0 Y& q( e
    1 D; p4 w) Q* c5 x% Q2 O9 M. m! KRabin-Miller 1 s6 a' K, k, M$ ?5 C. C: M4 ~$ i
    这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
    5 Q- ^! j8 Y0 H( `0 b5 [6 `- Y
    6 o6 f& q# Z. ]  h' ^9 _& `5 v; l首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    . F7 |1 g" x$ F( `- h+ Z+ t) `  a
    (1) 选择一个小于p的随机数a。 # f; ?2 W- i4 h" @( Q
    (2) 设j=0且z=a^m mod p ! r+ B0 v/ Q  g1 ?* ~
    (3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    " G( ?9 k0 C+ ~' x' r" j(4) 如果j>0且z=1, 那麽p不是素数
    ; L8 `; k2 @* r% p0 V4 x. j(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 5 J6 D  _3 c) U7 V; x# h2 x+ R; H
    (6) 如果j=b 且z<>p-1,不是素数
    8 m( P" {( n2 G/ p3 ]( {. t5 x
    5 \$ S7 E9 W+ D' N& @这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    4 I' d: Q7 o% C% D4 J2 R0 Z2 q2 I7 o$ O
    实际考虑:
    : a! |0 U4 s' P5 u在实际算法,产生素数是很快的。 2 e3 c" d3 a' Q" r( K* J' |
    $ ]7 _3 g9 E  ~! A4 {8 R( U0 w
    (1) 产生一个n-位的随机数p
    $ ]4 o1 E/ u$ p5 |! f(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    4 L# D/ t; s/ D( \$ e3 n! R(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    ) h6 H3 _; D8 M7 q9 |# e/ P(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 9 D# S$ N: Z0 i5 z) F7 @, c

      G* ^4 G1 d0 I& i4 j1 t8 @7 x. u! I8 V
    在Sparc II上实现: 2 .8秒产生一个256位的素数 " m0 ?! }2 F" |; k  s' T
    24.0秒产生一个512位的素数
    & H6 j0 B; X* S7 W( l% I+ v  p3 {2分钟产生一个768位的素数 5 R4 b7 e3 }. z2 A6 j
    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-6-11 09:38 , Processed in 0.410717 second(s), 52 queries .

    回顶部