Тест Люка — Лемера

Матеріал з testwiki
Версія від 19:22, 21 жовтня 2024, створена imported>Dimma837 (вікіфікація)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Тест Люка — Лемера — ефективний тест простоти для чисел Мерсенна. Завдяки цьому тесту найбільшими відомими простими числами завжди були прості числа Мерсенна, причому навіть до появи комп'ютерів[1].

Історія

Тест був запропонований французьким математиком Люка 1878 року і доповнений американським математиком Шаблон:Не перекладено 1930 року. Отриманий тест носить ім'я двох вчених, які спільно відкрили його, навіть не зустрічаючись за життя. 1952 року Робінсон за підтримки Лемера провів обчислення на комп'ютері SWAC з використанням тесту Люка — Лемера, результатом якого стало відкриття простих чисел M521 і M607. Пізніше того ж року були відкриті M1279, M2203 і M2281[1].

Тест

Тест Люка — Лемера базується на тому спостереженні, що простота числа Мерсенна Mq=2q1 тягне простоту числа q, і в наступному твердженні: Шаблон:Рамка Нехай q — просте число, причому q3. визначимо послідовність Ln таким чином:

L0=4,
Ln+1=Ln22.

Тоді Mq — просте тоді і тільки тоді, коли Lq20(modMq). Шаблон:/рамка

Для встановлення простоти Mp послідовність чисел L0,L2,,Lq2 обчислюється по модулю числа Mq (тобто обчислюються не власне числа Lk, довжина яких росте експоненціально, а остачі від ділення Lk на Mq, довжина яких обмежена p бітами). Останнє число в цій послідовності Lq2modMq називається вирахуванням Люка — Лемера. Таким чином, число Мерсенна Mq є простим тоді і тільки тоді, коли число q просте, і вирахування Люка — Лемера дорівнює нулю.

Можливими значеннями L0 є: 4, 10, 52, 724, 970, 10084, …

Обчислювальна складність

Обчислювальна складність тесту для числа Mq=2q1 дорівнює O(q3)[2], оскільки в процесі тесту виконується O(q) піднесення до квадрату та вирахувань по модулю Mq. Довжина Mq становить q біт, причому найпростіший алгоритм множення чисел має складність O(q2). Для прискорення тесту слід використовувати алгоритми швидкого множення великих цілих чисел, наприклад, алгоритм Шьонхаге — Штрассена. Складність тесту в такому випадку становитиме O(q2logqloglogq).

Приклади

Розглянемо виконання тесту для числа Мерсенна M13=8191.

L0=4
L1=422mod8191=14
L2=1422mod8191=194
L3=19422mod8191=4870
L4=487022mod8191=3953
L5=395322mod8191=5970
L6=597022mod8191=1857
L7=185722mod8191=36
L8=3622mod8191=1294
L9=129422mod8191=3470
L10=347022mod8191=128
L11=12822mod8191=0

Отже, число M13=8191 — просте.

Доведення

Теорема: Нехай q — просте число, причому q3. Визначимо послідовність Ln таким чином:

L0=4,
Ln+1=(Ln22)mod(2q1).

Тоді 2q1 — просте тоді і тільки тоді, коли Lq2=0.

Доведення теореми засновано на властивостях послідовностей Люка Un=Un(4,1) і Vn=Vn(4,1):

U0=0,U1=1,Un+1=4UnUn1
V0=2,V1=4,Vn+1=4VnVn1

Такі властивості доводяться по індукції:

Vn=Un+1Un1
Un=112((2+3)n(23)n)
Vn=(2+3)n+(23)n
Um+n=UmUn+1Um1Un

Лема: Нехай p — просте і e1, тоді справедливе наступне твердження. Якщо Un0(modpe), то Unp0(modpe+1).

Доказ леми: Покладемо Un=bpe, Un+1=a. Використовуємо вище описані властивості, щоб отримати значення для U2n і U2n+1:

U2n=bpe(2a4bpe)2aUn(modpe+1), в той час як U2n+1=Un+12Un2a2(modpe+1).

Тим же способом отримаємо:

U3n=U2n+1UnU2nUn1(3a2)Un(modpe+1) і U3n+1=U2n+1Un+1U2nUna3(modpe+1).

Інакше кажучи,

Ukn(kak1)Un(modpe+1) і Ukn+1ak(modpe+1),

звідки випливає твердження леми, якщо взяти k=p.

Далі, розкривається вираз послідовностей за формулою біному Ньютона:

Un=k(n2k+1)2n2k13k,
Vn=k(n2k)2n2k+13k.

