java 素性测试_java 密码学 素性检验

素性检验的算法,请问下面的代码对不对?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;

}

展开

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值