欧几里得算法(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);
}