Statement

Write n = sum nᵢ · p^i, k = sum kᵢ · p^i. C(n, k) ≡ ∏ C(nᵢ, kᵢ) (mod p).

Advertisement

Algorithm

long lucas(long n, long k, long p) {
  long result = 1;
  while (n > 0 || k > 0) {
    long ni = n % p, ki = k % p;
    if (ki > ni) return 0;
    result = result * binomialModP(ni, ki, p) % p;
    n /= p; k /= p;
  }
  return result;
}
Advertisement

Complexity

O(log_p(n)) iterations. Each computes small binomial mod p.

Composite mod

CRT: split into prime powers. Wilson + Granville for prime powers. General but complex.