1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9

# конспект · шаг 9 из 9

Конспект: модульная арифметика, НОД и обратный элемент

выжимка - её можно унести в заметки

Понятия

Сравнимы по модулю m - дают одинаковый остаток при делении на m; a ≡ b (mod m). То же самое: a − b делится на m.

НОД - наибольшее число, на которое делятся оба. Взаимно простые - числа с НОД, равным единице.

Обратный элемент к a по модулю m - число x с a · x ≡ 1 (mod m). Делить на a - значит умножать на него.

Функция Эйлера φ(m) - сколько чисел от 1 до m взаимно просты с m. φ(p) = p − 1, φ(p · q) = (p − 1)(q − 1).

Что унести

ЧТО МОЖНО ПО МОДУЛЮ
сложение, вычитание, умножение     всегда; остаток можно брать после любого действия
деление на a                       только если НОД(a, m) = 1: умножить на обратный
сокращение a·c ≡ b·c на c          только если НОД(c, m) = 1
сравнение «больше-меньше»          никогда: остатки не упорядочены
АЛГОРИТМ ЕВКЛИДА                         РАСШИРЕННЫЙ
пока b ≠ 0:                              ведём пару (x, y):  число = x · a₀ + y · b₀
    a, b = b, a mod b                    старт: a₀ → (1, 0),  b₀ → (0, 1)
ответ: a                                 новая пара = старая − q · следующая
                                         в конце:  a₀ · x + b₀ · y = НОД

1989, 867:  2·867+255 → 3·255+102 → 2·102+51 → 2·51+0        НОД = 51, 4 круга
40, 7:      3 · 40 − 17 · 7 = 1        обратный к 7 по модулю 40:  −17 + 40 = 23
цифр в числах кругов в среднем самое большее в замере граница Ламе 5 · цифр
6 11,6 19 30
15 29,3 44 75
16, соседние числа Фибоначчи - 76 80

Худший вход Евклида - соседние числа Фибоначчи. Все частные равны единице. Версия на вычитании на паре (1 000 000, 1) делает 999 999 кругов - экспонента по числу цифр.

СРАВНЕНИЕ a · x ≡ b (mod m),   g = НОД(a, m)
b не делится на g    →  решений нет               6x ≡ 4 (mod 9)
b делится на g       →  решений ровно g           6x ≡ 3 (mod 9):  2, 5, 8
как решать:  поделить a, b и m на g;  x ≡ (b/g) · (a/g)⁻¹  по модулю m/g
СТЕПЕНЬ ПО МОДУЛЮ                        показатель     кругов    шагов
r = 1                                    10³              10        62
пока n > 0:                              10⁹              30       169
    если n нечётно: r = r · a mod m      10¹⁵             50       276
    a = a · a mod m                      кругов = ⌊log₂ n⌋ + 1
    n = n // 2                           цикл «умножай n раз»: 3 000 004 шага на 10⁶

Малая теорема Ферма. p простое, a не делится на p → a^(p−1) ≡ 1 (mod p). Теорема Эйлера. НОД(a, m) = 1 → a^φ(m) ≡ 1 (mod m).

следствия:   показатель берётся по модулю p − 1       3^(10¹²) mod 1 000 003 = 3⁴ = 81
             обратный по простому модулю = a^(p−2)    цена та же, что у Евклида: 114 и 120 шагов
обратное неверно:   3⁹⁰ mod 91 = 1,  а 91 = 7 · 13
КИТАЙСКАЯ ТЕОРЕМА ОБ ОСТАТКАХ             модули попарно взаимно просты, M - их произведение
x = Σ rᵢ · Mᵢ · (Mᵢ⁻¹ mod mᵢ)  mod M      Mᵢ = M / mᵢ
остатки 2, 3, 2 по модулям 3, 5, 7:   2 · 70 + 3 · 21 + 2 · 15 = 233 → 23
условие: настоящий ответ меньше M, иначе соберётся его остаток

В Python: math.gcd(a, b), pow(a, n, m), pow(a, -1, m) с версии 3.8. Не a ** n % m.

Линейное сравнение: d = НОД(a,m) должен делить b; затем реши по модулю m/d и верни d ответов с шагом m/d.

Ловушки джокера

Остаток взят в конце. Числа успевают вырасти: в Python - квадрат вместо линии, в C - переполнение.

Модуль больше корня из предела типа. Произведение двух остатков доходит до m². На тренажёре модуль не больше 94 906 265, в 64 битах - не больше 2³².

Отрицательный остаток. В C, Java, JavaScript -7 % 5 равно -2. Брать (x % m + m) % m.

Деление остатков напрямую. (a / b) mod m - это a · b⁻¹, а не (a mod m) // (b mod m).

Обратный без проверки НОД. Для пары (6, 9) коэффициент есть - 8, - а обратного нет: 6 · 8 ≡ 3.

Коэффициент не приведён. Расширенный Евклид отдаёт −17, а не 23.

Показатель по модулю p. Круг имеет длину p − 1: 2¹⁰ mod 7 = 2, а 2³ mod 7 = 1.

Основание, кратное модулю. Теорема Ферма к нему не относится: все степени нулевые.

Единица как доказательство простоты. 3⁹⁰ mod 91 = 1, но 91 составное.

НОК через произведение. a * b // НОД переполняется; считать a // НОД * b.

Китайская теорема с общим делителем у модулей. x ≡ 1 (mod 4), x ≡ 2 (mod 6) несовместны.

Ответ больше произведения модулей. Собирается не он, а его остаток - число, ни на что не похожее.

Время степени зависит от битов показателя. Если показатель секретен, домножение «только на единичных битах» выдаёт его по времени ответа.

Куда это ведёт

Теорема Ферма работает в одну сторону: у простого модуля степень p − 1 всегда даёт единицу. Значит, если для числа n нашлось основание, у которого aⁿ⁻¹ - не единица, то n составное, и доказано это без единого делителя. Следующая глава превращает это наблюдение в проверку простоты для чисел в сотни цифр - и разбирается с числами вроде 91, которые умеют притворяться.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.