static long[] exgcd(long a,long b){
/*
一开始先一直往前退,退到b==0的时候,a就为递归中途所有a b组合的最大公约数
result[0]记录gcd(a,b) 所以这个时候记录下来
ax+by=m=gcd(a,b) 此时对于这一条公式递归到了边界,即x=1,y=0,记录此时的边界;
return边界层exgcd结果给上一层,接受到后进行赋值
result[0] = temp[0];
result[1] = temp[2]; 因为这个地方根据定理 x = y^;
result[2] = temp[1]; 因为这个地方根据定理 y = x^-(a/b)*y^;
一直递归上去得到最终装有gcd和x和y值的long数组
*/
long ans;
long[] result = new long[3];
if(b==0){
result[0]=a;
result[1]=1;
result[2]=0;
return result;
}
long[] temp = exgcd(b,a%b);
ans = temp[0];
result[0] = ans;
result[1] = temp[2];
result[2] = temp[1]-(a/b)*temp[2];
return result;
}
参考博客:
java拓展gcd https://blog.csdn.net/zs064811/article/details/55000930
http://blog.163.com/dazzling_loving/blog/static/22793905620142594347246/
http://blog.miskcoo.com/2014/09/chinese-remainder-theorem
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1079
https://www.zhihu.com/question/30067108/answer/128720251