QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4082|回复: 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
    1 O, R  r! O  ]3 @: DRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: . n& [! B7 u4 a" x* d1 C( ^

    " h7 X6 S: f3 o  T$ `(1) 选择一个小于p的随机数a。
    & a8 U& O, C; X) Q# J& `$ o(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
    & I8 z: Z8 T+ r  I2 r! b9 C- @(3) 计算j=a^(p-1)/2 mod p。
    % g$ V; K6 S  |(4) 计算雅可比符号J(a,p)。
    : {& L6 ~" D2 P; h(5) 如果j<>J(a,p),那么p肯定不是素数。
    ! O: v  y" n- g4 P( S( N$ o(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    ! G/ X  j' [2 a; t6 h" N% d" ^# e8 d5 w* z
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
    # K- d/ i' x' O2 ]6 \4 A
    + E. o4 j9 `6 A* J8 u$ [Lehmann
    * z, m$ W4 K' @, {, E另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    - L9 I# {6 q4 V" J1 K7 m
    * ^& q& g& w$ d" r+ Z(1) 选择一个小于p的随机数a。 7 K3 x. e& v; b" X* I
    (2) 计算a^(p-1)/2 mod p
    ( l+ l. o; B5 u7 w, ?4 P6 L9 B! u(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
      q: x$ u9 _+ [  e3 b. ~+ o(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
    * L- F' h: m- c+ d8 S% n* h& A/ p3 ^! i( G+ d6 \. I  K! E
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 7 x9 n! a4 S2 H/ d
    5 l2 H% n, l% k" ]+ y
    Rabin-Miller 8 B% i! j$ ~3 \! f: E/ [2 V! n
    这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
    7 j$ V! m+ ?. T; i' K( e
    * n& g9 G7 U- y, P$ B* t, X2 a4 o$ X首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 , h2 L! k6 {( i! d8 y* P

    ( ~$ o1 a  ]; H0 h2 ~  x(1) 选择一个小于p的随机数a。   Y% _: t: B7 T) X/ X/ k2 A  B! Q' r8 k
    (2) 设j=0且z=a^m mod p * T7 n* W# k: u" l: B2 t/ S
    (3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 ( f$ y& g8 h/ s4 b, Z# e6 [2 D4 d
    (4) 如果j>0且z=1, 那麽p不是素数 4 }5 {& d* m+ E0 C# H
    (5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    & n' I; `! y- E(6) 如果j=b 且z<>p-1,不是素数
    4 z% p+ L) g' d$ M' f( W
    6 T' e% q0 G. J0 x: M这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    , W& S7 H' k+ _' G) E
    ) m4 I) v4 i4 p3 Z6 y) s实际考虑:
    " z2 A- b3 E( O1 D5 ~在实际算法,产生素数是很快的。 ( Z1 t4 i6 D! f# @
    ) b8 l! Z; M# Q5 Z
    (1) 产生一个n-位的随机数p
    / M/ j2 }" t( c: U! u9 ~, n8 e& p(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    ! K8 y6 @* l& z4 i- o& o(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 1 r' ~- x6 G5 J8 w7 N8 `; G
    (4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 & L1 @, @' W  L3 H; L4 w

    2 @3 Z; M7 D& g9 e, c/ p, z& m
    : r$ b* _- h7 U8 f8 ^1 b# |在Sparc II上实现: 2 .8秒产生一个256位的素数 4 G( ~2 f- b' }1 ^3 Y
    24.0秒产生一个512位的素数 , u6 }9 k# c( L8 v4 \+ X
    2分钟产生一个768位的素数 ' C# p+ t. _& t
    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-4-20 00:19 , Processed in 0.436923 second(s), 51 queries .

    回顶部