QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4118|回复: 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 " Y8 i- S4 z6 R1 B6 _7 |/ f
    Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数: ' m5 n+ d, {' R! Y$ C
    # d; I! D7 M  x3 e; ^6 n
    (1) 选择一个小于p的随机数a。 8 r& M+ ~; S, {* U
    (2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。 ' Q$ @( B4 t' f/ o) }7 u" S
    (3) 计算j=a^(p-1)/2 mod p。 ( Q7 K4 t0 ^# ^: |+ N  C) L
    (4) 计算雅可比符号J(a,p)。 ; |! L  a8 N& Z+ t
    (5) 如果j<>J(a,p),那么p肯定不是素数。 * N' X4 V; B6 ]- F4 C! p! o$ S9 S* k2 `
    (6) 如果j=J(a,p),那麽p不是素数的可能性值多是50% $ R- `! b5 T$ R% d2 C$ c

    3 w/ {* W% h8 s3 r2 n, E% F- J数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
    $ n& z( u" c! H: M, S% i! E
    % R+ {( n) j. h- S8 a  W2 MLehmann
    . z! h* _$ l7 X7 u  d( q8 X- |另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法: 5 [  m2 ?: ?. v3 |5 c0 v
    0 R3 Y6 Z9 U0 Z/ U/ f) ~
    (1) 选择一个小于p的随机数a。 ' D: w; u" j' I1 @1 p0 J  X
    (2) 计算a^(p-1)/2 mod p ( |0 C6 r4 N/ W& V
    (3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
    4 F3 \: O4 |8 p/ x% I  ~(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50% % W3 ~: A4 n) B
    / [' C, T5 M2 y2 P8 G" Q) I
    同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。 - v. X# w% t) e% p: R2 x
    8 B+ S! c7 U& ~  U; d' c
    Rabin-Miller
    " f5 M* m% Q- ]6 @$ S8 ?这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 ' `) u9 u( D, W: b* v2 a7 c9 V

    : D7 W% t. n8 p3 {) z. f首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
    ! {& O, T6 v7 W5 O4 L1 l' p
    # Z/ x2 A/ Z4 E+ D0 ?+ |* i(1) 选择一个小于p的随机数a。
    5 m0 b, I4 k) C6 J) n: J(2) 设j=0且z=a^m mod p
    / ?- J4 k8 X; c  l1 a! a(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
    6 a1 F- j+ y$ g(4) 如果j>0且z=1, 那麽p不是素数
    + |; r1 |* w: M0 Z- {# P* Q4 v(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。 1 e( A3 s& W; f& K( p0 Q
    (6) 如果j=b 且z<>p-1,不是素数 2 j+ h6 z# r2 P; d3 w7 u
    & F+ e/ S4 ]/ \6 h
    这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。 ' D0 W+ M! ?3 f; [
    * i0 _3 T7 o  ~. A9 L
    实际考虑: # W% v8 `. o/ w* Q9 W0 o% q
    在实际算法,产生素数是很快的。
    ' v! q/ a: I$ O; e5 q7 n2 j
    5 h* x$ O6 h7 b" U(1) 产生一个n-位的随机数p ( U- X$ [1 d" o9 s$ n
    (2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数) 0 E/ N+ E, x' @* {
    (3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快 ) x& _4 Q' G+ k/ M7 ~7 ^7 ]6 u" F5 k' T
    (4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。 ! T( C" A% a. s' i) G
    . J5 p6 u) h2 O2 t$ @

    5 L2 Z5 N- P8 C- G在Sparc II上实现: 2 .8秒产生一个256位的素数 3 u8 U6 S  R! q" s% A. z
    24.0秒产生一个512位的素数
    : _6 ?9 M/ P  |% B1 S2分钟产生一个768位的素数 5 E7 B! o" S: g* T6 h
    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 18:13 , Processed in 0.583591 second(s), 51 queries .

    回顶部