NUM Числа и алгебра Алгоритм

Тест Миллера — Рабина

Также: Miller–Rabin primality test · Rabin–Miller test · сильный тест на простоту · strong probable prime test · тест Ферма · числа Кармайкла · сильные псевдопростые

Как за десятую долю миллисекунды убедиться, что двадцатизначное число простое, не найдя ни одного его делителя. Тест вызывает свидетелей — числа-основания — и сверяет их показания: простое число запутать их не может, а составное ловят хотя бы три четверти оснований.

Продвинутый 30 минут простые числа теория чисел случайность безопасность в проде классика олимпиады

Число 18 446 744 073 709 551 557 простое? Перебор делителей до корня — это два миллиарда делений, и Python по нашему замеру потратит на них около минуты. Тест Миллера — Рабина отвечает за десятую долю миллисекунды и не находит при этом ни одного делителя. Он вызывает свидетелей — числа-основания — и сверяет их показания. Простое число запутать их не может, а составное почти наверняка проговорится. Ниже суд идёт в вашем браузере. Выберите подсудимого — среди них есть рекордсмены, которые обманывают тринадцать свидетелей подряд, — или введите своё число.

В каждой строке одно основание a даёт показания двумя способами. Колонка «Ферма» — старый тест: остаток an−1 по модулю n. Для простого n это всегда 1 — так говорит малая теорема Ферма. Колонка «цепочка» — та же степень, но посчитанная с остановками: сначала ad, потом её квадрат, квадрат квадрата и так далее до an−1. Посмотрите на 561: тест Ферма на большинстве оснований молчит, а цепочка выдаёт число с первого же основания. На ψ₁₃ лгут тринадцать оснований подряд, и только 43 говорит правду. А на числе Кармайкла из 61 знака тест Ферма не заметит подвоха ни при каком основании, взаимно простом с n, — зато цепочка не только ловит его, но и выдаёт делитель.

Идея

По простому модулю у единицы ровно два квадратных корня: 1 и −1. Запишем n − 1 = 2s·d с нечётным d и будем возводить ad в квадрат, пока не дойдём до an−1. Если n простое, в конце цепочки стоит 1, и появиться она может только сразу или сразу после −1. Если в цепочке единица возникла из чего-то другого — или до единицы цепочка вообще не дошла, — n составное, и основание a это доказало.

Тест Ферма смотрит только на последнее звено цепочки. Его обманывает любое составное n, для которого an−1 ≡ 1, и такие числа есть для любого основания. Цепочка требует больше: не просто прийти к единице, а прийти к ней правильной дорогой. Обмануть её тоже можно, но гораздо труднее.

Назовём основание a свидетелем, если цепочка его выдаёт: ad ≢ 1 и ни одно из чисел ad, a2d, …, a2s−1d не равно −1 по модулю n. Иначе говорят, что n — сильно вероятно простое по основанию a. Составное число, которое прошло проверку, называют сильным псевдопростым по основанию a, а само основание — сильным лжецом.

Допрос по шагам

Возьмём простое 97. Тогда 96 = 2⁵ · 3: s = 5, d = 3. Основание 5: 5³ = 125 ≡ 28, дальше квадраты — 28² ≡ 8, 8² = 64, 64² ≡ 22, 22² ≡ 96 ≡ −1, и последний квадрат (−1)² = 1. Цепочка 28, 8, 64, 22, −1, 1 пришла к единице через −1, как и положено простому.

Теперь 2047 = 23 · 89. Здесь 2046 = 2 · 1023, звеньев два. Основание 3: 31023 ≡ 1565 — ни 1, ни −1, а квадратов больше делать нельзя: следующее звено уже an−1. Свидетель. Основание 2: 21023 ≡ 1, потому что 2¹¹ = 2048 ≡ 1, а 1023 делится на 11. Двойка лжёт. Число 2047 — наименьшее сильное псевдопростое по основанию 2, и всего у него 242 лжеца среди 2046 оснований, меньше 12 %.

На каждое основание уходит одно быстрое возведение в степень — около log₂ n умножений по модулю — и не больше s возведений в квадрат. Основания перебирают по очереди, и первый же свидетель заканчивает суд: «составное» — это доказательство, а не догадка. Если ни одно основание не возразило, ответ «вероятно простое», и насколько «вероятно», решает следующий раздел.

Почему простое не проваливается, а составное проваливается часто

