GCD基础の讲解
(ps:此为基础GCD算法的讲解,不包含EXGCD的内容)
先上代码:
递归 :
long long gcd(long long x,long long y) { if (x==0) return y; return gcd(y%x,x); }
非递归:
long long gcd(long long x,long long y) { int t; while (x!=0) { t=x; x=y%x; y=t; } return y; }
讲解:
证明: x和y的最大公约数==x和(y%x)的最大公约数
设g=x和y的最大公约数 , 且y>x(其实程序实现时,大小已经无所谓了,这里作为理解暂且这么认为)
于是,y可表示为y=k1*x+b,x可表示为k2*g。
因为g为最大公因数,所以y整除g。
又因为y=k1*k2*g+b,所以b整除g。
于是令b=k3*g。 b=y%x。
设b和x的最大公约数为g2。
于是k3*g和k2*g的最大公约数是g2。
显然g是b和x的一个公约数。
假设g2>g。
所以b整除g2,x整除g2
所以y整除g2
所以x和y共同整除g2。
g2是x和y的公因数,且大于x和y 的最大公因数g,与事实矛盾,
所以g2不大于g
所以x和(y%x)的最大公因数是g,即证。

浙公网安备 33010602011771号