QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4104|回复: 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 6 k: D) O  O$ B' x
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
    8 q  j3 F, b# U' m8 o% o  T; d0 u. i- d1 O2 ~6 n" C( ~
    (1) 选择一个小于p的随机数a。 $ w" j7 c' @% s
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 ! L& q5 K6 ~* F: L! h$ |: C9 d4 g
    (3) 计算j=a^(p-1)/2 mod p。
    . z2 Z6 y0 b+ z& Z, P: D6 X6 ?: x: X(4) 计算雅可比符号J(a,p)。
    - g9 V/ V% `2 u3 x(5) 如果j<>J(a,p),那么p肯定不是素数。 ' o# D1 T. z2 _' |  S, l( }
    (6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    & T# H. t& v, Y7 Z9 _: u9 P5 G. `+ S! X1 t0 F: E
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 . C: V4 z8 S$ ~% S2 N

    ) c( K, _- E) W7 p0 E& x& J9 ZLehmann
    6 A8 ~6 F6 D! j+ |另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
      @4 [* g& T& @: w2 m# Q' K7 |
    # J# H: ^7 x% }7 d( O5 {, K(1) 选择一个小于p的随机数a。 / q, U: m9 k: G7 s1 {# A
    (2) 计算a^(p-1)/2 mod p
    * P3 Q5 x9 G, S+ l  N(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    , N0 ?/ n% H: z% {2 P( _7 o(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% ) i$ {- `# L% N. P! {3 s
    % p5 ^- ~5 j* E# B* n3 O
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 % N; B( ]& d* S* w

    3 @8 {9 J( d# D) W* CRabin-Miller 8 O. j- L% M1 w$ p5 G/ e* V
    这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
    5 \. n# L4 U5 P0 |# T+ N2 z) R0 N* L% o% [* s  Z/ o2 [
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。   @3 C% O+ t3 o# Z' }$ A

    ! x/ k$ t- g5 M2 d7 j$ B(1) 选择一个小于p的随机数a。
    0 ^; T* o; k. ]% b* s1 r(2) 设j=0且z=a^m mod p
    , e  d3 K4 a' q3 Q(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 $ x6 G( p: x: c1 z
    (4) 如果j>0且z=1, 那麽p不是素数
    9 E7 k0 ?6 r% h& n1 X: |) P- \(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    5 R9 L' q+ T  _% a3 P& x(6) 如果j=b 且z<>p-1,不是素数 6 ^' _5 R3 Z% N& D' ]
    1 v+ ]( @- _) j
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    ! t0 p1 ~6 G& j
    ; F* F9 q2 F2 M, {实际考虑:
    $ i  C# J$ W( t: d% w9 V" J在实际算法,产生素数是很快的。 1 h7 J: @$ d  b1 r% ~. P
    1 [) O/ ]2 y3 {  k$ v. \
    (1) 产生一个n-位的随机数p
    6 @: d1 l8 [; O(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    / X3 E* B! w1 \(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    4 l- i1 ]! |) Q& `6 s: N(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
    8 p7 W% @' ]+ n2 H4 ]7 o/ V, W
    % I4 s7 ^3 E6 C* j* ~* \' X/ @% b8 s' Y$ o  e) W/ d
    在Sparc II上实现: 2 .8秒产生一个256位的素数 0 y, N1 {' K7 c
    24.0秒产生一个512位的素数 % \4 I9 ?+ Z; x) F' F
    2分钟产生一个768位的素数 ; p& m# A$ l, I# I: n9 g) 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-11 06:44 , Processed in 0.404987 second(s), 51 queries .

    回顶部