java 素性检验算法_用java实现fermat素性检测算法

用java实现fermat素性检测算法

用java实现fermat素性检测算法

问题提出

93ef7e790fe5a0631f5a18960ef4d486.png

e393b11d272f6dd444f03de1042d94f8.png

问题思路

问题思路在图片中已经很明显了,为了解决较大数字的素性检测,我们采用Java中的biginteger类,可以处理较大的数字,废话不多说,直接放源码。

package com.demo;

import java.math.BigInteger;

import java.util.Random;

public class FermatDemo {

//给定一个积整数m,且m大于3

private static final BigInteger m = new BigInteger("277",10);

public static void main(String[] args) {

//安全参数k = 4

int k = 6;

int k1 = k;

int count = 0;// count用于统计是否每次可能是素数

Random ron = new Random();

double p; //m为素数的概率

while(k > 0) {

int a = ron.nextInt(FermatDemo.m.intValue() - 2) + 2; //随机生成整数a,取值范围在2到m-2之间

//int a = 4;用a等于4验证

if(FermatDemo.gcd(BigInteger.valueOf(a), m).intValue()==1) {

BigInteger r = FermatDemo.qiur(BigInteger.valueOf(a), m);

if(r.intValue() == 1) {

System.out.println(FermatDemo.m.intValue()+"可能是素数");

count++;

}

else {

System.out.println(FermatDemo.m.intValue()+"是合数");

break;

}

}

else {

System.out.println(FermatDemo.m.intValue()+"是合数");

break;

}

k--;

System.out.println(a);

}

//重复上述过程k次,每次得到m可能为素数

/*System.out.println(count);

System.out.println(k1);*/

if(k1 == count) {

p = 1 - (Math.pow(0.5, k1));

System.out.println("m为素数的概率为 " + p);

}

}

//求最大公因数函数,参数为两个大整数,返回一个大整数。

public static BigInteger gcd (BigInteger a, BigInteger b) {

while(b.intValue() > 0) {

BigInteger r = a.mod(b);

a=b;

b=r;

}

return a;

}

//计算r

public static BigInteger qiur (BigInteger a,BigInteger m) {

//BigInteger r = new BigInteger("");

BigInteger r = (a.pow(m.intValue()-1)).mod(m);

return r;

}

}

代码优化

可以让用户输入所需要的安全参数k

Scanner scan = new Scanner(System.in);

int k = scan.nextInt();

运行结果

c1bee2562aa0b4ba0c46b74ad0714a0b.png

希望大家多多指点,共同讨论,一起进步

用java实现fermat素性检测算法相关教程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值