QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4128|回复: 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 $ i) ]* z0 T% ?8 G9 }( [) A
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: & p3 `0 E2 S. a6 W5 q) P

    ' s2 c# S' {6 @) X$ v4 \+ M5 q3 i( [0 _(1) 选择一个小于p的随机数a。
    4 r: n7 s1 r$ t(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
    9 F7 ?8 T! o6 w(3) 计算j=a^(p-1)/2 mod p。
    # v7 k3 R. M2 l& E(4) 计算雅可比符号J(a,p)。 * m" K: I& ~$ M5 s2 Q! Y. m
    (5) 如果j<>J(a,p),那么p肯定不是素数。 5 C% {* ~+ \3 L3 U7 z: {2 {
    (6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% 6 v" j; X. b  L7 H, `

    0 b  w! v6 _+ p1 u$ A0 c* l数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 . o) q1 e& ~5 [9 F

    & J# f3 L& E& Y' s! f# n5 ELehmann ( w" T& Z: m3 S9 W- g4 e$ c+ b
    另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    " h  S6 i4 d% }0 L5 m9 W9 q9 {
    ) v5 W. h% x3 c! F(1) 选择一个小于p的随机数a。 ! Y- o0 R5 j% ?% M
    (2) 计算a^(p-1)/2 mod p
    - F! d$ l0 E( `* u(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 % K  P( {1 O& A3 b
    (4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% * W& i. v7 Y6 R. D4 C! G' B

    ; R3 M( }0 p9 s) ^同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 ! N6 p5 n3 k8 [  B$ |; Q
    ' k( P# a% B4 F2 J3 I
    Rabin-Miller
    ) T/ ?1 w! Q8 r7 C' u' I. f这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 5 d0 i1 k; }" U, r
    ) y8 s+ R9 N' R2 X) _! H- m" n: S
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 4 `2 F* s; s5 M$ t. v  X" q# W

    ) U: P, P# P. l; {, P: e) F(1) 选择一个小于p的随机数a。
    ! e$ L# o, t( k# {9 Y4 e, l( p(2) 设j=0且z=a^m mod p
      A) P' U: w) T9 p' z(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    6 R3 g5 i' S8 A% Z; \8 t- q(4) 如果j>0且z=1, 那麽p不是素数
    8 I% H7 ?/ b- L. H( ]7 o3 P(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    6 V1 q" r, s0 t1 a. ?( s+ V5 z(6) 如果j=b 且z<>p-1,不是素数 ' |% x  ]7 I* i

    0 Z  @9 X( e! e这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    2 V# G/ C3 K7 X; |6 e: U
      T9 i6 p4 o# e* T( g实际考虑:
    / v' U0 Z0 r  l4 u, H( L  d在实际算法,产生素数是很快的。 % z* x& B1 O2 _) D. T7 e/ ~' `  _; ~
    ; i2 s/ X& z' p  ]. L1 X" Y
    (1) 产生一个n-位的随机数p $ ^1 I9 O; I& E+ V  |! ?
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    ! G7 t( K! J5 c(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    . T  \  R' ]+ D9 a(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 + j$ L+ w/ ~7 `

    : X$ n0 f1 n; ~% S
    7 P! b5 g& w. X  L4 i在Sparc II上实现: 2 .8秒产生一个256位的素数
    & h  M1 V$ N3 i! T% U24.0秒产生一个512位的素数 ) I$ l1 O& w  G0 ]* x6 Y
    2分钟产生一个768位的素数
    & r: }3 _$ T9 K4 H5.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:26 , Processed in 0.437302 second(s), 50 queries .

    回顶部