Если p простое и x² ≡ 1 (mod p), то x ≡ 1 или x ≡ −1 (mod p).

x² − 1 = (x − 1)(x + 1) делится на p. Простое число, которое делит произведение, делит один из множителей — это лемма Евклида. Значит, p делит x − 1 или x + 1.

Если n — нечётное простое, то каждое основание a от 1 до n − 1 проходит проверку.

Обозначим звенья цепочки x₀ = ad, x₁ = x₀², …, xs = an−1. По малой теореме Ферма xs ≡ 1. Если x₀ ≡ 1, проверка пройдена. Иначе возьмём первое звено xi, равное единице; i ≥ 1, и xi−1 ≢ 1. Но xi−1² = xi ≡ 1, и по лемме xi−1 ≡ −1 — это звено с номером от 0 до s − 1, ровно то, что требует проверка.

Обратное утверждение и делает тест полезным: у составного числа лжецов мало. Докажем, что их не больше половины. Нам понадобится одно наблюдение про остатки, обратимые по модулю n, — те, что взаимно просты с n; их φ(n) штук.

Пусть набор H обратимых остатков по модулю n вместе с любыми двумя элементами содержит их произведение и вместе с каждым элементом — обратный к нему. Если хотя бы один обратимый остаток b в H не входит, то в H не больше φ(n)/2 элементов.

Умножим каждый элемент h из H на b. Разные h дают разные bh: на обратимое b можно сократить. И ни одно bh не лежит в H: иначе b = (bh)·h⁻¹ тоже лежало бы в H. Значит, вне H обратимых остатков не меньше, чем в H, и |H| ≤ φ(n)/2.

Если n — нечётное составное, то сильных лжецов среди оснований от 1 до n − 1 не больше φ(n)/2, то есть меньше половины.

Сначала: лжец взаимно прост с n. У него an−1 ≡ 1, то есть a · an−2 ≡ 1, и обратный к a существует. Осталось в каждом случае найти набор H, который содержит всех лжецов и подходит под лемму о половине.

Случай 1: n делится на квадрат простого p. Пусть H — остатки с an−1 ≡ 1, лжецы Ферма; произведения и обратные из него не выходят, сильные лжецы в нём. Запишем n = pk·m, где k ≥ 2 и m не делится на p, и по китайской теореме об остатках возьмём b ≡ 1 + p (mod pk), b ≡ 1 (mod m). Такое b взаимно просто с n. По биному (1 + p)n−1 ≡ 1 + (n − 1)p (mod p²): все остальные слагаемые делятся на p². Но p делит n, поэтому n − 1 ≡ −1 (mod p) и bn−1 ≡ 1 − p (mod p²) — не единица. Значит, bn−1 ≢ 1 и по модулю n, и b в H не входит.

Случай 2: n — произведение различных простых. Их хотя бы два, поэтому n = q·m, где q простое, m > 1 и они взаимно просты. Основание n − 1 даёт (−1)d = −1, так что существуют j, при которых a2jd ≡ −1 для какого-то a; возьмём наибольшее такое j и такое a. Пусть H — остатки x с x2jd ≡ ±1. Произведения и обратные из него не выходят. Каждый лжец в нём: если xd ≡ 1, то и x2jd ≡ 1; если x2id ≡ −1, то i ≤ j по выбору j, и x2jd — это −1, возведённая в квадрат j − i раз, то есть ±1. Теперь возьмём b ≡ a (mod q), b ≡ 1 (mod m). Тогда b2jd ≡ −1 по модулю q и ≡ 1 по модулю m. Будь это +1 по модулю n, вышло бы −1 ≡ 1 (mod q); будь −1 — вышло бы 1 ≡ −1 (mod m). Оба модуля нечётные и больше двух, так что ни то ни другое невозможно, и b в H не входит.

В обоих случаях лемма о половине даёт не больше φ(n)/2 лжецов.

Отсюда главное свойство теста. Случайное основание ловит составное n с вероятностью больше ½, и k независимых оснований ошибаются все сразу с вероятностью меньше 2−k. Ошибка односторонняя: «составное» всегда верно, сомнение остаётся только в ответе «простое». Это алгоритм Монте-Карло, но с ошибкой, которую можно сделать меньше вероятности сбоя железа.

