前言
欧几里德算法作为有着非常简短的实现的算法,可能很多初学者(包括当时的我)都不求甚解。本文给出了GCD、LCM的性质,以及欧几里德算法的实现、证明和时间复杂度推导。
这里是我的个人网站:
https://endlesslethe.com/gcd-lcm-euclidean-algorithm.html
有更多总结分享,最新更新也只会发布在我的个人网站上。
什么是欧几里得算法
最大公约数问题是最早被研究的算法问题之一了,并且是ACM竞赛中能涉及到的很多数论内容,比如模线性方程,模线性方程组的基础。
欧几里得算法 (Euclidean algorithm) ,即大部分选手所知的“辗转相除法”,其核心在于不断将两数规模变小,最后实现对数时间内求解两个数的最大公约数。
其核心是:\[gcd(a,b) = gcd(b, a % b)\]
名词解释
- 最大公约数:即最大公因子,能够同时整除a和b的最大因子,记作gcd(a, b),或gcd
- 最小公倍数:能够被a和b整除的最小数,记作lcm(a, b),或lcm。
- %:指的是取余运算(取模运算),用例: a % b
- |:指的是整除运算,a | b表明a可以整除b,即a是b的因子
GCD和LCM的一些性质
- a, b都能分解为有限个素数的积
- gcd(a, b)中只含a,b的全部公共素因子
- lcm(a, b)中含有a,b的所有素因子
- \(gcd%lcm=0\)
- \(gcd * lcm = a * b\)
- \(lcm/gcd = a/gcd * b/gcd\)
- \(gcd(ka, kb) = k * gcd(a, b)\)
- \(lcm(ka, kb) = k * lcm(a, b)\)
- \(lcm(\frac{a}{b},\frac{c}{d})=\frac{lcm(a,c)}{gcd(b,d)}\)
简单证明
这里只证明第六个性质:\[gcd * lcm = a * b\]
根据\(a / gcd\) 和 \(b / gcd\) 这两个数互质,且两者包含a、