Сколько оснований лгут
Тест Миллера — Рабина ошибается на составном n, только если выбранное основание — сильный лжец. Запишем n − 1 = 2s·d с нечётным d. Основание a (1 ≤ a ≤ n − 1) — сильный лжец, если ad ≡ 1 (mod n) или a2id ≡ −1 (mod n) для какого-нибудь i от 0 до s − 1. Основание — лжец Ферма, если an−1 ≡ 1 (mod n).
Чтобы понять, насколько опасно число для теста, хочется знать, сколько у него лжецов того и другого сорта. Перебрать все основания нельзя: числа доходят до 4·10¹⁸. Зато для каждого числа известно его разложение на простые множители.
Например, у 2047 = 23 · 89 сильных лжецов 242 (среди них 1, 2 и 2046), а лжецов Ферма — 484.
Вход
В первой строке число t (1 ≤ t ≤ 10 000). В каждой из следующих t строк описано одно число: сначала количество различных простых делителей k (1 ≤ k ≤ 15), затем k пар «простое p, показатель e» в порядке возрастания p. Число n = ∏ pe нечётное, составное и меньше 2⁶².
Выход
Для каждого числа — строку из двух чисел: сколько сильных лжецов и сколько лжецов Ферма среди оснований от 1 до n − 1.
Примеры
Пример 1
5 1 3 2 2 3 1 5 1 3 3 1 11 1 17 1 2 23 1 89 1 3 7 1 19 1 67 1
2 2 2 4 10 320 242 484 1782 7128
Ограничения
- Время · Python
- 4000 мс
- Время · Go
- 1000 мс
- Память
- 256 МБ
- Проверка
- 6 тестов
Разбор
Открывайте по ступеням: каждая следующая подсказывает больше. Можно сразу к решению — но задача, решённая с одной подсказкой, запоминается лучше.
1Подсказка 1
Лжец обязательно взаимно прост с n. По китайской теореме об остатках выбрать основание по модулю n — то же, что выбрать его остаток по модулю каждого pe независимо. А сравнение по модулю n выполнено, когда оно выполнено по модулю каждого pe. Сколько решений у ad ≡ 1 по модулю одного pe?
2Подсказка 2
Обратимые остатки по модулю pe (для нечётного простого p) образуют цикл: все они — степени одного остатка g, первообразного корня. Их φ(pe) = pe−1(p − 1). В цикле длины m уравнение xt = 1 имеет ровно gcd(t, m) решений. А xt = −1?
3Подсказка 3
Случаи «ad ≡ 1» и «a2id ≡ −1» при разных i не пересекаются: после −1 в цепочке идут только единицы. Значит, лжецов можно считать по случаям и складывать.
4Идея
Считаем решения по модулю каждого pe и перемножаем — это китайская теорема. Пусть p − 1 = 2sp·dp с нечётным dp. По модулю pe: у ad ≡ 1 ровно gcd(d, dp) решений, у a2id ≡ −1 — ровно 2i·gcd(d, dp), если i < sp, и ни одного иначе. Перемножив по всем k простым и сложив случаи, получаем формулу Монье:
$$S(n) = \prod_p \gcd(d, d_p) \cdot \Bigl(1 + \sum_{i=0}^{\nu - 1} 2^{ik}\Bigr), \qquad F(n) = \prod_p \gcd(n - 1, p - 1),$$где ν — наименьшее из sp.
5Разбор
Почему решений столько. Пусть g — первообразный корень по модулю pe, m = φ(pe), и x = gy. Тогда xt = 1 означает m | ty, и подходящих y от 0 до m − 1 ровно gcd(t, m). Остаток −1 — это gm/2 (единственный остаток порядка 2), и xt = −1 означает ty ≡ m/2 (mod m). Такое сравнение разрешимо, когда gcd(t, m) делит m/2, и тогда у него тоже gcd(t, m) решений.
Теперь подставим. Число p делит n, значит, не делит n − 1 и d, поэтому gcd(d, m) = gcd(d, dp) — от множителя pe−1 и от двоек в m нечётное d ничего не берёт. Для t = 2id получаем gcd(t, m) = 2min(i, sp)·gcd(d, dp), а m/2 содержит двойку в степени sp − 1. Делимость выполнена ровно при i < sp. Так же для лжецов Ферма: gcd(n − 1, m) = gcd(n − 1, p − 1).
По китайской теореме основание — лжец, когда нужное сравнение выполнено по модулю каждого pe, а остатки по разным модулям выбираются независимо. Случай ad ≡ 1 даёт ∏ gcd(d, dp) оснований, случай a2id ≡ −1 — произведение 2i·gcd(d, dp) по всем k простым, то есть 2ik·∏ gcd(d, dp), если i меньше всех sp, и ноль иначе. Складываем случаи i = 0, …, ν − 1.
Проверка на 2047 = 23 · 89: d = 1023, 22 = 2 · 11, 88 = 8 · 11, ν = 1, k = 2. S = 11 · 11 · (1 + 1) = 242, F = gcd(2046, 22) · gcd(2046, 88) = 22 · 22 = 484.
В Go всё помещается в uint64: S и F не больше n, а слагаемые суммы — степени двойки не больше 2νk ≤ ∏ p ≤ n, потому что каждое p ≥ 2ν + 1.
5+Решение
6Сложность
На число — k алгоритмов Евклида и вычисление n из разложения: O(k log n). Перебор оснований стоил бы O(n log n) — для n около 10¹⁸ это миллиарды лет.
7Типичные ошибки
- Перебор оснований. Верен и годится для проверки на числах до нескольких тысяч, но на больших тестах безнадёжен.
- Забытая единица в скобке. Слагаемое 1 — это основания с ad ≡ 1, например само a = 1. Без него у 15 вышел бы один лжец, а их два: 1 и 14.
- Степени простых. Для pe хочется взять gcd(d, φ(pe)) — и это правильно, просто множитель pe−1 с d общих делителей не имеет. А вот gcd(n − 1, pe − 1) вместо gcd(n − 1, p − 1) уже ошибка.
- ν по показателю n − 1. Сумма идёт до наименьшего sp, а не до s: при i ≥ sp по модулю этого pe решений нет.
Алгоритмы задачи
O(k log³ n)
2 задачи
NUM
Алгоритм
Китайская теорема об остатках
Число по остаткам от нескольких модулей: алгоритм Гарнера и точные вычисления по многим простым.
O(k²) операций с машинными числами
2 задачи
NUM
Алгоритм
Алгоритм Евклида
Наибольший общий делитель двух чисел за O(log n) делений с остатком.
O(log min(a, b))
2 задачи