欧几里得算法(euclidean)
欧几里得算法又称辗转相除法,是指用于计算两个非负整数 a,b 的最大公约数。
- 判断 b 是否为 0,若为 0,则返回 a
- 否则返回 gcd(b, a % b)
证明
- 设与的最大公约数为
- 则, , 且,必互质
- ,可得
- 由上可得与必有一因数
- 设与的最大公约数是
- 设令, , 则
- 设, , 则
- 则
- 则
- 由于, 则
- 由此可得
扩展欧几里得
已知,,求的,一个解
- 设
- 带入上一层得,
- 由于则, 可求得一解,
- 从最里层开始往上回溯即可得解
核心代码
/**
* 欧欧几里得算法
* 返回a与b的最大公约数
*/
export function gcd(a: number, b: number) {
if (b) return gcd(b, a % b);
return a;
}
/**
* 扩展欧几里得算法
* 已知a,b
* 求a * x + b * y == gcd(a,b)中,x与y的一个解
*/
export function ex_gcd(
a: number,
b: number,
): {
ans: number;
x: number;
y: number;
} {
if (b === 0) return { ans: a, x: 1, y: 0 };
const res = ex_gcd(b, a % b);
[res.x, res.y] = [res.y, res.x - Math.floor(a / b) * res.y];
return res;
}
/**
* 返回a与b的最大公倍数
*/
export function lcm(a: number, b: number) {
return (a * b) / gcd(a, b);
}