QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4119|回复: 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
    5 a- a! a2 K+ b; b& i% N2 gRobert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: ! A4 p: V2 B- y( C) U. g
    : v0 E; V( r3 M
    (1) 选择一个小于p的随机数a。 5 U) p; |* ]) n. n- u; R* s
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 + y" q$ Q! m7 Z+ V7 R" g
    (3) 计算j=a^(p-1)/2 mod p。
      ~4 s& K) Z% s( Z! S(4) 计算雅可比符号J(a,p)。
    1 c, A/ v. O4 I1 s4 v, b(5) 如果j<>J(a,p),那么p肯定不是素数。
    , `4 k/ ~# X9 f) N(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
    " C8 u' k3 V) }- e6 O8 T( v3 M0 Q
    数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。 ( j) F" Q' w" q* O% {) g; x
    4 e" w/ @1 A& x% o6 n6 W1 t0 ]
    Lehmann
    & ^( D; C# N9 M1 \* E' d6 {) w另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
    3 y6 {. l0 H# a$ H
    + w( A, l2 J) r(1) 选择一个小于p的随机数a。 : M- W7 h$ J3 Q
    (2) 计算a^(p-1)/2 mod p
    ! k3 |3 n. S& k+ ?; A$ \(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
      n9 Q- ?# p4 F" m(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
    * ^* |2 f% J1 x
    1 b0 h; C- i% x- u同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 7 w& X3 j! \( `9 ?  R
    4 ?+ j$ ^3 S3 J* E
    Rabin-Miller
    & I3 ?4 [# x/ G, M6 G2 r这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 . [" `2 T$ q& s; \9 U+ k/ {. c
    + x# l! y6 l* f# W! {# @' W' k
    首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。 + l) B: g. @5 A! Y/ _' q
    % L* c4 i/ m* l! [2 N& B
    (1) 选择一个小于p的随机数a。 6 W- ]  Y" [5 A9 H
    (2) 设j=0且z=a^m mod p 7 N! f% M4 u: G& {
    (3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    7 W+ n* M% v. f  s2 l(4) 如果j>0且z=1, 那麽p不是素数
    ( s8 X) m% Z* y' {/ p4 O" K(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
    + i# s2 U5 ]6 I$ _2 z# p" o: d(6) 如果j=b 且z<>p-1,不是素数
    8 x0 w( d* B8 s# J
    & c- w- z, M# x7 q+ n: P4 o这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
    4 Q* L  m8 Y- V' s! l7 ]" j: F
    实际考虑:
    $ i6 a  z7 w# a/ n6 o/ |在实际算法,产生素数是很快的。 & S7 R8 M7 S" Q! c0 g4 ?: L) y

      r' ?% P& Q. v& d6 t(1) 产生一个n-位的随机数p 2 E+ G  X# i4 Y8 `$ q/ L" c) ]% o* I
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) 8 M6 o( B% c; R7 W8 v' r2 C
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
    9 S/ |4 `0 I  v# d  f+ [0 J(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 ( n/ R& q) J, ]6 R; Z
    # t6 n& u( L$ `! E# Z! u
    . K. [- p# X; l+ Q* G4 M. w. }3 z
    在Sparc II上实现: 2 .8秒产生一个256位的素数 ) X" z3 H; y0 S' s9 C9 g; \' F! s
    24.0秒产生一个512位的素数
    + O0 g8 m% }4 W, ~2分钟产生一个768位的素数 * Z; R0 y2 |8 s) ?3 b6 m
    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-7-17 19:21 , Processed in 0.551301 second(s), 51 queries .

    回顶部