Миллер-Рабин: проверка простоты
Свидетели составности отсеивают за O(k·log³ n).
1function isPrime(n: number, bases = [2, 3, 5, 7]): boolean {2 if (n < 2) return false3 for (const b of bases) {4 if (n === b) return true5 if (n % b === 0) return false6 }7 8 // n − 1 = 2^s · d9 let d = n - 1, s = 010 while (d % 2 === 0) { d /= 2; s++ }11 12 for (const a of bases) {13 let x = power(a, d, n) // a^d mod n14 if (x === 1 || x === n - 1) continue15 let ok = false16 for (let i = 0; i < s - 1; i++) {17 x = (x * x) % n18 if (x === n - 1) { ok = true; break }19 }20 if (!ok) return false // свидетель составности21 }22 return true23}Проблема
Свидетели составности отсеивают за O(k·log³ n).
Что вы видите
n−1 = 2^s·d; если a^d не даёт ±1 и цепочка квадратов не доходит до n−1 — составное.
Как это работает
Вероятностный тест: каждый свидетели ловит ≥3/4 составных. Для n < 3.3M базы 2,3,5,7 дают детерминизм. RSA генерирует простые так.
Пошаговый разбор
- 01
Разложение
n−1 = 2^s · d.
- 02
База
a^d mod n.
- 03
Цепочка
Квадраты до n−1?
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
RSA
Генерация ключей.
Криптография
Тесты простоты повсюду.
Хеш-таблицы
Простые размеры.
Связанные алгоритмы
«RSA: как рождаются простые»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.