QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4083|回复: 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
    + u( w" e2 e- O1 Y4 RRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: ; E2 H& w3 R% o) r1 ?, f3 M

    * y+ y4 j3 K, J  A(1) 选择一个小于p的随机数a。 % m! I" G# R5 L9 C! j. c
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
    2 c9 z6 h2 t# A(3) 计算j=a^(p-1)/2 mod p。
    . g, h' A  q+ z% `! J: ~1 p$ y(4) 计算雅可比符号J(a,p)。 7 o% d. A0 U8 {
    (5) 如果j<>J(a,p),那么p肯定不是素数。
      n# [1 D- _. r: G: v- k0 |  m(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% . j" S* K5 ?" @. J7 {2 h) f' I
    # z- {$ F4 o. O' K: J1 Y
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
    $ e- z5 v1 s, ^7 e* e; `& I! t4 k' d7 R$ _) |: m# \
    Lehmann
    7 J% p" G- D: C5 G另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: & V$ B9 _0 ?( ?1 b1 n, W" t0 Z8 j

    1 a* h. W# Z' `2 r, c0 e+ V$ X(1) 选择一个小于p的随机数a。
    ! {- z4 [# \# p) j& l# ^(2) 计算a^(p-1)/2 mod p
    / N8 x# t- S4 E- H3 e- ?(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    2 A. U: ^' }! m. H; Z  ?  M4 x(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% 0 H8 v  h+ m3 N2 S. d
    $ }( N2 N( W3 r5 y4 C4 O! H
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 2 y/ c/ s  R2 E- O

    7 R0 n4 h; I& J' r8 S/ ~1 sRabin-Miller : d; i! o( I; e+ t$ @& J# Y8 l
    这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
    , _6 h6 `5 c. D6 \$ N; ?+ W! f1 W5 m4 ~" K& e1 ^* v" W
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    ' Q6 R, G; _- M. }: Y  l) f$ s( F* W& D: U
    (1) 选择一个小于p的随机数a。
    + p# H8 a  l, e& b) E(2) 设j=0且z=a^m mod p
    + X# M) A, r4 K2 @) m( ~(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    9 h% i% w  l; m1 H' R( G6 v3 W5 F  D(4) 如果j>0且z=1, 那麽p不是素数 ) T6 r3 G( h4 Y1 e9 u
    (5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
      {& }  a2 D! h! B(6) 如果j=b 且z<>p-1,不是素数
    8 V$ x9 ^+ a2 X6 q7 F$ M, Y0 M8 F. ]$ A( J7 W% q* F
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    7 J, S# O/ [4 D) M; p$ M9 y6 n  [7 Y4 M9 \+ o# W* y
    实际考虑:
    9 |) t  p# a' m2 \7 B% b: Y在实际算法,产生素数是很快的。
    4 l3 {- A9 b9 V- R6 `7 C; T& W( a
    (1) 产生一个n-位的随机数p ) z) h4 V; O* e% Q6 k' r
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) " W  s- b( c9 T8 |- U7 r+ F  o* g# U
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 ) [' N1 m+ F; I& i8 D
    (4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
    , L9 l' N. L- J$ _/ ^( j5 K- Z# {8 y

    ' ?9 e& m+ |  ^- _4 [- c" {在Sparc II上实现: 2 .8秒产生一个256位的素数
    7 E7 z4 I8 V! b2 S24.0秒产生一个512位的素数
    . e; Q3 b* z2 y& n7 c2 S2分钟产生一个768位的素数
    + @: \% D: ~/ p! a: n% @. t5.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 10:49 , Processed in 0.375872 second(s), 51 queries .

    回顶部