欧几里得算法(蒟蒻版)
上课写的,比较弱.....
补充:x | y表示y能整除x
定理1:gcd(an,bn) = n*gcd(a,b);
可以这样想:因为gcd(an,bn)必有一个n的因子,所以可以把an,bn提一个n,为n*gcd(a,b)
推论1:如果d | a,d | b,则d|gcd(a,b)
证明:d | a = x,d | b= y;
gcd(dx,dy) = d*gcd (x,y);
gcd(a,b) = d*gcd(x,y);
d | gcd(a,b)=d | d*gcd(x,y)= gcd (x,y);
∴d | gcd(a,b);
推论2:gcd(a,b) = gcd(b,a mod b)
证明:设gcd(a,b) = d;
则d | a,d | b;
a mod b = a - qb
∴d | a - qb(这应该明显),d | a mod b;
∵d | b , d | a mod b
∴ d | gcd(b, a mod b){根据推论1}
∴gcd(a,b) | gcd (a, a mod b)
同理可得:
gcd(a,a mod b) | gcd(a,b)
{
∵ gcd (a,a mod b) | a,gcd (a,a mod b) | a mod b,a = qb+a mod b;
∴ gcd(a,a mod b) | b (这应该很明显)
之后你懂得.....
}
最后一点,gcd(a,0) = a;
这个是最后算法的结束条件
gcd(a,b) = gcd(b,a mod b)
我举个栗子你就知道了
gcd(an,a) = gcd(a,0) =?
显然等于a。
以上这些大部分来至于《算法导论》,然后是代码。
这是递归的写法:
int Gcd(int a, int b) { if(b == 0) return a; return Gcd(b, a % b); }
这是迭代的写法:
int Gcd(int a, int b) { while(b != 0) { int r = b; b = a % b; a = r; } return a; }
(完)

浙公网安备 33010602011771号