Fork me on 
Catalogue

我自问酒不问仙,半世逍遥半世癫,我自问心不问佛,半世情愁半世痴。 ​​​​

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,即证。

posted @ 2020-11-24 21:57  汉孤臣  阅读(171)  评论(0)    收藏  举报
Live2D