标签:
1,
定义:线性不定方程是指ax + by = c。
2,
给出整数a, b, c,先求出一组解,然
后讨论如何表示通解(所有解)。首先设gcd(a; b) = d。如果c不是d的倍数,那么方程
无解,因为左边是d的倍数,而右边不是。在有解的情况,设c = c0 £ d,则可以先求
出ax + by = d的一组(x0; y0),则ax0 + by0 = d,两边乘以c0得:a(c0x0) + b(c0y0) = c,因
此(c0x0; c0y0)是原方程的一组解。换句话说,核心问题是:求ax + by = gcd(a; b)的解。
3,
下面的扩展euclid算法求出了这样一组解。
void gcd(int a , int b , int & d , int & x , int & y) { if (!b){ d = a; x = 1; y = 0; } else { gcd(b , a%b , d , y , x ); // (**) y -= x*(a/b); } }
4,证明:
用数学归纳法可以证明它的正确性。归纳基础:
b = 0时,gcd(a; 0) = a,取x =1; y = 0,有ax + by = a ¢ 1 + 0 ¢ 0 = a = gcd(a; 0),成立。
先假设i次迭代以后,(**)行得到了正确的结果,即返回值y0和x0满足:
by0 + (a mod b)x0 = gcd(b; a mod b) = gcd(a; b) = d
经过步骤y¡ = x0 ¤ (a=b)后,新的数对(x; y)满足:
ax + by = ax0 + b(y0 ¡ x0(a=b)) = ax0 + by0 ¡ bx0(a=b) = s
这里的a=b是整除运算,它等于(a ¡ a mod b)=b,
因此s = ax0 +by0 ¡bx0(a¡a mod b)=b = ax0 +by0 ¡ax0 +(a mod b)x0 = by0 +(a mod b)x0 = d
标签:
原文地址:http://www.cnblogs.com/RoitAGI/p/5686429.html