计算 扩展欧几里得算法 求1024位大整数a和b的系数x,y 执行时间

要点:

  • 大整数a、b均匀分布在0-2^1024次方内

  • 使用扩展欧几里得算法实现求 a和b 的最大公因子的同时求解 ax+by = gcd(a,b)的系数x和y

  • 同时观察一下该递归算法的运行时间


直接上代码:

import java.math.BigInteger;
import java.util.Random;

public class EEA {
	//扩展欧几里得算法求x、y
	static BigInteger x;
	static BigInteger y;
	static BigInteger temp = BigInteger.valueOf(0);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
			BigInteger a =  new BigInteger(1024, new Random());
			BigInteger b =  new BigInteger(1024, new Random());
			System.out.println("a="+a);
			System.out.println("b="+b);
			long startTime = System.currentTimeMillis();
			BigInteger k1 = eeaGcd(a,b);
			System.out.println("最大公因子是:"+k1);
			System.out.println("x="+x+"\ny="+y);
			long endTime = System.currentTimeMillis();
			System.out.println("Used " + (endTime - startTime)/1000.0 + " seconds.");
	

	}
	
	//扩展欧几里得算法
	private static BigInteger eeaGcd(BigInteger a,BigInteger b) {
		//最简单的情形
		if(b.compareTo(temp)==0) {
			x=BigInteger.valueOf(1);
			y=BigInteger.valueOf(0);
			return a;//最大公约数
		}else {
			//一般情形
			//a-(a/b)*b
			//a/b = a.divide(b)
			//(a/b)*b = a.divide(b).multiply(b)
			//a.add(a.divide(b).multiply(b).negate())
			BigInteger r = eeaGcd(b,a.add(a.divide(b).multiply(b).negate()));
			BigInteger t = x;
			x = y;
			//a/b = a.divide(b)
			//(a/b)*y = a.divide(b).multiply(y)
			//t-(a/b)*y = t.add(a.divide(b).multiply(y).negate())
			y = t.add(a.divide(b).multiply(y).negate());
			return r;
			
		}
		//时间复杂度:O(lgb) 
	}  
		
	
}

运行情况:

备注:

  • 其中用到了很多大整数的构造、计算的方法
  • 看不懂的可以自行查看JAVA API中文版
  • 下载链接链接:https://pan.baidu.com/s/1e2mWLSoYcsiwXraI-WAujQ  提取码:2o2z

===============突然发现,我默认a>b了,很简单,自己进行判断一下就好了====================================

我这里就不修改了!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值