Тепер, якщо ми покладемо n=p, де p — просте число, більше 2, і врахуємо, що (nk) кратне p за винятком тих випадків, коли k=0 і k=n, ми отримаємо:

Up3(p1)/2(modp), Vp4(modp).

Якщо p3 теорема Ферма стверджує, що 3p11(modp). Тому (3(p1)/21)(3(p1)/2+1)0(modp), тобто 3(p1)/2±1(modp). Якщо Up1(modp), то

Up+1=4UpUp1=4Up+VpUp+1Up+1(modp),

тобто Up+1=0(modp). У той же спосіб отримується результат, що Up1=0(modp), якщо Up=1. Отже доведено, що для будь-якого простого числа, існує ціле число ε(p)1 таке, що Up+ε(p)=0(modp).

Лема: Якщо N — додатне ціле число, і m=m(N) — найменше число таке, що Um(N)0(modN), то ми маємо:

Un0(modN) тоді і тільки тоді, коли n кратне m(N).

Доведення: Зауважимо, що послідовність Un,Un+1,Un+2,... збігається з послідовністю aU0,aU1,aU2,... по модулю M, де число a=Um+1modN взаємно просте з N, так як: gcd(Un,Un+1)=1.

Доведення теореми: По індукції маємо

Ln=V2nmod(2q1).

Більш того, з 2Un+1=4Un+Vn слідує, що gcd(Un,Vn)2. Звідси слід, що Un і Vn не мають загальних непарних дільників. Якщо Lq2=0, то для U2q1 і U2q2 можна записати:

U2q1=U2q2V2q20(mod2q1)
U2q2≢0(mod2q1)

Тепер, якщо m=m(2q1), то m повинно бути дільником числа 2q2, але не повинно ділити 2q2, тому m=2q1. Доведемо, що n=2q1. Нехай n=p11e...prre. Числа pj більше 3, так як n непарне і виконується n=2q1(1)q1=2(mod3), q — просте за умовою. Використовуючи раніше доведені леми, отримаємо Ut0(mod2q1), де

t=lcm(p1e11(p1+ε1),,prer1(pr+εr))

де εj=±1. Звідси випливає, що t кратне m=2q1. Покладемо n0=j=1rpjej1(pj+εj); n0j=1rpjej1(pj+1/5pj)=(6/5)rn. Так як pj+εj — парне, tn0/2r1. Використовуємо раніше доведені факти і отримаємо mt2(3/5)rm<4(3/5)rm<3m; отже r2 і t=m або t=2m. Зауважимо, що t — ступінь двійки. Звідси випливає, що e1=1 і er=1. Якщо n — складене, то має бути n=2q1=(2k+1)(2l1), де 2k+1 і 2l1 — прості числа. Подальше розкладання на прості числа, якщо q — непарне, неможливо, тому n — просте.

Навпаки, припустимо, що n=2q1 — просте. Покажемо, що V2q20(modn). Для цього достатньо показати, що V2q12(modn), так як V2q1=(V2q22)2.

V2q1=(2+62)n+1+(262)n+1=2nk(n+12k)2n+12k62k=2(1n)/2k(n+12k)3k.

Так як n — просте, то біноміальний коефіцієнт (n+12k)=(n2k)+(n2k1) ділиться на n крім тих випадків, коли k=0 чи k=(n+1)/2. Отже:

2(n1)/2V2q11+3(n+1)/2(modn).

Тут 2(2(q+1)/2)2(modn), тому 2(n1)/2(2(q+1)/2)n11(modn) за малої теореми Ферма. Нарешті, використовуючи найпростіший випадок квадратичного закону взаємності, покажемо, що 3(n1)/21(modn), так як nmod3=1 і nmod4=3. Це значить, що V2q12, так що V2q20. [3]

Псевдокод

Lucas–Lehmer(p)
    var s = 4
    var M = 2p — 1
    repeat p — 2 times:
        s = ((s × s) — 2) mod M
    if s = 0 return PRIME else return COMPOSITE

Модифікації

Для чисел виду k2n1, де 2n>k існує Шаблон:Не перекладено, розроблена Шаблон:Iw. Можливо узагальнення тесту для чисел виду A22n+B2n1[4]. Також існує більш загальний варіант — тест Люка, який застосовний для будь-якого натурального числа N, якщо відоме розкладання на прості множники числа N1.

Застосування

Завдяки тесту Люка — Лемера прості числа Мерсенна утримують лідерство як найбільші відомі прості числа[5]. Саме тест Люка — Лемера лежить в основі проекту розподілених обчислень GIMPS, що шукає нові прості числа Мерсенна.

Див. також

Примітки

Шаблон:Примітки

Література

Шаблон:Алгоритми теорії чисел