QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4130|回复: 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
    ) q! b6 n! F: M7 [6 }Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: 1 w6 E; j! i) h0 m+ X

    " J. Y; i8 z( q7 c6 @8 w* J(1) 选择一个小于p的随机数a。
    * I! y& z' d) s1 ]0 w(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 & j1 g' e/ j. }8 F* G# u
    (3) 计算j=a^(p-1)/2 mod p。
    / ^0 i: o( ^( H6 C1 C% Q* _! U(4) 计算雅可比符号J(a,p)。
    * ~- M. o  f  x& N  N; I(5) 如果j<>J(a,p),那么p肯定不是素数。 $ `' S+ ~) V$ [, B2 z
    (6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% 3 X: R; K5 _0 l

    , M) c# W+ D2 ~数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 3 ?' w/ `7 l4 M
    ) f7 m5 B, x: Z3 v7 M! n3 ^
    Lehmann
    / X( e+ u2 v1 {- K另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: & _2 z: z+ X+ M+ ^  p* w

    3 x$ ?& U0 Z5 O7 n(1) 选择一个小于p的随机数a。 - f! x0 v5 D, L' W) j
    (2) 计算a^(p-1)/2 mod p
    * Y) S6 H& R+ _+ y: A(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    & X- X2 q" Z) ]- w(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% : t9 n$ b$ x( X# i# c
    $ L# `% T: w9 T6 C( a/ t
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
    - C- c* E- p* X! w# L: r! N, |# |9 Q8 P" ?" t0 |4 W# {( ?9 M) z
    Rabin-Miller
    6 V9 ^2 g: P) B7 P; D5 a7 d* Z% z& \这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 - I/ h, V8 t6 h3 z
    2 p$ H3 \# @( R! T
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 . a- u4 r3 l9 M$ Y; K; P
    # C7 ~: w, J: Q1 n0 o, v
    (1) 选择一个小于p的随机数a。 . W% |, }  ^$ Q& T  U: y7 Q
    (2) 设j=0且z=a^m mod p
    8 E! ]- G; O4 f7 o6 V8 w* U(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数 ) s  B$ i) F% P, E5 u8 `
    (4) 如果j>0且z=1, 那麽p不是素数 . r& B$ f# O1 j8 U4 u- z' w" W; Y* x
    (5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    - q. c+ S3 k# f' O3 a# @(6) 如果j=b 且z<>p-1,不是素数 + e& a/ |7 `* c) G; ~2 H" p5 }

    , f8 m* O+ d& w* S! ^这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。 0 H! u3 {: ?: T

    " q, F% V# Q; B# S! v  s' M实际考虑:
    : k: `/ Z# @& Q& M9 \. ]1 @在实际算法,产生素数是很快的。 6 W  r' C/ Y7 P5 p
    ! D* k  u5 [, U# Y' I3 t
    (1) 产生一个n-位的随机数p 3 L5 j- u  i- S3 c1 Q4 `
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) # l- u' S/ }* i' A' O  T6 r) Y
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 / z! p3 M% C3 w
    (4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 : x- `. r# u9 h9 H
    6 n' }) Z' X1 `0 E

    5 [  x9 m9 D/ o( \在Sparc II上实现: 2 .8秒产生一个256位的素数
    9 |) H! t2 D9 i24.0秒产生一个512位的素数
    4 l/ r3 b' E  ~( b" N, v. `2分钟产生一个768位的素数
    2 w* Q$ C5 b) y$ Q6 Q, c. A5.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:42 , Processed in 0.401177 second(s), 55 queries .

    回顶部