素性检验的算法,请问下面的代码对不对?publicBooleanwitness(BigIntegerbignum,ArrayLista){//素性检验原理:d=a^(m)modbignum,其中m=n-1,若d=1,则bignum是素数的可能性为1/2,若20个...
素性检验的算法,请问下面的代码对不对?
public Boolean witness(BigInteger bignum,ArrayList a)
{
//素性检验 原理:d = a^(m) mod bignum,其中m = n-1,若d=1,则bignum是素数的可能性为1/2,若20个a检验所得d均为1,则bignum不是素数的可能性为1-1/2^20
Boolean bo = false;
LinkStack st=new LinkStack();
for(int i4=0;i4<20;i4++)
{
//先求m(a的指数)并转换为二进制,每次st都要清空,所以放在循环里面
BigInteger m = bignum.subtract(new BigInteger(String.valueOf("1")));
while(m.compareTo(new BigInteger("0"))!=0)
{
st.push(m.mod(new BigInteger("2")).intValue());
m = m.divide(new BigInteger("2"));
}
BigInteger stlen;
stlen = new BigInteger(String.valueOf(st.length()));
BigInteger d = new BigInteger("1");
BigInteger j = new BigInteger("0");;
while(j.compareTo(stlen)<0)//先运算再++,小于而非小于等于
{
BigInteger x=d;
d = (d.multiply(d)).mod(bignum);
if(d.compareTo(new BigInteger("1"))==0 && x.compareTo(new BigInteger("1"))!=0 && x.compareTo(bignum.subtract(new BigInteger(String.valueOf("1"))))!=0)
{
bo = false;
break;
}
if(st.peek() == 1)
{
d = d.multiply(new BigInteger(a.get(i4).toString())).mod(bignum);
}
st.pop();
j = j.add(new BigInteger("1"));
}
if(d.compareTo(new BigInteger("1"))!=0)
{
bo = false;
//一次a检验不成便可断定非素数,跳出循环
}
else
{
bo = true;
}
st.clear();//清空为下次十进制转二进制做准备
}
return bo;
}
展开