QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4129|回复: 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
    & g/ r2 Q0 e3 B+ lRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
    1 Z2 H7 c; C; z3 C: h# K
    , Z2 P3 @/ S- a2 g: D(1) 选择一个小于p的随机数a。 : W3 r+ a' O% @9 E4 L8 p8 e2 p: T
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 6 w3 D! k* Q( N5 t0 i( B
    (3) 计算j=a^(p-1)/2 mod p。 " b1 X3 \; V- t8 D% s- j' C
    (4) 计算雅可比符号J(a,p)。
    - w) L' B6 o3 \- T(5) 如果j<>J(a,p),那么p肯定不是素数。
    1 _3 u( f( M) ]( ^+ a) b(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    * Q# c2 u: p& D
    " I# ]# U# Y- S. F数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 / X0 T$ U! r' H! D/ H4 ~& |% l

    % J8 g3 {+ d5 ~+ `/ w/ mLehmann : V# y. l# u5 W7 @6 t
    另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    5 r  S3 Q0 ]1 A% i3 r2 s! B- I0 }" P9 F
    (1) 选择一个小于p的随机数a。
    3 P: }/ q6 U' g) n% Y/ V- m! M(2) 计算a^(p-1)/2 mod p
    3 |& ]+ w; _/ }: b* Z6 z(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 $ i1 S! S) W: Z4 J1 S+ ], v
    (4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% 1 d7 R* m+ y# k! n0 ~' B8 u

    # w; W+ ]  u3 ], i0 s, C同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    ! j3 y6 a5 z1 |# ]- z1 }  M* A/ P
    - u! L) O8 X' H7 g2 sRabin-Miller / Q2 F9 ^, F/ o% C
    这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
    $ y8 n) D/ N: \. |
    : j3 }" `+ Z# ?6 @首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 , Q4 N4 E; D# x1 _9 n, s

    - e2 a3 S. N: L+ ?(1) 选择一个小于p的随机数a。 " v8 _1 q6 M2 S
    (2) 设j=0且z=a^m mod p , F) o/ o9 A$ T! q! `/ U4 }" Q
    (3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 4 d% h# y$ D) e+ t5 D) K) G
    (4) 如果j>0且z=1, 那麽p不是素数 ) g+ c8 `  m* R" p1 p
    (5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    6 V) K7 _$ Z3 X9 b(6) 如果j=b 且z<>p-1,不是素数 6 |4 @9 t- l; @: V$ K) i6 I4 D

    5 N4 s+ V1 @7 D" Q, s! n这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    , N8 {% i/ v( |  @. M- H6 m; L- F0 W/ i) U8 p
    实际考虑:
    ) |3 s; [# j/ g在实际算法,产生素数是很快的。
    / I& H0 ^9 {$ ?4 t( ]
    % m  b* x( m3 \' d(1) 产生一个n-位的随机数p ! H% `: _8 v& s8 t) u7 o# ~. O0 `
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    2 h" ~' Z' H, F/ K! M1 c(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 * A. Y: S0 m7 j5 G* r
    (4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 ! F% K$ F( M6 P( M2 Z, ~+ [2 X

    6 a: m6 u& v: Q& v' S7 x
    9 [# i7 o7 o9 I9 Y4 A+ `: J在Sparc II上实现: 2 .8秒产生一个256位的素数 ( R, M, e( E4 t4 @
    24.0秒产生一个512位的素数 ' V* u7 A# G% B  n6 H1 [
    2分钟产生一个768位的素数
    3 `: i% R  w" H1 ?' B$ w5.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 21:28 , Processed in 0.365365 second(s), 50 queries .

    回顶部