На самом деле граница вдвое строже. В 1980 году Майкл Рабин и независимо Луи Монье доказали, что у нечётного составного n > 9 лжецов не больше φ(n)/4, и ошибка k раундов меньше 4−k. Монье нашёл и точную формулу для их числа. Пусть у n ровно r различных простых делителей, p − 1 = 2sp·dp с нечётным dp, и ν — наименьшее из sp. Тогда сильных лжецов

$$S(n) = \left(1 + \frac{2^{r\nu} - 1}{2^r - 1}\right) \prod_{p \mid n} \gcd(d, d_p),$$

а лжецов Ферма F(n) = ∏ gcd(n − 1, p − 1). Для 2047 = 23 · 89 формула даёт (1 + 3/3) · 11 · 11 = 242 — столько мы и насчитали. Вывод длиннее нашего доказательства: он опирается на то, что обратимые остатки по модулю степени нечётного простого получаются степенями одного остатка, — его можно найти в статье Монье 1980 года и в книге Крэндалла и Померанса «Простые числа». Мы его не повторяем, а проверяем: листинг ниже сравнивает формулу с прямым перебором всех оснований для всех нечётных составных до тысячи.

Атлас лжецов

Четверть — это худший случай. Как лгут настоящие числа? Сцена ниже раскладывает на множители каждое нечётное составное число до миллиона — их 421 502 — и по формуле Монье считает, какая доля оснований ему лжёт. Каждая точка — одно число, высота — доля лжецов, шкала логарифмическая. Нажмите на точку, чтобы узнать, что это за число, и отправьте его на суд в первую сцену.

Нижняя кромка облака — плотная кривая 2/(n − 1): числа, которым лгут только 1 и n − 1. Эти два основания проходят проверку у любого нечётного n, и брать их бессмысленно. Таких чисел до миллиона 261 279, 62 %. Каждая следующая кривая выше — свой небольшой набор лжецов: 6, 10, 14, 18 оснований. Средняя доля лжецов по всем 421 502 числам — 0,0235 %, в тысячу с лишним раз меньше четверти.

До самой границы ¼ поднимаются 20 чисел. Девятнадцать из них устроены одинаково — p·(2p − 1), где p и 2p − 1 простые, а p при делении на 4 даёт остаток 3: 15 = 3 · 5, 91 = 7 · 13, 703 = 19 · 37 и дальше до 954 271 = 691 · 1381. Двадцатое — 8911 = 7 · 19 · 67, число Кармайкла из трёх простых вида 4k + 3. Из того же семейства p(2p − 1) и рекордсмены первой сцены: ψ₁₂ = 399 165 290 221 · 798 330 580 441 и ψ₁₃ = 1 287 836 182 261 · 2 575 672 364 521. Это не совпадение: чем больше у числа лжецов, тем больше шансов, что солгут все основания подряд.

Переключите сцену на тест Ферма. Облако поднимется, а над линией ½ окажутся одни числа Кармайкла. Это та же лемма о половине: если у n есть хоть один свидетель Ферма, взаимно простой с n, то лжецы Ферма — набор, замкнутый относительно умножения, — занимают не больше половины. Исключение — числа, у которых таких свидетелей нет вовсе.

Разница между худшим случаем и средним объясняет, почему стандарты по-разному считают раунды. Для числа, которое подбирал противник, честная оценка — 4−k: OpenSSL делает не меньше 64 раундов для чисел до 2048 бит, это 2−128, и 128 раундов для чисел длиннее. Для случайного кандидата при генерации ключа ошибка несравнимо меньше, и документация OpenSSL оценивает шанс получить составное вместо 2048-битного простого как 2−648.

Числа Кармайкла: почему одного Ферма мало

Составное n, для которого an−1 ≡ 1 (mod n) при всех a, взаимно простых с n, называют числом Кармайкла. Тест Ферма ловит его, только если случайно выбрать основание с общим делителем, — а у числа из трёх двадцатизначных простых это почти невероятно. Распознать такие числа по разложению помогает признак Корсельта.

Если составное n не делится на квадрат простого и для каждого простого делителя p число p − 1 делит n − 1, то n — число Кармайкла.

Пусть a взаимно просто с n и p — простой делитель n. По малой теореме Ферма ap−1 ≡ 1 (mod p), а n − 1 = (p − 1)t, поэтому an−1 = (ap−1)t ≡ 1 (mod p). Число an−1 − 1 делится на каждый простой делитель n, они различны, значит, оно делится и на их произведение, то есть на n.

