最大公約數及擴充套件歐幾里得演算法
阿新 • • 發佈:2022-03-28
定理一
\(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; }