QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3853|回复: 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 4 D3 C# v5 n3 _
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: % _: _, a. B7 f. L9 {( K: z. r

    1 \  G1 Q7 S1 q: d(1) 选择一个小于p的随机数a。
    % D0 _( [& `8 ?& z# c: W(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
    8 A4 T# V2 q7 L& L  n! U1 K' G(3) 计算j=a^(p-1)/2 mod p。 * }/ C3 D8 g& R8 b& z/ d
    (4) 计算雅可比符号J(a,p)。 , C' D, o7 j% {6 K; g
    (5) 如果j<>J(a,p),那么p肯定不是素数。 9 ?, u2 }" Q/ g/ U
    (6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    ( O, N2 X- P8 O* U3 ^: g# z+ A  y4 ]. n6 c# y1 s+ |
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
    / e* q2 p% T' ?7 k1 q4 }' E  d1 w  D7 K+ A* h, D& z# v& y
    Lehmann * L. T2 s, q6 e5 O1 B
    另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    2 ]+ V2 {% L# u+ @) t, J* ]" _. M& ]1 ?/ w6 I" B; O
    (1) 选择一个小于p的随机数a。
    ; z( U0 m: k. O9 F. x$ K& o(2) 计算a^(p-1)/2 mod p 7 _- C1 V$ T; t) ]6 ?
    (3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    ( _4 K9 B6 z, ?5 U/ t(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% ! t0 [1 `, F& q6 U# b
    6 Q2 ?& I7 V0 M$ [* E2 ?/ V
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    + j+ @+ {; S8 N, V  p8 G; p& z1 ]; P9 Z  ]2 L$ P+ p: V
    Rabin-Miller
    6 C+ v7 P0 d) h这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 9 D2 e7 l  @0 O# o: A& l/ p3 `( b

    " o* Y4 z# b  Z8 D, [6 p2 Q+ Z首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    ' t+ I7 e: y" e; v1 L1 n- }; z2 N) o# G5 K" H
    (1) 选择一个小于p的随机数a。
    ; f" y& V  Z# g8 V6 v(2) 设j=0且z=a^m mod p ) o, s0 h7 r7 C% V9 X
    (3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 4 l) {& n( ^- \1 G+ k' }0 e* h
    (4) 如果j>0且z=1, 那麽p不是素数
    5 |6 g4 y" S) P/ ?9 L(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 , o6 f( e: h$ G* t% c' d, A( s6 }2 u
    (6) 如果j=b 且z<>p-1,不是素数 - h1 i+ F0 s% Q# h: l& b
    , N7 `: u4 @9 y' m- t, p$ q6 w8 W
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    8 ]9 l5 w1 p' y& M* I- t- p
    + t+ K( x9 N$ i" H实际考虑:
    " u* c7 [7 T+ l4 c  m4 X在实际算法,产生素数是很快的。
    9 D# t( d; N2 o
    3 B; E! a) U* j3 A' Z(1) 产生一个n-位的随机数p 7 Q7 o4 B" m+ j" D( l( U
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    ! N. x0 f' {# Z6 w. L& V6 L# g5 r  b(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 8 `' A+ H; B3 q3 X& H
    (4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。   r. f4 M/ |+ \' T/ m% L

    1 M; @5 g- a- Y0 {3 l$ S
    4 ~- |* t% ]. J( U! a8 T% o在Sparc II上实现: 2 .8秒产生一个256位的素数 # N8 W4 X, {$ I* Y5 x" q
    24.0秒产生一个512位的素数
    . [7 G6 Q' r7 w* v, A* }2分钟产生一个768位的素数 0 r7 {+ t, Y3 E4 j
    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, 2025-9-16 17:37 , Processed in 0.822101 second(s), 50 queries .

    回顶部