要点:
-
大整数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了,很简单,自己进行判断一下就好了====================================
我这里就不修改了!