Тест на первичность - Primality test

А тест на простоту является алгоритм для определения того, является ли входной номер премьер. Среди других областей математика, он используется для криптография. В отличие от целочисленная факторизация, тесты на простоту обычно не дают главные факторы, только указав, является ли введенное число простым или нет. Считается, что факторизация представляет собой сложную в вычислительном отношении проблему, в то время как проверка простоты сравнительно проста (ее Продолжительность является многочлен в размере ввода). Некоторые тесты на простоту доказывать что одно число простое, а другим нравится Миллер – Рабин доказать, что число составной. Следовательно, последнее можно было бы точнее назвать тесты на составность вместо тестов на простоту.

Простые методы

Самый простой тест на простоту судебное отделение: задан входной номер, п, проверьте, равномерно ли делимый любым простое число от 2 до п (т.е. что деление не оставляет остаток ). Если да, то п является составной. В противном случае это премьер.[1]

Например, рассмотрим число 100, которое без остатка делится на эти числа:

2, 4, 5, 10, 20, 25, 50

Обратите внимание, что наибольший фактор, 50, равен половине 100. Это верно для всех п: все делители меньше или равны п / 2.

Фактически, когда мы проверяем все возможные делители с точностью до п / 2, мы обнаружим некоторые факторы дважды. Чтобы заметить это, перепишите список делителей как список продуктов, каждый из которых равен 100:

2 × 50,   4 × 25,   5 × 20,   10 × 10,   20 × 5,   25 × 4,   50 × 2

Обратите внимание, что прошлые продукты 10 х 10 просто повторяйте числа, которые использовались в более ранних продуктах. Например, 5 х 20 и 20 х 5 состоят из одинаковых чисел. Это верно для всех п: все уникальные делители п числа меньше или равны п, поэтому нам не нужно искать дальше.[1] (В этом примере п = 100 = 10.)

Все четные числа больше 2 также могут быть исключены, поскольку, если четное число может делить пи 2.

Давайте воспользуемся пробным делением, чтобы проверить простоту числа 17. Нам нужно проверить только делители до п, т.е. целые числа, меньшие или равные , а именно 2, 3 и 4. Мы можем пропустить 4, потому что это четное число: если бы 4 могло равномерно разделить 17, 2 тоже бы, а 2 уже есть в списке. Остается 2 и 3. Мы делим 17 на каждое из этих чисел и обнаруживаем, что ни одно из них не делит 17 поровну - оба деления оставляют остаток. Итак, 17 - простое число.

Мы можем улучшить этот метод и дальше. Обратите внимание, что все простые числа больше 3 имеют вид 6k ± 1, где k любое целое число больше 0. Это потому, что все целые числа могут быть выражены как (6k + я), где я = −1, 0, 1, 2, 3 или 4. Обратите внимание, что 2 делит (6k + 0), (6k + 2) и (6k + 4) и 3 делит (6k + 3). Итак, более эффективный метод - проверить, п делится на 2 или 3, то для проверки всех чисел вида . Это в 3 раза быстрее, чем проверка всех чисел до п.

Обобщая далее, все простые числа больше c# (c первобытный ) имеют вид c# · к + я, за я < c#, куда c и k целые числа и я представляет числа, которые совмещать к c #. Например, пусть c = 6. потом c# = 2 · 3 · 5  = 30. Все целые числа имеют вид 30k + я за я = 0, 1, 2,...,29 и k целое число. Однако 2 делит 0, 2, 4, ..., 28; 3 делит 0, 3, 6, ..., 27; а 5 делит 0, 5, 10, ..., 25. Таким образом, все простые числа больше 30 имеют вид 30k + я за я = 1, 7, 11, 13, 17, 19, 23, 29 (т.е. для я < 30 такой, что gcd (я,30) = 1). Обратите внимание, что если я и 30 не были взаимно простыми, тогда 30k + я делится на простой делитель 30, а именно на 2, 3 или 5, и поэтому не будет простым. (Примечание. Не все числа, удовлетворяющие указанным выше условиям, являются простыми. Например: 437 имеет форму c # k + i для c # (7) = 210, k = 2, i = 17. Однако 437 является составным число, равное 19 * 23).

