← Назад к математике

Китайская теорема об остатках

Решение системы сравнений x ≡ a (mod n), x ≡ b (mod m)

🐍 Python
a, b, n, m = map(int, input().split())

def gcd_extended(a, b):
    if a == 0:
        return b, 0, 1
    g, x1, y1 = gcd_extended(b % a, a)
    x = y1 - (b // a) * x1
    y = x1
    return g, x, y

def mod_inverse(a, m):
    g, x, y = gcd_extended(a, m)
    return (x % m + m) % m

inv_n = mod_inverse(n, m)
x = (a + n * (((b - a) * inv_n) % m)) % (n * m)
print(x)
⚙️ C++
#include <bits/stdc++.h>
using namespace std;

tuple<long long, long long, long long> gcd_extended(long long a, long long b) {
    if (a == 0) return {b, 0, 1};
    auto [g, x1, y1] = gcd_extended(b % a, a);
    long long x = y1 - (b / a) * x1;
    long long y = x1;
    return {g, x, y};
}

long long mod_inverse(long long a, long long m) {
    auto [g, x, y] = gcd_extended(a, m);
    return (x % m + m) % m;
}

int main() {
    long long a, b, n, m;
    cin >> a >> b >> n >> m;
    
    long long inv_n = mod_inverse(n, m);
    long long x = (a + n * (((b - a) * inv_n) % m)) % (n * m);
    
    cout << x << endl;
    return 0;
}

Китайская теорема об остатках

Для системы сравнений:

x ≡ a (mod n)
x ≡ b (mod m)

где n и m взаимно просты, существует единственное решение по модулю n·m.

Алгоритм

Решение находится по формуле:

x = a + n·((b - a)·n⁻¹ mod m)

где n⁻¹ — обратный элемент к n по модулю m.

Условия применимости

Сложность: O(log min(n, m))

Формат ввода и вывода

Ввод: a b n m — система x ≡ a (mod n), x ≡ b (mod m)

Вывод: решение x (по модулю n·m)

Пример:

1 2 3 5

x ≡ 1 (mod 3), x ≡ 2 (mod 5) → x = 7 (7 mod 3 = 1, 7 mod 5 = 2)

Вывод: 7

Попробовать онлайн

Результат появится здесь...