Обратное тоже верно — у числа Кармайкла нет квадратных делителей и p − 1 делит n − 1, — но для доказательства нужно существование первообразного корня, и мы его опускаем. Альвин Корсельт сформулировал признак в 1899 году, не зная ни одного примера. Первые семь чисел — 561, 1105, 1729, 2465, 2821, 6601 и 8911 — нашёл ещё в 1885 году Вацлав Шимерка, но его работу не заметили, и имя числам дал Роберт Кармайкл, описавший 561 в 1910 году. Из признака сразу видно, что простых делителей у числа Кармайкла хотя бы три: если n = pq и p < q, то n − 1 = p(q − 1) + (p − 1), и q − 1 должно делить меньшее его число p − 1.

Признак позволяет строить числа Кармайкла любого размера. Джек Черник в 1939 году заметил: если 6k + 1, 12k + 1 и 18k + 1 простые, их произведение — число Кармайкла. Действительно, произведение равно 1296k³ + 396k² + 36k + 1, и n − 1 = 36k(36k² + 11k + 1) делится на 6k, 12k и 18k. При k = 1 выходит 7 · 13 · 19 = 1729. Кнопка «новый Кармайкл» в первой сцене ищет такое k из двадцати цифр — обычно за несколько тысяч или десятков тысяч попыток — и получает число из шестидесяти с лишним знаков, на котором тест Ферма бессилен.

Таблица ниже — сколько чисел каждого сорта меньше 10k. Мы пересчитали их сами до миллиарда — счёт совпал с опубликованными таблицами (Померанс, Селфридж и Вагстафф, 1980; Пинч для чисел Кармайкла).

меньшепростыхпсевдопростых Ферма по основанию 2сильных псевдопростых по основанию 2чисел Кармайкла
10³168301
10⁴12292257
10⁵9592781616
10⁶78 4982454643
10⁷664 579750162105
10⁸5 761 4552057488255
10⁹50 847 53455971282646

Одно основание 2 на миллиарде ошибается 1282 раза на пятьдесят миллионов простых. Из 646 чисел Кармайкла до миллиарда сильную проверку по основанию 2 проходят только 43. Чисел Кармайкла бесконечно много — это доказали Алфорд, Гранвилл и Померанс в 1994 году, — но для сильного теста они не особенные: лжецов у них не больше четверти, как у всех.

Сколько оснований нужно на самом деле

Для чисел ограниченной длины случайность можно убрать совсем. Обозначим ψk наименьшее составное число, которое проходит сильный тест по всем первым k простым основаниям. Если n < ψk и прошло их все — оно простое, без всяких вероятностей. Значения ψk искали перебором с хитрыми отсечениями несколько десятилетий:

основанияψ — первое число, которое их обманываеткто нашёл
22047—
2, 31 373 653Померанс, Селфридж и Вагстафф, 1980
2, 3, 525 326 001
2, 3, 5, 73 215 031 751
2 … 112 152 302 898 747Ешке, 1993
2 … 133 474 749 660 383
2 … 17 и 2 … 19341 550 071 728 321
2 … 23, 2 … 29 и 2 … 313 825 123 056 546 413 051Цзян и Дэн, 2014
2 … 37318 665 857 834 031 151 167 461Соренсон и Вебстер, 2015
2 … 413 317 044 064 679 887 385 961 981

Число ψ₁₂ ≈ 3,2·10²³ больше 2⁶⁴ ≈ 1,8·10¹⁹, поэтому первых двенадцати простых, от 2 до 37, хватает для любого 64-битного числа. Короче набор Джима Синклера 2011 года: семь оснований 2, 325, 9375, 28178, 450775, 9780504, 1795265022 проверяют все n < 2⁶⁴. Такие наборы проверяют по списку всех псевдопростых по основанию 2 меньше 2⁶⁴, который вычислил Ян Фейтсма. Михал Форишек и Якуб Янчина в 2015 году пошли дальше: для 32-битных чисел хватает одного раунда, если основание выбирать из заранее составленной таблицы по хешу самого числа, а для 64-битных — двух или трёх.

Для чисел любой длины детерминированный вариант есть только в предположении. Гэри Миллер в 1976 году показал, что если верна расширенная гипотеза Римана, то достаточно проверить все основания до O(ln² n); Эрик Бах в 1990 году уточнил границу до 2 ln² n. Гипотеза не доказана, и на практике полагаются на случайные основания.