В качестве c → ∞, количество значений, которые c#k + я может занять определенный диапазон, уменьшается, и поэтому время для проверки п уменьшается. Для этого метода также необходимо проверить делимость на все простые числа, меньшие чем c. Можно применить наблюдения, аналогичные предыдущим. рекурсивно, давая Сито Эратосфена.

Хороший способ ускорить эти методы (и все другие, упомянутые ниже) - это предварительно вычислить и сохранить список всех простых чисел до определенной границы, скажем, всех простых чисел до 200 (такой список можно вычислить с помощью Сито Эратосфена или алгоритмом, который проверяет каждый инкрементальный м против всех известных простых чисел < м). Затем перед тестированием п за примитивность серьезным методом, п сначала можно проверить на делимость на любое простое число из списка. Если он делится на любое из этих чисел, то он составной, и любые дальнейшие тесты можно пропустить.

Простой, но очень неэффективный тест на простоту использует Теорема Вильсона, в котором говорится, что п является простым тогда и только тогда, когда:

Хотя этот метод требует около п модульные умножения, делающие его непрактичным, теоремы о простых числах и модульных вычетах составляют основу многих других практических методов.

Код Python

Ниже приводится простой тест на простоту в Код Python используя простой 6k ± 1 оптимизация, упомянутая ранее. Более сложные методы, описанные ниже, намного быстрее для больших п.

def is_prime(п: int) -> bool:    "" "Тест первичности с использованием оптимизации 6k + -1." ""    если п <= 3:        вернуть п > 1    если п % 2 == 0 или п % 3 == 0:        вернуть Ложь    я = 5    пока я ** 2 <= п:        если п % я == 0 или п % (я + 2) == 0:            вернуть Ложь        я += 6    вернуть Истинный

Эвристические тесты

Это тесты, которые кажутся хорошо работающими на практике, но недоказанными и поэтому, технически говоря, вовсе не являются алгоритмами. Тест Ферма и тест Фибоначчи - простые примеры, и они очень эффективен в сочетании. Джон Селфридж предположил, что если п нечетное число и п ≡ ± 2 (mod 5), то п будет простым, если выполняются оба следующих условия:

  • 2п−1 ≡ 1 (мод п),
  • жп+1 ≡ 0 (мод п),

где жk это k-го Число Фибоначчи. Первое условие - это проверка простоты Ферма по основанию 2.

В общем, если п ≡ a (мод Икс2+4), где а - квадратичный невычет (mod Икс2+4) затем п должно быть простым, если выполняются следующие условия:

  • 2п−1 ≡ 1 (мод п),
  • ж(Икс)п+1 ≡ 0 (мод п),

ж(Икс)k это k-го Многочлен Фибоначчи в Икс.

Селфридж, Карл Померанс, и Самуэль Вагстафф вместе предлагают 620 долларов за контрпример. По состоянию на 11 сентября 2015 г. проблема все еще не решена.[2]

Вероятностные тесты

Вероятностные тесты являются более строгими, чем эвристика, в том смысле, что они обеспечивают доказуемые границы вероятности того, что вас обманут составным числом. Многие популярные тесты на простоту являются вероятностными. Эти тесты используют, помимо протестированного числа п, некоторые другие числа а которые выбираются случайным образом из некоторых пространство образца; обычные рандомизированные тесты на простоту никогда не сообщают простое число как составное, но возможно составное число как простое. Вероятность ошибки можно уменьшить, повторив тест с несколькими независимо выбранными значениями а; для двух обычно используемых тестов, для любой составной п как минимум половина а's обнаружить п'композиционность, поэтому k повторения уменьшают вероятность ошибки максимум до 2k, который можно сделать сколь угодно малым, увеличив k.

Базовая структура рандомизированных тестов на простоту выглядит следующим образом:

  1. Случайно выберите номер а.
  2. Проверить некоторое равенство (соответствующее выбранному тесту) с участием а и данное число п. Если равенство не выполняется, то п составное число, а известен как свидетель на композицию, и тест останавливается.
  3. Повторяйте с шага 1 до тех пор, пока не будет достигнута требуемая точность.

