QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4127|回复: 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
    : ?! u, g  B0 ~  ]- IRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: * e( q* s- u: `/ F; d; n1 ?
    & `4 m$ y9 g- C; D" R5 a
    (1) 选择一个小于p的随机数a。 , R- ~0 k$ v0 s: e3 E
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 # U$ p1 i7 t# h% E
    (3) 计算j=a^(p-1)/2 mod p。
    9 i3 q5 e/ j0 d$ D. C0 L6 s(4) 计算雅可比符号J(a,p)。 4 i' X8 T0 x' }% C+ e
    (5) 如果j<>J(a,p),那么p肯定不是素数。 1 Z3 m0 p. H4 }( e3 o* B# c
    (6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% + Y5 R8 X; E1 T- j6 R& Q7 m/ A* ~# x
    7 j1 V9 _+ q$ R1 V1 Y  W
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
    % q" s7 J3 N& E7 y
    3 g- _( x) w* YLehmann . C2 S; G- j$ O4 T$ {
    另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: & D5 n3 g: }. k. k) S: L: M8 C7 N
    ' G& s, I+ R7 M* }
    (1) 选择一个小于p的随机数a。 % Q/ ?" @% m0 e( V$ y2 f4 o5 ?
    (2) 计算a^(p-1)/2 mod p
      o" ~" M# |2 ]6 X(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    $ l- c0 F/ a" W$ A$ Y- R(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% * m, ~; ^: y" M. S% d

    2 \" l& p4 v* g# q" ]( v# N同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 ) G  k  w  X5 c# ~0 d( V

    2 E- d6 N7 X0 C2 \" ARabin-Miller + c6 P- W$ g5 @" e6 k" Z
    这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 9 }$ K6 Z1 S6 R  F8 P% i9 j0 G

    4 C' U- q" j) d& @4 ^% f, q# |6 m首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    3 O. t; Y2 f1 F8 k6 [: W
    7 s# m# g# [3 V0 t% U(1) 选择一个小于p的随机数a。
    ) G& L/ R& r" q% t(2) 设j=0且z=a^m mod p
    6 s" J7 B/ Q+ w- c8 Q(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 2 Y) g. \7 o0 v/ {! B+ \- d9 d2 i
    (4) 如果j>0且z=1, 那麽p不是素数
    . ?! |! S( ~# f% U) d6 X(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    & L$ f5 I0 y' {0 [7 m# c(6) 如果j=b 且z<>p-1,不是素数 " S% J# N2 L3 \& {+ A# v( L2 v
    + h3 U# o) p. b0 v- n
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。 5 A% v5 k* v2 M. F

    9 c6 c6 I: r" \; t% h  ^实际考虑: % c2 x; P6 w" T6 E
    在实际算法,产生素数是很快的。 ) N/ `  i& I  o) }

    9 t8 E) M. S1 G8 s; h6 z3 @6 d) t(1) 产生一个n-位的随机数p
    + s) i5 `* z1 q. E; x0 W) g(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) : e9 o/ r) j9 k! d" @# ?1 X% U
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
      R' a6 Q4 k, j(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 - ^& E# [1 \; P' V9 m
    0 p0 W( O2 {! I3 S& c  g

    ; t& t, c) P; t" _5 P+ J# W在Sparc II上实现: 2 .8秒产生一个256位的素数 ) \0 P5 S; f* u8 f- S. x7 B
    24.0秒产生一个512位的素数 , R. }% e: \1 ~" G9 {5 y
    2分钟产生一个768位的素数 % x. N; _+ V" K
    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-9-1 19:41 , Processed in 0.419375 second(s), 50 queries .

    回顶部