QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3855|回复: 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 : R% L; H6 T7 m9 ?
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: " U! h+ T1 Q5 V2 j0 W5 V+ I
    9 N; a' L( e8 M: o# Y
    (1) 选择一个小于p的随机数a。 3 m: ]$ Y9 P  P- p8 l% N
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 5 }6 M! e* W9 _2 v# v4 e
    (3) 计算j=a^(p-1)/2 mod p。 9 c( C8 x2 B* h$ `% _7 x% }% i
    (4) 计算雅可比符号J(a,p)。
    1 o' J" l: C* p(5) 如果j<>J(a,p),那么p肯定不是素数。
    8 j* X0 l" d  |& L2 A(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% . b4 }" O, S6 l: m# S: ]7 \
    $ E; E; P9 T+ M3 Q2 {4 ]) A
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 ( D+ F+ d( g+ z! U3 X% B8 W
    9 ?  R* s  s6 ]6 t) z7 O9 o
    Lehmann
    & X5 S$ F, p  r5 [另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    $ b; N  k" Y9 I5 z& e' k" I
    $ b$ K0 s% r7 }3 o$ y% d. u(1) 选择一个小于p的随机数a。
    + j  b4 i- G) j(2) 计算a^(p-1)/2 mod p
    4 @) ?; \/ A7 _3 B0 x: n  m  B(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。 " d. C; W- o' v- c
    (4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%   X; ?, \! ~8 d

    * C1 V8 D2 A* x. d& R4 F# B$ x0 R2 n同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 ' v/ A; a5 I" V( ]

    , P  o) g# w' \/ h" C- d* {Rabin-Miller
    8 X& F0 I& V' H3 c; H! K这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 . _& W6 H& k$ q( b& V

    # o. c  r5 z6 q3 v: ?0 i首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    8 _+ h3 r: Z' w, s2 m( K# V0 T1 a) X- U8 `* T+ W
    (1) 选择一个小于p的随机数a。
    - R# a/ i. Z  ~0 |+ c# f! c9 n( H(2) 设j=0且z=a^m mod p
    7 l- J# Z% g2 N(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 - G5 m5 o. A/ p( G5 [2 o& f" h
    (4) 如果j>0且z=1, 那麽p不是素数
    ( w  |1 T( M" F- G, o(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 6 X' Z9 U6 F8 ]0 u5 N
    (6) 如果j=b 且z<>p-1,不是素数
    9 l  O0 S4 k: ^: t# W, @1 T4 @- W) @' q% H- U8 [' J6 n
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。 - W+ F6 y$ ^$ t% g, Y! Q( a3 K3 f

    ; a* C% a2 F0 [; M& a& H实际考虑:
    . r- k$ E% k9 Q* k2 o) \9 H* l在实际算法,产生素数是很快的。 5 R8 m. K+ w5 G& w: j1 L+ z, k
    1 @- h$ H7 l1 q7 O$ ^2 J
    (1) 产生一个n-位的随机数p ' c: Y! k' |3 x8 x. a+ N: R
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
    , L3 ^$ }, |, V2 {( o, L# A(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    * M1 v  T6 L. c5 t# O% Y0 e(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 9 H* l( b. \5 @& U1 C1 @) q

    4 G, N4 `( S+ ^5 l" \( ?$ q
    3 h: r* E9 \0 L# W% w* H在Sparc II上实现: 2 .8秒产生一个256位的素数 6 |, b( M2 ?: H5 D% p
    24.0秒产生一个512位的素数
    0 C! i8 ~+ i! J2分钟产生一个768位的素数 % x7 i% c; g3 Q9 |& 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-17 20:32 , Processed in 0.428327 second(s), 50 queries .

    回顶部