После одной или нескольких итераций, если п не является составным числом, тогда его можно объявить наверное премьер.

Тест на простоту Ферма

Простейший вероятностный тест на простоту - это Тест на простоту Ферма (собственно тест на композицию). Это работает следующим образом:

Учитывая целое число п, выберите целое число а взаимно простой с п и рассчитать ап − 1 по модулю п. Если результат отличается от 1, то п составной. Если это 1, то п может быть простым.

Если ап−1 (по модулю п) равно 1, но п не простое, тогда п называетсяпсевдопремия основать а. На практике мы наблюдаем, что еслиап−1 (по модулю п) равно 1, то п обычно простое. Но вот контрпример: если п = 341 и а = 2, то

хотя 341 = 11 · 31 составное. Фактически, 341 - это наименьшее псевдопростое основание 2 (см. Рис.[3]).

Есть только 21853 псевдопреступников с основанием 2, которые меньше 2,5.×1010 (см. стр. 1005 из [3]). Это означает, что для п до 2,5×1010, если 2п−1 (по модулю п) равно 1, то п простое, если только п является одним из этих 21853 псевдопреступлений.

Некоторые составные числа (Числа Кармайкла ) обладают тем свойством, что ап − 1 равно 1 (по модулю п) для каждого а это взаимно просто с п. Самый маленький пример: п = 561 = 3 · 11 · 17, для чего а560 равно 1 (по модулю 561) для всех а совпадает с 561. Тем не менее, тест Ферма часто используется, если требуется быстрый скрининг чисел, например, на этапе генерации ключей Криптографический алгоритм с открытым ключом RSA.

Критерий простоты Миллера – Рабина и Соловея – Штрассена

В Тест на простоту Миллера – Рабина и Тест на простоту Соловея – Штрассена более сложные варианты, которые обнаруживают все композиты (опять же, это означает: для каждый составное число п, не менее 3/4 (Миллер – Рабин) или 1/2 (Соловей – Штрассен) чисел а являются свидетелями составности п). Это тоже тесты на композитность.

Тест простоты Миллера – Рабина работает следующим образом: дано целое число п, выберите некоторое положительное целое число а < п. Пусть 2sd = п - 1, где d странно. Если

и

для всех

тогда п составной и а является свидетельством композиционности. Иначе, п могут быть или не быть простыми. Тест Миллера – Рабина - это сильная псевдопремия тест (см. PSW[3] стр.1004).

В тесте на простоту Соловея – Штрассена используется еще одно равенство: дано нечетное число п, выберите целое число а < п, если

, где это Символ Якоби,

тогда п составной и а является свидетельством композиционности. Иначе, п могут быть или не быть простыми. Тест Соловея – Штрассена Псевдопрям Эйлера тест (см. PSW[3] стр.1003).

Для каждого индивидуального значения а, критерий Соловея – Штрассена слабее критерия Миллера – Рабина. Например, если п = 1905 и а = 2, то тест Миллера-Рабина показывает, что п является составным, а тест Соловея – Штрассена - нет. Это связано с тем, что 1905 год является основанием 2 псевдопростого числа Эйлера, но не сильным основанием псевдопростого числа 2 (это показано на рис.[3]).

Тест на простоту Фробениуса

Тесты на простоту Миллера – Рабина и Соловея – Штрассена просты и намного быстрее других общих тестов на простоту. В некоторых случаях одним из методов дальнейшего повышения эффективности является Тест псевдопримальности Фробениуса; один цикл этого теста занимает примерно в три раза больше времени, чем цикл Миллера – Рабина, но дает оценку вероятности, сравнимую с семью этапами Миллера – Рабина.

Тест Фробениуса является обобщением Лукас псевдопрайм тестовое задание.

Тест на простоту Baillie-PSW

