因为自己也是信息安全专业的,老师留的作业编程实现大素数生成算法。但自己当时在网上了一下,都不太好,还需要自己修改。虽然java自带相关的类方法,但感觉还是自己写程序实现比较好。下面是自己写的程序,亲测能够使用。
思路在备注上有,这里就不多说了。
import java.math.BigInteger;
public class bigPrime
{
static BigInteger s_prime=new BigInteger("1");//定义一个BigInteger类型的变量s_prime,用来存放产生的大素数;因为构造函数没有无参的所以初始化为1。
private static final BigInteger ZERO=BigInteger.ZERO;
private static final BigInteger ONE=BigInteger.ONE;
private static final BigInteger TWO=new BigInteger("2");
private static StringBuffer []digits={new StringBuffer("0"),new StringBuffer("1"),new StringBuffer("2"),new StringBuffer("3"),new StringBuffer("4"),new StringBuffer("5"),new StringBuffer("6"),new StringBuffer("7"),new StringBuffer("8"),new StringBuffer("9")};
private static BigInteger primeList[]=new BigInteger[1000];
private static int k=0;
//////////////////////////////////主方法:1:调用构造方法生成2000以内的素数; 2:调用bigRandom(20)方法生成20位的随机大奇数; 3:removeEvenNumber(s_prime)除去偶数; 4:fermatPrimalityTest(s_prime)利用Fermat素性检验;
public static void main(String args[])
{
new bigPrime();
for(int j=0;j<10;j++)
{
while(true)
{
s_prime=bigRandom(20);
s_prime=removeEvenNumber(s_prime);
if(fermatPrimalityTest(s_prime))
{
System.out.println(s_prime+"是素数!");
break;
}
}
}
}
//////////////////////////////生成2000以内的素数并初始化primeList[1000]
public bigPrime()
{
String str_prime;
for(int i=2;i<2000;i++)
{
boolean flag=true;
for(int j=2;j<Math.sqrt(i);j++)
if(i%j==0)
{
flag=false;
break;
}
if(flag)
{
str_String(i);
primeList[k++]=new BigInteger(str_prime);
}
}
}
///////////////////Fermat素性检验
public static boolean fermatPrimalityTest(BigInteger num)
{
for(int i = 0; i < k; i++)
{
if(!((primeList[i].modPow(num.subtract(ONE),num)pareTo(ONE))==0))java生成随机数的方法
{
return false;
}
}
return true;
}
/////////////////一次产生一个0~9的随机数,并保证最高位不是零
private static StringBuffer randomDigits(boolean isZero)
{
int index;
if(isZero)
{
index=(int)(Math.floor(Math.random()*10));
}
else
{index=1+(int)(Math.floor(Math.random()*9));}
return digits[index];
}
/////////////产生大的随机数
public static BigInteger bigRandom(int n)
{
StringBuffer s=new StringBuffer("");
for(int i=0;i<n;i++)
{
if(i==0)
{
s.append(randomDigits(false));
}
else
{
s.append(randomDigits(true));
}
}
return (new String()));
}
/////////去除偶数
private static BigInteger removeEvenNumber(BigInteger n)
{
return (n.mod(TWO)pareTo(ZERO)==0)?n.add(ONE):n;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论