/**
*
* @return int
* @tags @param m
* @tags @param n
* @tags @return
* @todo 【方法二】利用辗除法
*/
public static int gcd(int m, int n) {
while (true) {
if ((m = m % n) == 0)
return n;
if ((n = n % m) == 0)
return m;
}
}
4.时间复杂度
辗转相除法的运算速度为 O(n),其中 n 为输入数值的位数。
辗转相除法处理大数时非常高效,它需要的步骤不会超过较小数的位数(十进制下)的五倍。加百利·拉梅(GabrielLamé)于1844年证明了这点,开创了计算复杂性理论。
求不定方程的一组整数解方法
[注:以下出现的qi,ri括号中的是下标,gcd(a,b)为a,b的最大公约数]
辗转相除法可以求出特定条件的不定方程的一组整数解。
设不定方程为ax+by=c,其中a,b,c为整数,且 gcd(a,b) | c
a,b辗转相除的算式为
b=q1 a+r2
a=q2 r2+r3
r2=q3 r3+r4
...
rn-2=qn-1rn-1+rn
rn-1=qnrn
其中rn=gcd(a,b),不妨令b=r0,a=r1,rn+1=0
第i个算式为
ri-1= qi×ri+ ri+1
所以ri+1= ri-1 - qi×r(i)......(1)
用公式(1)可以得到rn=gcd(a,b)关于a,b的线性组合sa+tb=gcd(a,b)
所以不定方程a×x+b×y=c的一组特解为x=s×c/gcd(a,b) y=t×c/gcd(a,b)[1]
举例说明
例如不定方程为326x+78y=4,求出一组整数解x,y
求(326,78)的算式为:
326=4*78+14
14=326-4*78
78=5*14+8
8=78-5*14
14=1*8+6
6=14-1*8
8=1*6+2
2=8-1*6
6=3*2
所以
2=8-6=8-(14-8)
=2*8-14=2*(78-5*14)-14
=2*78-11*14=2*78-11*(326-4*78)
=46*78-11*326
即2=(-11)*326+46*78
所以4=(-22)*326+92*78
所以x = - 22, y = 92是不定方程326x+78y=4的一组解。
6.相关原理
两个整数的最大公约数是能够同时整除它们的最大的正整数。
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);
因为252 ÷105 = 2......42,所以(105,42)是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数变为零。这时的除数就是所求的两个数的最大公约数。由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如21 = 5 × 105 + (?2) × 252。这个重要的等式叫做贝祖等式(又称“裴蜀定理”)。