QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4132|回复: 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
    & E( Q# E" j; |Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: 2 [1 {" i; {: l0 A. u
    & T% s3 ^& y* ?* y4 f6 s
    (1) 选择一个小于p的随机数a。 4 ?& N' S+ m: m5 v. T) _% I9 d/ `
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 ; n! H# v! r7 j$ b
    (3) 计算j=a^(p-1)/2 mod p。
    , K' B' f6 m2 V: @9 l( T(4) 计算雅可比符号J(a,p)。
    . ~! e5 j, E7 l(5) 如果j<>J(a,p),那么p肯定不是素数。
    ; V+ u" M: Z' D+ D/ q(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% + R+ X, ^, B. N: }4 P
    7 ]$ e9 a; h9 x+ {, ?6 H( Q
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
    . K# A, u  r6 C, n$ X+ E6 M+ q4 f# t- q: m- Q
    Lehmann   l* g. h" |' m; r% G: ^
    另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    3 M! T7 w* Q! k! l
    " T) Z1 W3 W7 P2 V2 e2 t(1) 选择一个小于p的随机数a。
    ! G% m9 l1 I* m! {8 |) t: n(2) 计算a^(p-1)/2 mod p , F7 o" o6 @) ]+ v" V
    (3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    $ f! }. P& }; s! R  T(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% 1 L! L! {% S  u6 J- O8 n# T- F+ S
    5 e+ F7 T' {1 |- c/ O* D3 G
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    ! h' _$ u" b7 F
    ! y6 b" W! Z. B# a) DRabin-Miller
    & \: o! _7 r% W5 }/ t/ l9 N1 r: A这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 , K' l' E# u; O( C1 N
    $ d  Z: c7 c7 x* x
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    " H/ i! C5 _0 s) J/ u: {9 p' s. I: f
    (1) 选择一个小于p的随机数a。 . L% e9 B) I  W/ o7 [8 k
    (2) 设j=0且z=a^m mod p : M0 q2 P. v. \) n9 Z
    (3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 # T) D7 g; |* I2 b9 j
    (4) 如果j>0且z=1, 那麽p不是素数
    8 M( G% U( q7 h5 r2 t% @(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    ' r) c8 e' t0 K* a! o(6) 如果j=b 且z<>p-1,不是素数
    ! l' m7 b$ p1 L7 p3 W! Q3 K* z  P9 ]( |( w* e2 c* T9 n7 G
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    1 v; m- r1 z& j* q$ i  A/ T" t  v
    1 s1 c: _$ p. w; n$ B! z实际考虑:
    , y4 |/ f. _/ w1 A; l+ K在实际算法,产生素数是很快的。
      C& E7 B* a! Q% d. a. X& Q' @8 s6 f7 h  N* d8 b, j
    (1) 产生一个n-位的随机数p , R$ c# E' m; Y1 \$ G; ^
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    & D; h3 U. J2 h1 c% w4 W(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    0 ]8 i2 v& k$ s- p+ m# P% p1 X! c(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 5 B5 N( L5 ^4 W4 E3 ?! |. Y! o- b

    4 ^7 Y4 f9 S6 E$ `, c9 ~' J9 L) q* j
    在Sparc II上实现: 2 .8秒产生一个256位的素数 , w& V; `6 Q% I: Y- m) g
    24.0秒产生一个512位的素数
    6 A* S3 q% l8 X' Q2分钟产生一个768位的素数 5 X: U' X1 J( B. m- G! W' Z
    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-2 03:05 , Processed in 0.437781 second(s), 51 queries .

    回顶部