Construction
long crt(long[] a, long[] n) {
long N = 1;
for (long ni : n) N *= ni;
long result = 0;
for (int i = 0; i < a.length; i++) {
long Ni = N / n[i];
long Mi = modInverse(Ni, n[i]);
result = (result + a[i] * Ni * Mi) % N;
}
return result;
}Advertisement
Non-coprime CRT
Merge congruences pairwise via extended Euclidean. Check compatibility (a₁ ≡ a₂ mod gcd(n₁, n₂)).
Advertisement
Applications
RSA signature. Fast polynomial multiplication via multiple primes. Distributed computation.
Speed up
Compute mod many small primes → combine. Avoids big-integer arithmetic in intermediate steps.