Код

Первая программа — суд из сцены в коде. Функция strong строит цепочку целиком, чтобы её можно было показать; в рабочем тесте цикл прерывают, как только встретили −1. Числа длинные, поэтому в Go — math/big, в Python — обычный int и встроенная pow(a, d, n), то есть быстрое возведение в степень по модулю.

number       digits  fermat  strong  bases 2..41 say            with 43 too
2^64 - 59        20   13/13   13/13  probably prime             probably prime
561               3   10/13    0/13  composite (witness 2)      composite (witness 2)
3215031751       10   13/13    6/13  composite (witness 11)     composite (witness 11)
psi12            24   12/13   12/13  composite (witness 41)     composite (witness 41)
psi13            25   13/13   13/13  probably prime             composite (witness 43)
chernick         61   13/13    2/13  composite (witness 2)      composite (witness 2)

Тест Ферма обманут числом Кармайкла из 61 знака на всех тринадцати основаниях, сильный тест — только на двух. А дальше та самая улика: цепочка для основания 2 — x x 1 1 1, единица появилась из числа, которое не равно ±1. Это число x — квадратный корень из единицы, и n делит (x − 1)(x + 1), не деля ни одну из скобок. Значит, НОД(x − 1, n) и НОД(x + 1, n) — нетривиальные делители. Программа получает 12k + 1 = 120 000 000 000 000 138 301 и произведение двух других простых. Тест, который не искал делителей, нашёл делитель даром.

Вторая программа сверяет формулу Монье с перебором и строит маленький атлас — до 300 000, чтобы уложиться в доли секунды. Доля чисел, которым лгут только 1 и n − 1, там 63,1 %, а в сцене до миллиона — 62,0 %: она падает, но очень медленно. Эрик Бах и Эндрю Шаллю в 2013 году показали, что доля таких чисел стремится к нулю — со скоростью, обратной тройному логарифму.

Третья — рабочая версия для 64-битных чисел с основаниями Синклера. В Python здесь нечего бояться, а в Go произведение двух 64-битных остатков не помещается в машинное слово. Функция bits.Mul64 возвращает все 128 бит произведения, bits.Div64 делит их на n. Перед возведением в степень стоит пробное деление на двенадцать маленьких простых: у 85 % всех чисел есть делитель не больше 37, и их отсеивают за малую долю того, что стоит один раунд. Программа сверяется с решетом до ста тысяч, ловит ψ₉, перед которым пасуют основания 2 … 23, находит восемь самых больших простых, помещающихся в 64 бита, и считает простые в окне после 10¹⁸: их 2398 при ожидаемых по закону распределения простых 2413.

В олимпиадах тест пишут именно так: пробное деление на несколько малых простых, затем основания 2…37 или набор Синклера. Две частые ошибки: основание, кратное n, нужно пропустить, а не считать свидетелем (иначе 2 и 3 «окажутся» составными при основании 2 или 3), и в языках без длинных чисел произведение a * b % n для n около 10¹⁸ переполняется.

Сколько это стоит

Один раунд — одно возведение в степень: ⌊log₂ n⌋ возведений в квадрат и не больше стольких же домножений по модулю, плюс не больше s квадратов цепочки. Если числа длиной L = log n умножать столбиком, умножение стоит O(L²), и раунд — O(L³). Значит, k раундов — O(k log³ n). С умножением Карацубы показатель опускается до 2,585, с быстрым преобразованием Фурье — почти до двух. Перебор делителей до √n стоит √n = 10L/2 делений: каждые две новые цифры — вдесятеро дольше. Замер: простое число из d цифр, перебор против двадцати раундов теста.

Перебор идёт по прямой вверх: на Python каждые две цифры умножают время в десять раз, и 16-значное простое проверяется уже почти шесть секунд; 20-значное заняло бы около десяти минут, 30-значное — почти два года. Миллер — Рабин для 20-значного числа тратит меньше миллисекунды, для числа из 512 цифр — полсекунды на Python и 166 миллисекунд в Go. На длинных числах его линия идёт с наклоном между двумя и тремя: удвоили длину — время выросло в 5–8 раз в Python, а в Go с большим разбросом, от 3,5 до 11 раз. Теория обещает наклон 3 — двойка от умножения столбиком и единица от числа умножений; на таких длинах заметную долю времени съедают накладные расходы, которые растут медленнее.

