数学建模社区-数学中国
标题:
[转帖]产生素数的算法
[打印本页]
作者:
lckboy
时间:
2004-6-7 11:54
标题:
[转帖]产生素数的算法
Solovag-Strasson
& R; x) a+ A+ @3 h
Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:
4 B j' y2 M4 l$ ]; o
" M( ?1 X; e! d @ V$ X
(1) 选择一个小于p的随机数a。
~& w7 E& t- j) k- C* @
(2) 如果GCD(a,p)<>1,那么p通不过测试,它是合数。
0 l9 a# O+ T3 t5 c+ [
(3) 计算j=a^(p-1)/2 mod p。
" T" p l1 l: X
(4) 计算雅可比符号J(a,p)。
% d8 o6 \1 K- @' r3 P/ A9 j
(5) 如果j<>J(a,p),那么p肯定不是素数。
: q$ x+ k* X: S" {
(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%
2 \ X- ^! F! W4 A2 c Q; J3 P
' C' M3 k: H8 r. v( R
数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。
; F1 x6 f( s; q5 d' T
- c+ v% b5 T; L5 C# Q# Y
Lehmann
" {$ o1 q! P( Z6 v' q" L1 O
另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:
5 _' d+ f& _. d: y- w
, O' w' L$ U8 P3 I& ?7 Y
(1) 选择一个小于p的随机数a。
* a1 L# q4 e2 A' |) {
(2) 计算a^(p-1)/2 mod p
n) d1 e+ B+ c0 c( f
(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
, f v: j6 W: v, [
(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%
6 B. `. e- K% c5 t ?" u& U1 V
+ D1 g/ m8 {2 T* x7 p+ X, T
同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。
! k) v3 L. X; E2 T3 \4 G. _
. S5 B& y( S0 C# W0 X4 Q, D
Rabin-Miller
! A/ f: p: B" C( g$ N2 s: Y
这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。
9 F$ o, c! l/ } ?. p
0 s( v# {( I: O: m$ W* P
首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
3 Q4 w: f6 t& V0 S
* z% w0 f: e" d7 i
(1) 选择一个小于p的随机数a。
0 m, D$ E2 {. A; e! k
(2) 设j=0且z=a^m mod p
0 u) E# w0 J; A& b9 ?: T
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
0 Q( r5 C" i! k6 q
(4) 如果j>0且z=1, 那麽p不是素数
@, d& ]* k: O1 `* B/ ?, D
(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
@) z- s0 A. ]
(6) 如果j=b 且z<>p-1,不是素数
' Z% o- ~) ?, p1 h
" N4 }3 y6 a$ E
这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
$ q) G" T# t" @8 }: A# v9 ^
/ q5 Z g, E6 l/ N3 }
实际考虑:
4 ?) c: w% v' \$ E
在实际算法,产生素数是很快的。
: K E# k! ~2 W- P9 E/ t0 H
& O# M2 [* ]8 @2 e- c
(1) 产生一个n-位的随机数p
, h. A3 Z8 G# ]( ~1 ^
(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
* ^# S- d& a5 V: W1 h* R
(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
4 |. ]# b$ x6 Y2 l4 a9 N
(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。
5 ]- Z6 j+ S4 F+ S, Z
" |& A" s: m! l/ K2 ]
5 A+ V6 F: x/ _/ l* P$ H5 g2 q
在Sparc II上实现: 2 .8秒产生一个256位的素数
! F! _, z8 [/ k; w. _
24.0秒产生一个512位的素数
) H5 N' _+ v Y7 E0 o
2分钟产生一个768位的素数
6 } H* q* T) g, D, [
5.1分钟产生一个1024位的素数
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5