1. 程式人生 > 其它 >最大公約數及擴充套件歐幾里得演算法

最大公約數及擴充套件歐幾里得演算法

定理一

\(a\ mod\ b = a - b * \lfloor \frac {a}{b} \rfloor\)

證明:

\[\because a = k * b + r \\\therefore \lfloor \frac{a}{b} \rfloor = k \\即 a \ mod \ b = r, a - b * \lfloor \frac{a}{b} \rfloor \]
定理二 輾轉相除法

\(gcd(a,b) = gcd(b, a\ mod\ b)\)

證明:

\[設d = gcd(a, b) \\則有d|a,\ d|b \\令c = a\ mod\ b \\\because a = k * b + c \\\therefore d|a = d|(k * b + c)\Longrightarrow d|c \\即d|b,\ d|gcd(a, b) \\d = gcd(b, a\ mod\ b) \]
int gcd(int a, int b) return b ? gcd(b, a  % b) : a;
定理三 裴蜀定理

\(ax + by = c有整數解 \iff gcd(a,b)|c\)

證明:

首先證明必要性:

\[\because gcd(a,b) | a,\ gcd(a,b) | b \\\therefore gcd(a,b) | (ax + by) \\即gcd(a, b) | c \]

再證明充分性:

\[設d = gcd(a, b) \\則d|a,\ d|b,\ d|(ax + by) \\設s=ax + by線性組合中的最小正元 \\令q=\lfloor \frac{a}{s} \rfloor \\由定理一可得a\ mod\ s = a - q * s \\即r = a\ mod\ s = a - q * (ax + by) = a * (1 - qx) + b * (-qy) \\可以說明r也是ax + by線性組合中的元素 \\\because 0 <= r < s,s是最小正元 \\\therefore r = 0 \\即s|a \\同理可以說明 s|b \\即s是a,b的一個公約數 \\\because d >= s, d|s \\\therefore d = s \\即gcd(a,b)是ax + by線性組合中的最小正元,得證 \]
推理

\(ax + by = 1有整數解 \iff a,b互質\)

擴充套件歐幾里得演算法

\(ax + by = gcd(a,b)\)的一組可行解

求解過程:

\[設ax_1 + by_1 = gcd(a,b) \\bx_2 + (a\ mod\ b)y_2 = gcd(b,a\ mod\ b) \\由定理一、二可得ax_1 + by_1 = bx_2 + (a\ mod\ b)y_2 = bx_2 + (a - \lfloor \frac{a}{b} \rfloor b)y_2 \\可得ax_1 + by_1 = ay_2 + b(x_2 - \lfloor \frac{a}{b} \rfloor)y_2 \\由對應項相等可得 x_1 = y_2,\ \ y_1 = x_2 - \lfloor \frac{a}{b} \rfloor y_2 \]
int exgcd(int a, int b, int &x, int &y) {
	int d = a;
    if(b) {
        d = exgcd(b, a % b, y, x);
        y -= (a / b) * x;
    } else {
		x = 1, y = 0;
    }
    return d;
}