QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4103|回复: 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 k% c6 T1 P2 u; ?- i
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: : H1 ~$ u6 y1 W8 c2 L

    6 T; D) g: l, p! \(1) 选择一个小于p的随机数a。 8 `7 b! z! M1 \2 E8 u/ \( N3 c+ L
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
      s3 [  \0 E- ~6 d0 K5 B* o7 a(3) 计算j=a^(p-1)/2 mod p。 % }  ?6 v  |! @2 u
    (4) 计算雅可比符号J(a,p)。
    6 R, V5 X' J0 C( {(5) 如果j<>J(a,p),那么p肯定不是素数。 9 Y# ]+ ?6 _' d) d! \! J4 N* ^
    (6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    : c# v2 z" j' F5 @. ^6 S5 ]& ]
    . {2 M; p" n; g6 V5 |5 c* o数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 % M( Z. U, B1 w$ E+ P
    ( x- b9 t) u; ^0 p& }; r
    Lehmann
    : H  }% x6 `2 p4 ?另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    : y+ ~; i# Y0 G7 G, p8 {/ C5 ]3 j! _7 ]! `  K
    (1) 选择一个小于p的随机数a。
    ) y& e5 v+ W: |(2) 计算a^(p-1)/2 mod p , }* W! Q/ w- c3 N
    (3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    + l, U  d$ R4 e! p5 N(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
    , ]  s5 i: T  [  }7 m8 ]8 f) U- i/ _3 {
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    5 N/ B( U/ i" F1 m% O& F: K" i- W- f5 ?
    Rabin-Miller
    # c7 g+ n/ w3 F# k# j4 l# ~, O+ D这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 2 f- x1 b: @6 x& Q7 |4 o7 o4 x+ x6 X
    - N; j: d7 P2 [
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    1 o, o1 g  e" a+ P/ J5 i
    - ~. H8 g! L! O5 e. J(1) 选择一个小于p的随机数a。 0 ]! z/ [& {: ^; I8 m3 L$ e
    (2) 设j=0且z=a^m mod p
    $ d9 B# h$ d$ i9 o, B(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    / n8 w; ^$ Z2 d* m! C(4) 如果j>0且z=1, 那麽p不是素数
    $ B5 y, Q* w, F5 ?) m(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    - v# i& [  |" U' E7 A(6) 如果j=b 且z<>p-1,不是素数
    3 {( l# J4 p* ?  o6 b
    # Y% l( ?) E3 s& r6 o这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    ' n5 d6 K; o3 C, D2 h
    # [; ]$ f; z- G7 e) a& `" i实际考虑:
    7 f* O7 p( N% y2 y! Y3 l在实际算法,产生素数是很快的。
    ( |6 \' Y+ ]' i* S. Z7 I& m/ G
    (1) 产生一个n-位的随机数p
    0 j: N) T% C( f$ f(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) : x" _6 }% X7 M( ^' x! d2 R4 y
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快   H. g0 v2 V6 m+ E; G3 i
    (4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
    / c- ~: R3 u3 a0 l# _9 Z8 S% H% v. n* W, w& O5 x

    % X, h+ y6 }) l2 l% ~9 e在Sparc II上实现: 2 .8秒产生一个256位的素数
    $ g+ _( _! k, K/ w24.0秒产生一个512位的素数
    6 X' i! g3 x- \6 L* c2分钟产生一个768位的素数 . d4 O5 S* T( E3 B3 O6 J3 Y2 [# f
    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-10 20:22 , Processed in 0.423239 second(s), 51 queries .

    回顶部