公式

228 阅读1分钟

欧几里得算法

整数 a,b 最大公约数一般表示为 gcd(a, b)

gcd(a, b) = gcd(b, a%b)

将较大规模的数据转换成较小规模的数据,直到第二个数为0,第一个数则为最大公约数

function gcd(a, b) {
  if (b) return gcd(b, a % b)
  return a
}

证明

  1. 证明 a, a%b 的最大公约数也是 a, b 的公约数
// 设 b, a%b 的最大公约数为 c
// 则 b = k1*c, a%b = k2*c
a%b = k2*c      =>
a - k*b = k2*c  =>
a = k*b + k2*c  =>
a = k*k1*c + k2*c = (k*k1+k2) * c
  1. 证明 a, a%b 的最大公约数也是 a, b 的最大公约数
// 由证明1得,a = k*k1*c + k2*c = (k*k1 + k2) * c
// 设 a, b 的最大公约数不是c
// 则 k*k1+k2, k1 的最大公约数不等于 1
// 则 gcd(k*k1+k2, k1) = d, d !== 1
k*k1 + k2 = nd
k1 = md
k2 = nd - k*k1 = nd - k*md = (n-mk)d
// 将k1, k2 带入到 b, a%b 中,得 b = k1*c, a%b = k2*c
b = k1*c = mdc
a%b = k2*c = (n-mk)dc
// 若d不为1,b, a%b 的最大公约数应为 dc,与假设相违
// 故,d = 1, 则 a, b 的最大公约数也为c

扩展:贝祖等式

ax + by = gcd(a, b) = c (值均为整数), 求一组 x,y 的值,一定有解

数论中的欧拉公式

aφ(n)(modn)=1a^{\varphi(n)}\pmod{n} = 1

// phi(6) = 2 * 3 = 2^0 * 3^0 * (2-1) * (3-1) = 2
// phi(12) = 2^2 * 3 = 2^1 * 3^0 * (2-1) * (3-1) = 4
const phi = (n) => {
  let x = 2, ans = n
  while (x * x <= n) {
    // ans = ans/x * (x-1) 
    if (n % x === 0) ans -= ans / x
    while (n % x === 0) n /= x
    x++
  }
  if (n !== 1) ans -= ans / n
  return ans
}