如何产生素数

转载 2006年05月24日 14:39:00
Solovag-Strasson
Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数:

(1) 选择一个小于p的随机数a。
(2) 如果G_C_D(a,p)<>1,那么p通不过测试,它是合数。
(3) 计算j=a^(p-1)/2 mod p。
(4) 计算雅可比符号J(a,p)。
(5) 如果j<>J(a,p),那么p肯定不是素数。
(6) 如果j=J(a,p),那麽p不是素数的可能性值多是50%


数a被称为一个证据,如果a不能确定p,p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值,重复t次这种测试。p通过所有t次测试后,它是合数的可能性不超过1/2^t。

Lehmann
另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法:

(1) 选择一个小于p的随机数a。
(2) 计算a^(p-1)/2 mod p
(3) 如果a^(p-1)/2<>1或-1(mod p),那么p肯定不是素数。
(4) 如果a^(p-1)/2=1或-1(mod p),那麽p不是素数的可能性值多是50%

同样,重复t次,那麽p可能是素数所冒的错误风险不超过1/2^t。

Rabin-Miller
这是个很容易且广泛使用的简单算法,它基于Gary Miller的部分象法,有Michael Rabin发展。事实上,这是在NIST的DSS建议中推荐的算法的一个简化版。 

首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。

(1) 选择一个小于p的随机数a。
(2) 设j=0且z=a^m mod p
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
(4) 如果j>0且z=1, 那麽p不是素数
(5) 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
(6) 如果j=b 且z<>p-1,不是素数

这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。

实际考虑:
在实际算法,产生素数是很快的。

(1) 产生一个n-位的随机数p
(2) 设高位和低位为1(设高位是为了保证位数,设低位是为了保证位奇数)
(3) 检查以确保p不能被任何小素数整除:如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快
(4) 对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次 Rabin-Miller测试如果p在其中失败,从新产生p,再测试。


在Sparc II上实现: 2 .8秒产生一个256位的素数
24.0秒产生一个512位的素数
2分钟产生一个768位的素数
5.1分钟产生一个1024位的素数

密码学—如何随机生成大素数以及Miller Rabin素性检测方法

素数被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入质数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找质数的过程(...
  • qq_35116353
  • qq_35116353
  • 2017年05月01日 23:07
  • 2778

python生成素数的程序

python生成素数
  • jyh764790374
  • jyh764790374
  • 2017年02月04日 21:25
  • 1238

高效生成素数

#include #include #include #define MAX 100000000int main() { bool *tagArray = new bool[MAX+1];...
  • u014787464
  • u014787464
  • 2016年03月01日 16:01
  • 684

米勒拉宾大素数生成算法

package password;import java.math.BigInteger;public class BigPrime { public BigInteger p; st...
  • baidu_15113429
  • baidu_15113429
  • 2016年10月06日 16:52
  • 1754

检测随机数是否为一个素数的C/C++实现

#include #include #include #include #define TRUE 1 #define FALSE 0 /* Name: 获取一个素数 Copyr...
  • dujian996099665
  • dujian996099665
  • 2012年11月14日 12:36
  • 976

【Python学习笔记】用Python写质数发生器-筛法

def FindPrime(PrimeSeek,p_yield): p=[2,3,5,7,11,13] x=PrimeSeek while x
  • qmzn2008
  • qmzn2008
  • 2016年12月15日 11:48
  • 954

产生一个随机数组,并判断哪些数是素数

//判断随机整数是否是素数 //产生100个0-999之间的随机整数, //然后判断这100个随机整数哪些是素数,哪些不是? //并把素数和合数分别放到数组中public class Prime...
  • ilovezyr
  • ilovezyr
  • 2015年03月09日 18:14
  • 686

素数生成器

#!/usr/bin/python3 #coding=utf-8 __author__ = 'xdlove' '素数生成器' #奇数生成器(不包括1)生成的是一个无限序列 def odd_li...
  • ZSGG_ACM
  • ZSGG_ACM
  • 2016年06月04日 15:36
  • 1000

Java生成大素数

package util.encrypt; import java.math.BigInteger; import java.util.Date; import java.util.Random; ...
  • qq_26824159
  • qq_26824159
  • 2017年06月14日 09:19
  • 826

C++计算大量素数经典方法

C++计算素数经典代码,计算大量的素数时速度很有优势
  • Aleac
  • Aleac
  • 2011年05月18日 19:29
  • 1763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何产生素数
举报原因:
原因补充:

(最多只允许输入30个字)