652 字
3 分钟
辗转相除法-求最大公因数

辗转相除法是一种求最大公因数的计算方法。 这种方法在编程中很常用,在数学计算中也可以用来求很复杂的最大公因数问题。

如何使用#

题目:求最大公因数 ((36,14)) 我们如何用辗转相除法做这道题呢? 反复用除数除以余数直到除尽:

36÷14=2…836 \div 14 = 2 \dots 814÷8=1…614 \div 8 = 1 \dots 68÷6=1…28 \div 6 = 1 \dots 26÷2=36 \div 2 = 3

最后一个除数就是最大公约数,也就是 (2)。 我们算出最大公约数 ((36,14)=2)。 到这里,我们就知道如何使用辗转相除法了。 但是,鲁迅曾说过“我们学公式必须得懂得原理”,我们明白了原理才能灵活运用。

原理#

求最大公因数 ((a,b)) 首先我们推出这几条式子:

a÷b=q…ra \div b = q \dots ra=bq+ra = bq + rr=a−bqr = a - bq

这是我们辗转法的原理

(a,b)=(b,r)(a,b)=(b,r)

(a) 和 (b) 的最大公约数就等于 (b) 和 (r) 的最大公约数。 接下来让我们证明这条公式。

(1) 设 ((a,b)=d),那么 (a=dm),(b=dn),然后我们将其带入 (r=a-bq):

r=d(m−nq)r = d(m-nq)

因为 (m,n,q) 都是整数,所以 (r) 是 (d) 的倍数,(d) 是 (r) 的因数。 所以:只要是 (a,b) 的因数,就一定是 (d,r) 的约数。

(2) 设 ((b,r)=d),和之前一样,那么 (b=dx),(r=dy),然后将其代入 (a=bq+r):

a=d(xq+y)a = d(xq+y)

因为 (x,q,y) 都是整数,所以 (a) 是 (d) 的倍数,(d) 是 (a) 的因数。 所以:只要是 (d,r) 的因数,就一定是 (a) 的因数。 这样,我们就得出 ((a,b)) 的因数和 ((b,r)) 的因数相同,它们的因数都相同,那么它们的最大公因数也就相同。 所以我们要求 ((a,b)) 的最大公因数,我们就通过可以求 ((b,r)) 的最大公因数来得到。

现在我们再来看看开头的题

题目:求最大公因数 ((36,14)) 反复用 ((a,b)=(b,r)) 的方法:

(36,14)=(14,8)=(8,6)=(6,2)(36,14)=(14,8)=(8,6)=(6,2)

最后得到 ((6,2)),显而易见最大公约数是 (2)。

写 gcd 函数#

接下来看看我们如何在 C++ 中用辗转相除法写 gcd 函数。 gcd 函数就是用来求最大公因数的函数。

int gcd(int a, int b) {
while (a % b != 0) // a能被b整除时就终止循环
{
int r = a % b;
a = b;
b = r; // 将a换成除数b,b换成余数r
}
}

当然也可以直接用 algorithm 头文件中的 gcd 函数。 我们学会自己写是为了理解原理,提升思维, 自己写还可以在有特殊需求的时候更自定义化。

辗转相除法-求最大公因数
https://blog.gochi.cn/posts/euclidean/
作者
枸杞加水
发布于
2022-12-14
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

评论

正在加载评论...

最后更新于 ,距今已过 1394 天

部分内容可能已过时