标签:公式 class lin 欧几里得 开始 表示 ret == 存在
define(定义) \(yygcd(a, b) = c\) 为 \(a, b\) 的公约数。
这里的 \(yygcd(a, b)\) 可以理解为 \(gcd(a, b)\),不过在未证明求出来的公约数就是最大公约数的时候,用 \(yygcd\) 表示,更加严谨。
关于欧几里得定理这个东西,我在全网上也没有找到什么好的讲解。所以决定自己来写一写自己都证了好久
欧几里得的应用一般是用在求 \(yygcd\) 的时候用的,用辗转相除发递归求 \(gcd\) 。
相信大家一般都是直接用的,没有想过去证明它,认为他很显然 是吧。
我最开始也是这样以为的,但是却发现自己证了好久。 肯定是我太菜了
不多废话。。。
我就只讲一下欧几里得求 \(gcd\) 的证明。好像欧几里得就这个作用
先写出众所周知的公式:
\(gcd(a, b) = gcd(b, a \% b)\)
然后不断递归就行了。
现在来证明如上等式:
令 \(yygcd(a, b) = c\),
那么, \(a = c * k1\),\(b = c * k2\) (\(k1\) 和 \(k2\) 互质)
那么, \(yygcd(a, b) = yygcd(c * k1, c * k2)\)
\(a \% b = c * (k1 \% c) * k2 = (k1 \% k2) * c\)
证明如下:
原式可以展开如下 : \(c * k1 = c * k2 * t + e\)
这个 \(t\) 可以为 \(0\),而这个 \(e\) 就是 \(a \% b\) 了
\(a \% b = c * k1 - c * k2 * t = c * (k1 - k2 * t)\) 这里不就可以显然的看出 \(a \% b\) 就是 \(c\) 的倍数了。
再写出它需要到达的状态:
\(yygcd(b, a \% b) = yygcd(c * k2, c * k1 \% c * k2)\)
在如上面所证,提取一个 \(c\)
=》 \(yygcd(c * k2, c * (k1 \% k2))\)
我们只需要证明这个东西和原式的 \(yygcd\) 相等就行。
那么,我们还需要知道的是 \(k2\) 和 \(k1 \% k2\) 互质。
那么就能保证两数的 \(yygcd\) 是相等的。
令 \(k3 = k1 \% k2\)
那么,\(k1 = k2 * t + k3\)
用反证法可得:
如果 \(k2\) 和 \(k3\) 不互质,那么肯定有一个会存在一个 \(d\);
使 \(k3 = d * p3\), \(k2 = d * p2\).
那么 \(k1 = k2 * t + k3 = p2 * d * t + p3 * d = d * (p2 * t + p3)\)
所以,\(yygcd(k1, k2) = d\) 又因为 \(yygcd(k1, k2) = 1\)
\(d\) 只能等于 \(1\)。所以 \(k3\) 和 \(k2\) 互质。
所以 \(k2\) 和 \(k1 \% k2\) 互质。
又因为,\(yygcd(a, b) = yygcd(b, a \% b)\).
所以,窝们可以知道 \(gcd(a, b) = gcd(b, a \% b)\)
证毕!QAQ
放个代码,虽然没什么用:
int gcd(int x, int y) {
if(y == 0) return x;
return gcd(y , x % y);
}
标签:公式 class lin 欧几里得 开始 表示 ret == 存在
原文地址:https://www.cnblogs.com/Flash-plus/p/12028349.html