线性不定方程整数根

欧几里得算法(辗转相除法)

邮差的信 提交于 2020-03-12 21:32:31
<!-- Euclid算法 --> 欧几里得算法即“辗转相除法”,用于求两个正整数的最大公约数(gcd)。 int gcd(int a, int b) { if(b == 0) return a; else return gcd(b, a % b); } 这是递归形式的代码,递归层数为4.785lgN + 1.6723,N是max(a, b),可见它递归不了多少层,不需要担心栈溢出的问题。 更精检的形式如下: int gcd(int a, int b) { return (b? gcd(b, a%b): a); } 我们使用这段代码的时候,需要保证a和b是非负整数,a、b同为0的情况要预先处理掉。事实上我们不需要管a和b的大小关系,代码在递归中,始终将大数放在前,我们即使将小数放在前也就是多一层递归而已。 另外还有一种仅通过位运算就可以达到目的的gcd: int gcd(int a, int b) { int t = 1, c, d; while(a != b) { if(a < b) swap(a, b); if(! (a & 1)) { a >>= 1; c = 1; } else c = 0; if(! (b & 1)) { b >>= 1; d = 1; } else d = 0; if(c && d) t <<= 1; else if(! c && ! d) a -= b