QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4100|回复: 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   q4 C* H" M3 n
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
      U3 {+ c, w5 A9 E* n5 E) A% C% Q: e1 P
    (1) 选择一个小于p的随机数a。 6 \" _9 X. b/ ^; w$ A& ]8 n
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
    7 k4 t( o1 j+ H1 v(3) 计算j=a^(p-1)/2 mod p。 8 {" |/ ?; [/ ?* K" T
    (4) 计算雅可比符号J(a,p)。 + N  P& b3 ?: D0 ^6 i% o
    (5) 如果j<>J(a,p),那么p肯定不是素数。
    ) a) e) @4 j+ p% ^6 w9 m(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% / H( |6 R. ^4 G

    + M( Q. g. `4 Q; N, i. y9 M, d- g数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 ( P9 W5 _# F2 t& s* f5 w( `

    : R: W* \& F) LLehmann : t) ?! q# U6 w0 z# k5 J: v# z0 R
    另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: , x2 c7 ?/ N# V( j  W9 a  [" x

    $ i0 ~0 F( _9 C: L  I. D7 |+ i(1) 选择一个小于p的随机数a。 / c* m& k& b( e  E2 f3 p7 E
    (2) 计算a^(p-1)/2 mod p
    ) p/ v$ G3 \' H2 _(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    + g; H0 ^  y! O& d; u- A5 X( i; T) Q6 V(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
    7 O& C% P* }, z' `% W' p1 h* B5 ?3 y$ R6 i3 H8 O
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    ; j9 e" c: f, a7 C6 _0 M2 B2 M$ W: i
    & l+ O; y( _4 b' t" ]9 aRabin-Miller - P4 R4 L5 q7 J9 v* Q! [- J  V. m
    这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
    1 L$ U, k* w9 `, b
    0 t& ?* R# g9 A+ w% V8 H" F1 ~首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    5 E7 G  Z0 e2 i" l9 m3 a) }0 z- G7 D; Q& p% f
    (1) 选择一个小于p的随机数a。 9 s4 u; d4 D% e2 ]- m* W1 p3 N
    (2) 设j=0且z=a^m mod p
    - u3 U8 G! A3 z& F+ b" j( F(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    ! w! z8 |: K4 h4 T4 j(4) 如果j>0且z=1, 那麽p不是素数
    . d+ N- ?& R% ^. x(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    * g  s4 x$ D" B: i+ D2 J  h(6) 如果j=b 且z<>p-1,不是素数
    ' A$ _9 ]- c" S
    4 u- L5 A: ]* b. j( ]3 Y0 Y% i这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    + z8 O0 j$ c  x# t3 A# m4 R0 X1 t/ @3 r/ V. H% ^) O
    实际考虑: + U8 B/ _+ M, P5 J' A
    在实际算法,产生素数是很快的。 8 O' |- G1 f( m8 N3 c" Y  P

    . e6 j, E8 ]- q, U: R3 c(1) 产生一个n-位的随机数p " m1 y; I/ o( _
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) % z) h0 W) @! n  F
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    ( a$ B$ R) i! X! K. I/ g2 o5 E(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 ; u' b) d+ E+ |* K1 d, Z1 M) t

    ! d& Q4 r8 I4 y* o6 U0 O5 z# d9 S2 B) w# r1 e8 [; A
    在Sparc II上实现: 2 .8秒产生一个256位的素数 ! \9 L& b$ M. W2 Q2 C3 K! E% v
    24.0秒产生一个512位的素数 - k- x5 r. ^  z6 T  y
    2分钟产生一个768位的素数 . w1 N) z% r3 _7 s6 b8 X! _$ 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-2 14:30 , Processed in 0.545225 second(s), 51 queries .

    回顶部