Тест Адлемана — Померанса — Румели

Материал из testwiki
Версия от 17:58, 16 мая 2023; imported>MBH (евклидово простое число)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Тест Адлемана-Померанса-Румели (или Адлемана-Померанца-Румели, тест APR) — наиболееШаблон:Sfn эффективный, детерминированный и безусловный на сегодняшний день тест простоты чисел, разработанный в 1983 году. Назван в честь его исследователей — Леонарда Адлемана, Карла Померанса и Шаблон:Iw. Алгоритм содержит арифметику в цикломатических полях.

Впоследствии алгоритм был улучшен Шаблон:Iw и Хендриком Ленстрой до APR-CL, время работы которого для любого числа n можно вычислить как O((lnn)clnlnlnn), где c — некоторая вычисляемая константа.

История

До 1980 года у всех известных алгоритмов проверки на простоту, за исключением вероятностных и недоказанных, временная сложность алгоритма была экспоненциальной. Однако в 1983 г. был разработан алгоритм, лежащий вблизи P-класса. Строго говоря, алгоритм не относится к этому классу, однако медленно растущая сложность O((lnn)clnlnlnn) позволяет практическое использование алгоритма.

К примеру, для числа n — гуголплекс, lnlnlnn5,44282

Шаблон:Цитата

Ключевые понятия

Евклидово простое число

Пусть имеется некоторое конечное множество 𝒥 простых чисел. Если для некоторого простого числа q выполнены следующие условия:

  1. q1 — свободное от квадратов число
  2. все простые делители q1 принадлежат множеству 𝒥

тогда q называется евклидовым простым числом относительно множества 𝒥.

Набор «начальных» простых чисел

Для заданного числа n построим множество 𝒥=𝒥(n) такое, что произведение всех евклидовых простых чисел относительно этого множества будет больше n. Выберем наименьшее возможное 𝒥(n).

Элементы p из этого множества назовем набором «начальных» простых чисел.

Indq(x)

Введем некоторое число Indq=Indq(x). Пусть tq — его первообразный корень. Тогда должно выполняться следующее условие:

xtqIndq(x)modq,

где (x,q)=1.

Замечание: В качестве Indq(x) выбираем наименьшее неотрицательное число.

Сумма Якоби

Суммой Якоби называют сумму следующего вида:

Ja,b=(x𝔏)pa(1x𝔏)pb,

где суммирование идет по всем наборам классов смежности для x в 𝐙[ζq]/𝔏, кроме тех, что равны 0,1mod𝔏.

Ключевые леммы

Основные леммыШаблон:Sfn, используемые при доказательстве корректности алгоритма:

Шаблон:Lemma

Простые идеалы из 𝐙[ζq], лежащие над главным идеалом (q) это: 𝔏i=(q,hi(ζq)) для всех i=1..g. Шаблон:/lemma

Шаблон:Lemma

Пусть n2 и имеет порядок f в группе (𝐙/p)*. Возьмем g=(p1)/f. Так же Φp(x)i=1ghi(x)modn, где hi(x) — многочлен в 𝐙[x] для каждого f. Будем считать, что идеалы 𝔄i=(n,hi(ζq)). Если r является простым делителем n, тогда в 𝐙[ζq]: (r)=i=1g(r,𝔄i), и каждое (r,𝔄i), делимое на некоторый простой идеал из 𝐙[ζq], лежит над (r).Шаблон:/lemma

Шаблон:Lemma

Возьмем p>2 и элементы α,γ𝐐(ζq) взаимно простые с λ и относительно друг друга. (αγ)p=(γα)p(α,γ)λ.

(,)λ — символ Гильберта. Шаблон:/lemma

Шаблон:Lemma

Если α1modλi,γ1modλj,i+jp+1, тогда (α,γ)λ=1.Шаблон:/lemma

Шаблон:Lemma

Выберем a,b𝐙 такие, что ab(a+b)≢0modp. Для u𝐙 положим: θa,b(u)=[a+bpu][apu][bpu], то есть θa,b(u)=0 или 1. Тогда Ja,b(𝔏)=u=1p1σu1(𝔄)θa,b(u).Шаблон:/lemma

Шаблон:Lemma[1].

Для всех a,b𝐙: Ja,b(𝔏)=1modλ2.Шаблон:/lemma

Шаблон:Lemma

Если p>2, то существуют такие a,b𝐙, что ab(a+b)≢0modp и θ^a,bu=1p1θa,b(u)u1≢0modp, где u1 — обратный элемент к umodp.Шаблон:/lemma

