解线性不定方程

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

posted @ 2016-07-19 21:58  RiotAGI  阅读(601)  评论(0编辑  收藏  举报