QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4080|回复: 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 $ X9 ^1 H- x, r5 x9 {/ E6 x" Z4 i0 p+ Y
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
    # f& D6 o1 l) K% G# `+ O: i2 `: c
    (1) 选择一个小于p的随机数a。 4 ]7 {+ x1 A! s( p- A3 d% ]
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
    . s% X2 O3 ~5 Y+ Y! P+ ?3 g( E(3) 计算j=a^(p-1)/2 mod p。 : F8 F/ U- w9 g* n9 y
    (4) 计算雅可比符号J(a,p)。 % T2 z$ D# W7 x5 ?1 H" Q
    (5) 如果j<>J(a,p),那么p肯定不是素数。
    ! D& R4 j! E4 g- V6 z, }6 k(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
      f( }$ u: h1 H4 c8 W& v; i. ^  a, C0 z/ U* U3 S) J
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
    ; S0 p) K" e- @; |2 k; F# I" W# L& d' J7 H( @+ r
    Lehmann
    % s, e; @; g( j4 K5 P1 ^% a3 h另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: % F! }  X' ], X  }2 S

    % h( r& C$ e) K5 _4 e(1) 选择一个小于p的随机数a。 5 D4 v5 B! `  `: E
    (2) 计算a^(p-1)/2 mod p 8 x7 D& ?" Y, v
    (3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    7 R* C7 t9 }7 M' }. P! J9 `(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% : n' v* d0 U/ @3 i7 d1 r" `3 q

    ' J1 w& u/ D9 M( C同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。   v3 q' B2 U5 c$ P0 s

    2 P$ B  y; C0 ?Rabin-Miller ( F- d6 ?) y' e- \( W8 t6 b! u8 y
    这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
    ( K0 C+ a4 U4 R  w4 k5 }1 s" ~% w7 s5 V! d  D( V0 [6 D4 S( a
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 2 a: y2 X  H/ v, `8 B3 D0 z

    0 r; C$ i# c  }7 n0 p8 _(1) 选择一个小于p的随机数a。 5 t9 u0 ]" P5 @9 k* O5 u
    (2) 设j=0且z=a^m mod p
    9 k( L0 O% U9 B3 L4 n' i# Z" k0 S(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 / u, ?  n) S2 l( u
    (4) 如果j>0且z=1, 那麽p不是素数 $ _4 G5 R. b% I
    (5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
      m/ Q: G4 e5 w0 E7 R1 x4 x% m8 ](6) 如果j=b 且z<>p-1,不是素数
    1 c2 e: m: Z+ X9 M" a1 L- Z) W! z7 m5 [" {$ N1 g" }
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    1 O8 x: u* b+ `8 C% K$ @
    9 _9 K0 [2 v! F, e7 I实际考虑: 0 q3 ]1 `- ]9 |- a9 W$ `/ `2 S7 `
    在实际算法,产生素数是很快的。
    . I6 |3 j" s8 M: ^& D" Y8 C
    1 N* A& P$ U4 z" |(1) 产生一个n-位的随机数p
    ; ^3 Y" q6 L9 z  @* x3 g" @(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) 5 I/ ], [6 N- _' l# f+ a8 a) L& k
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 . w3 I" Y* W7 ?% f- I: ~& |
    (4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
    & o; V& E- ?0 i2 u& v! O) Z
    ; Y+ T! A# `* e; ]1 O' \6 ~7 B2 r7 M' X/ f/ Q& y( z3 a8 \2 p
    在Sparc II上实现: 2 .8秒产生一个256位的素数
    , X) S4 R2 C2 `0 i9 j! F24.0秒产生一个512位的素数
    / y8 o6 o7 g  {3 a2分钟产生一个768位的素数
    * e: y7 ^: o/ P7 I, C# I  t5.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 12:38 , Processed in 0.478710 second(s), 51 queries .

    回顶部