扩展欧几里得--part1

来源:互联网 发布:卖二手衣服的软件 编辑:程序博客网 时间:2024/06/08 08:48

基础–欧几里得算法

这个是求最大公约数基本算法,由更相减损术优化而来.

–更相减损术

很简单,对于给定的两个数,每次用大的减小的,直到两数相等,所得即为它们的最大公约数.
代码:

int gcd(int a, int b) {    while(a != b) {        if(a > b)            a -= b;        else            b -= a;    }    return a;}

加强版V2.0–辗转相除法

在更相减损术实际运用过程中我们会发现如果一个数为100000一个数为1(即相差极大)那复杂度也是O(n)的,那么我们想反正这样减一直到大的小于等于小的,何不用个”%”呢?
因此,辗转相除法就出现了(复杂度最坏也只是log(n))
代码:

int gcd(int a,int b){b?return gcd(b,a%b):return a;}

正确性证明

假设给出两个数a,b,它们最大公约数为g,那么可得a=K1*g,b=K2*g.所以可以发现我们在进行辗转相减过程中所有的最大公约数g始终都还在,只是K1 K2在辗转相减,而K1 K2互质(不然g就不是最大公约数与假设矛盾)。最终这两个系数一定会变成0,1两个数。

原创粉丝点击