В Тест на простоту Baillie – PSW это вероятностный тест на простоту, который сочетает в себе тест Ферма или Миллера – Рабина с Лукас вероятный премьер test, чтобы получить тест на простоту, не имеющий известных контрпримеров. То есть нет известных составных п для которого этот тест сообщает, что п наверное премьер.[4] Было показано, что нет контрпримеров для п .

Другие тесты

Леонард Адлеман и Мин-Дэ Хуанг представил безошибочный (но ожидаемый полиномиальный) вариант критерий простоты эллиптической кривой. В отличие от других вероятностных тестов, этот алгоритм дает свидетельство о первичности, и, таким образом, может использоваться для доказательства простоты числа.[5] На практике алгоритм работает слишком медленно.

Если квантовые компьютеры были доступны, простота могла быть проверена асимптотически быстрее чем на классических компьютерах. Сочетание Алгоритм Шора, метод целочисленной факторизации, с Тест на простоту поклингтона может решить проблему в .[6]

Быстрые детерминированные тесты

Ближе к началу 20 века было показано, что следствие Маленькая теорема Ферма может использоваться для проверки на простоту.[7] Это привело к Тест на простоту поклингтона.[8] Однако, поскольку этот тест требует частичного факторизация из п - 1 в худшем случае время работы все еще было довольно медленным. Первый детерминированный тест на простоту значительно быстрее, чем наивные методы, был тест на циклотомию; его время выполнения может быть доказано О ((журналп)c журнал журнал журналп), где п число для проверки на простоту и c постоянная, не зависящая от п. Было сделано много дальнейших улучшений, но ни одно из них не имеет полиномиального времени работы. (Обратите внимание, что время работы измеряется размером входных данных, который в данном случае составляет ~ logп, то есть количество битов, необходимых для представления числа п.) критерий простоты эллиптической кривой можно доказать, что он работает за O ((logп)6), если предположить аналитическая теория чисел верны.[который? ] Точно так же под обобщенная гипотеза Римана, детерминированный Проба Миллера, который составляет основу вероятностного критерия Миллера – Рабина, можно доказать, что он работает в Õ ((журналп)4).[9] На практике этот алгоритм медленнее двух других для размеров чисел, с которыми вообще можно иметь дело. Поскольку реализация этих двух методов довольно сложна и создает риск ошибок программирования, часто предпочтительны более медленные, но более простые тесты.

В 2002 году первый доказуемо безусловный детерминированный полиномиальный тест на простоту был изобретен Маниндра Агравал, Нирадж Каял, и Нитин Саксена. В Тест на простоту AKS выполняется в Õ ((logп)12) (улучшено до Õ ((logп)7.5)[10] в опубликованной версии их статьи), которая может быть сокращена до Õ ((logп)6) если Гипотеза Софи Жермен правда.[11] Впоследствии Ленстра и Померанс представили версию теста, которая выполняется во времени Õ ((logп)6) безоговорочно.[12]

Агравал, Каял и Саксена предлагают вариант своего алгоритма, который будет работать в Õ ((logп)3) если Гипотеза Агравала правда; однако эвристический аргумент Хендрика Ленстры и Карла Померанса предполагает, что он, вероятно, неверен.[10] Модифицированная версия гипотезы Агравала, гипотеза Агравала – Поповича,[13] все еще может быть правдой.

Сложность

В теория сложности вычислений, формальный язык, соответствующий простым числам, обозначается как PRIMES. Легко показать, что PRIMES в Co-NP: его дополнение КОМПОЗИТЫ находится в НП потому что можно определить составность, недетерминированно угадав фактор.

В 1975 г. Воан Пратт показали, что существует сертификат простоты, который можно проверить за полиномиальное время, и, таким образом, PRIMES был в НП, и поэтому в NP ∩ coNP. Видеть свидетельство о первичности для подробностей.

Последующее открытие алгоритмов Соловея – Штрассена и Миллера – Рабина поместило PRIMES в coRP. В 1992 году алгоритм Адлемана – Хуанга[5] уменьшил сложность до ЗПП = RP ∩ coRP, который заменил результат Пратта.