Где тест ломается

Фиксированные основания против того, кто подбирает число. Проверка «по основаниям 2…41» надёжна для чисел меньше ψ₁₃ и совершенно ненадёжна для чисел, которые подобраны против неё: ψ₁₃ — уже такое число. Строить их можно и больше. Франсуа Арно в 1995 году опубликовал число Кармайкла из 397 цифр, которое проходит сильный тест по всем простым основаниям меньше 307. В 2018 году Мартин Альбрехт, Джейк Массимо, Кеннет Патерсон и Юрай Соморовски проверили криптографические библиотеки и построили составные числа, которые библиотеки принимали за простые: для OpenSSL — 2048-битные числа, которые в настройках по умолчанию проходили проверку с вероятностью 1/16 вместо обещанных 2−80; для GNU GMP — 1024-битные, которые всегда проходили с минимальным рекомендованным числом раундов; в Cryptlib, LibTomCrypt, JavaScript Big Number и WolfSSL — числа, которые проходили всегда. Опасность не теоретическая: противник подсовывает «простое» в параметрах Диффи — Хеллмана, и дискретный логарифм становится лёгким. В 2019 году OpenSSL добавил функцию проверки, у которой нельзя попросить слишком мало раундов: не меньше 64 для чисел до 2048 бит и 128 для более длинных; изменение ссылается на исследования Массимо и Патерсона.

Предсказуемые «случайные» основания. Оценка 4−k верна, только если основания выбраны случайно и независимо от n. Основания из генератора с известным зерном — те же фиксированные основания, просто их сложнее увидеть.

Защита. Авторы той работы советуют тест Бейли — PSW: один сильный раунд по основанию 2 плюс сильный тест Люка, проверка совсем другой природы. Числа, которое обмануло бы обе части сразу, не нашли до сих пор, а для всех чисел меньше 2⁶⁴ его отсутствие проверено. В документации Go прямо сказано, что ProbablyPrime точен на 100 % для чисел меньше 2⁶⁴, но не годится для чисел, которые мог подобрать противник.

Где он работает

  • Ключи. RSA нужны два случайных простых по 1024 бита и больше. Программа берёт случайное нечётное число, отсеивает его малыми простыми и проверяет тестом Миллера — Рабина, пока не встретит простое; как устроено отсеивание, рассказано в статье о решете Эратосфена. OpenSSL проверяет кандидатов не меньше чем 64 раундами.
  • Библиотеки. В Go big.Int.ProbablyPrime(n) делает n раундов с псевдослучайными основаниями и тест Бейли — PSW. В GMP mpz_probab_prime_p(n, reps) — пробные деления, Бейли — PSW и ещё reps − 24 раундов. В стандартной библиотеке Python проверки простоты нет, но тест пишется в десять строк на встроенной pow(a, d, n).
  • Разложение на множители. Вместе с ρ-алгоритмом Полларда тест раскладывает числа: кусок, который он назвал простым, дальше не делят.

История

Малая теорема Ферма известна с 1640 года, а в 1819 году Пьер Саррюс показал, что просто обратить её нельзя: 2341 ≡ 2 (mod 341), хотя 341 = 11 · 31. Тест с цепочкой квадратов предложил Гэри Миллер в 1976 году — детерминированный, но доказанный только при условии расширенной гипотезы Римана. В 1980 году Майкл Рабин превратил его в вероятностный тест, которому никакие гипотезы не нужны, и доказал оценку в четверть; тогда же и независимо её получил Луи Монье. В том же году Померанс, Селфридж и Вагстафф пересчитали все псевдопростые до 25·10⁹ и нашли первые ψk.

В 2002 году Маниндра Агравал, Нирадж Каял и Нитин Саксена построили детерминированный тест простоты с полиномиальным временем без всяких гипотез, и вопрос «можно ли проверить простоту быстро» был закрыт в теории. На практике по-прежнему бросают кости: тест Миллера — Рабина несравнимо быстрее, а его ошибку можно сделать сколь угодно малой.

Задачи

В первой задаче нужно найти все числа Кармайкла в окне далеко от нуля — и придумать, как не раскладывать на множители каждое число окна. Во второй — сосчитать лжецов числа по его разложению, то есть вывести формулу Монье самостоятельно, хотя бы для одного случая.

Числа Кармайкла в окне Сколько оснований лгут