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

Ссылка на Википедию выше хорошо подходит к математике Миллера-Рабина. Важной особенностью является то, что тест можно применять повторно со случайными значениями bases или k. Каждое выполнение теста с другим значением k снижает вероятность прохождения теста ложным простым числом. Верхний предел вероятности того, что будет сообщено ложное простое число, равен 4 в степени -k.

Тест в коде

Вы можете найти много примеров кода, реализующего Миллера-Рабина для разных языков. Я хотел версию JavaScript, которая использует новые собственные значения BigInt. Единственный код, который я нашел в Интернете, либо использовал целые числа, либо старую библиотеку, использующую пользовательские представления больших целых чисел.

В конце концов, я определил, что этот сайт имеет код JavaScript (в дополнение к реализациям на других языках), наиболее близкий к тому, что я хотел. Однако он использовал значения Integer, поэтому мне пришлось преобразовать его для использования значений BigInt. Это включало следующие шаги:

  1. Преобразование всех целочисленных литералов в нотацию «n»; например 2 становится 2н.
  2. Убедитесь, что нет смешанных операций Integer/BigInt.
  3. Математическая библиотека JavaScript не поддерживает BigInt; обойти это

Я прокомментировал приведенный ниже код (JML-) там, где были внесены необходимые изменения.

To test the test

В исходном коде есть генератор простых чисел ‹ 100. Это все хорошо, но я хочу генерировать БОЛЬШИЕ простые числа! Я создал приложение React именно для этого. Теперь я могу генерировать 25-значные простые числа за миллисекунды.

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

Дополнительные материалы на plainenglish.io