В Тест на простоту Адлемана – Померанса – Рамли с 1983 г. ставил ПРИМЕС в QP (квазиполиномиальное время ), который, как известно, не сопоставим с упомянутыми выше классами.

Из-за его управляемости на практике, алгоритмов с полиномиальным временем, предполагающих гипотезу Римана, и других подобных доказательств долгое время подозревали, но не доказали, что простота может быть решена за полиномиальное время. Существование Тест на простоту AKS наконец-то решил этот давний вопрос и поместил ПРИМЕРЫ в п. Однако PRIMES, как известно, не P-полный, и неизвестно, лежит ли он в классах, лежащих внутри п такие как NC или L. Известно, что PRIMES нет в AC0.[14]

Теоретико-числовые методы

Существуют определенные теоретико-числовые методы проверки того, является ли число простым, например Тест Лукаса и Тест прота. Эти тесты обычно требуют факторизации п + 1, п - 1 или аналогичное количество, что означает, что они бесполезны для проверки простоты общего назначения, но они часто довольно эффективны, когда проверяемое число п как известно, имеет особую форму.

Тест Лукаса основан на том, что мультипликативный порядок из числа а по модулю п является п - 1 за прайм п когда а это примитивный корень по модулю n. Если мы сможем показать а примитивен для п, мы можем показать п простое.

Рекомендации

  1. ^ а б Ризель (1994), стр. 2-3
  2. ^ Джон Селфридж # Гипотеза Селфриджа о проверке на первичность.
  3. ^ а б c d е Карл Померанс; Джон Л. Селфридж; Сэмюэл С. Вагстафф-мл. (Июль 1980 г.). «Псевдопреступности до 25 · 109" (PDF). Математика вычислений. 35 (151): 1003–1026. Дои:10.1090 / S0025-5718-1980-0572872-7.
  4. ^ Роберт Бэйли; Сэмюэл С. Вагстафф-мл. (Октябрь 1980 г.). "Лукас Псевдопримес" (PDF). Математика вычислений. 35 (152): 1391–1417. Дои:10.1090 / S0025-5718-1980-0583518-6. Г-Н  0583518.
  5. ^ а б Адлеман, Леонард М.; Хуанг, Мин-Дэ (1992). Проверка примитивности и абелевы многообразия над конечным полем. Конспект лекций по математике. 1512. Springer-Verlag. ISBN  3-540-55308-8.
  6. ^ Chau, H. F .; Ло, Х.-К. (1995). «Проверка первичности с помощью квантовой факторизации». arXiv:Quant-ph / 9508005.
  7. ^ Поклингтон, Х.С. (1914). «Определение простого или составного характера больших чисел по теореме Ферма». Cambr. Фил. Soc. Proc. 18: 29–30. JFM  45.1250.02.
  8. ^ Вайсштейн, Эрик В. «Теорема Поклингтона». MathWorld.
  9. ^ Гэри Л. Миллер (1976). «Гипотеза Римана и тесты на примитивность». Журнал компьютерных и системных наук. 13 (3): 300–317. Дои:10.1016 / S0022-0000 (76) 80043-8.
  10. ^ а б Агравал, Маниндра; Каял, Нирадж; Саксена, Нитин. «Штрих находится в букве P» (PDF). Анналы математики. Дои:10.4007 / анналы.2004.160.781.
  11. ^ Агравал, Маниндра; Каял, Нирадж; Саксена, Нитин (2004). "ПРИМЕРЫ находится в P" (PDF). Анналы математики. 160 (2): 781–793. Дои:10.4007 / анналы.2004.160.781.
  12. ^ Карл Померанс и Хендрик В. Ленстра (20 июля 2005 г.). «Проверка примитивности с гауссовыми периодами» (PDF).
  13. ^ Попович, Роман (30 декабря 2008 г.). «Заметка о гипотезе Агравала» (PDF).
  14. ^ Э. Аллендер, М. Сакс, И.Э. Шпарлинский, Нижняя оценка простоты, J. Comp. Syst. Sci. 62 (2001), стр. 356–366.

Источники

внешняя ссылка