Шаблон:Lemma Пусть 𝔄,𝔄1 — идеалы в 𝐙[ζq] такие, что pN𝔄=N𝔄1 и пусть ,1 сопряженные простые идеалы, делящие 𝔄,𝔄1 соответственно. Пускай существует такое γ𝐙[ζq], что γ𝔄p0,1. Тогда для любого α1𝐙[ζq] выполняется:

γ𝔄pm=α1𝔄1p

и следовательно

γpm=α11p. Шаблон:/lemma

Идея алгоритма

Если n является составным числом, то оно имеет некий делитель r. Для проверки на простоту ищем это r1,rn.

Если нам известны значения Indq(r)modp для каждой пары p,q, то по китайской теореме об остатках мы можем найти r. Каждая пара p,q выбирается следующим образом: p𝒥(n), а q — простое евклидово число относительно 𝒥(n) такое, что p|q1.

В алгоритме перебираются все возможные значения Indq(r)modp для всех q, исходя из того, что известно только одно q.

Алгоритм

Ввод: целое число n > 1.

A. Шаг подготовки

1. Вычисляем наименьшее положительное число f(n) свободное от квадратов, такое что: q1|f(n)qprimeq>n.

Определим множество «начальных» простых чисел, являющиеся делителями f(n). Назовем q евклидовым простым числом, если q простое и q1|f(n)

2. Проверим — делится ли n на любое «начальное» или евклидово простое число. Если делитель найдется, причем не равный n, то объявляем n составным и прерываем алгоритм. Иначе вычислим наименьший положительный первообразный корень tq для каждого евклидового простого числа q.

3. Для каждого «начального» простого числа p>2 найдем числа a,b такие, что:

0<a,b<p,

a+b0modp,

θ^a,b=u=1p1θa,b(u)u10modp.

Для p=2 примем a=b=θ^a,b=1.

4. Для каждого «начального» и евклидового простых чисел, таких что p|q1 зафиксируем простой идеал:

𝔏q=(q,ζqtq(q1)/p),

где q принадлежит 𝖹[ζq]ζq=e2πi/p — корень из единицы.

Вычислим сумму Якоби Jp(q)𝐐(ζq):

если p=2:Jp(q)=q,

если p>2:Jp(q)=Ja,b(𝔏q)=x=2q1(x𝔏q)pa(1x𝔏q)pb.

B. Шаг вычислений

1. Для каждого «начального» простого числа p найдем НОД в 𝐐(ζq) для n и набора σJp(q), где q пробегает все значения евклидовых простых чисел, причем p|q1, а σ пробегает по всем значениям из Gal(𝐐(ζq)/𝐐). Тогда либо выносим решение о том, что n составное, либо строим надлежащий идеал 𝔄 в кольце 𝐙[ζq], а также находим числа s и j(σ,q), 1j(σ,q)p такие, что:

(σJp(q))(nf1)/psζqj(σ,q)mod𝔄,

p(nf1)/ps или некоторое из ζqj(σ,q)1, где f=nmodp.

2. Для каждого «начального» простого числа p сделаем следующее: если для некоторого j(σ0,q0)p, тогда возьмем γ=σ0Jp(q0). В этом ключе построим числа m(σ,q) для всех σ,q, 0m(σ,q)p1 и такие, что:

(γ(nf1)/ps)m(σ,q)(σJp(q))(nf1)/psmod𝔄.

Если же для всех j(σ,q)=p, примем m(σ,q)=0.

C. Шаг объединения результатов

Проделаем шаги 1-4 для всех натуральных k,1kf(n).

1. Для каждого q>2 вычислим по китайской теореме об остатках вычислим числа I(k,q):

I(k,q)=kθ^a,b1j=1p1jm(σj1,q)modp,

при всевозможных p, что p|q1. Так же положим, что I(k,2)=1.

2. Для каждого q посчитаем наименьшее целое, положительное число r(k,q)tqI(k,q)modq.

3. Используя Китайскую теорему об остатках, вычислим наименьшее положительное число r(k) такое, что r(k)r(k,q)modq для каждого q.

4. Если r(k)1,r(k)n,r(k)|n, тогда объявляем n составным. Иначе переходим к следующему k.

5. Объявляем n простым.

Оценка сложности

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

Шаблон:Theorem Для значений n>1 вышеупомянутый алгоритм правильно определяет будет ли n простым или составным за время T(n). И справедливы следующие оценки: f(n)T(n), для простых n, T(n)fc1(n), для всех значения n. Где c1 — положительная, вычисляемая константа.Шаблон:/theorem

Шаблон:Theorem Существуют такие положительные, вычисляемые константы c2,c3, что для всех n>100: (ln(n))c2lnlnln(n)<f(n)<(ln(n))c3lnlnln(n)Шаблон:/theorem

Программная реализация

Примечания

Шаблон:Примечания

Список литературы