Квадратичне решето

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Квадратичне решето (Шаблон:Lang-en) — алгоритм факторизації цілих чисел, на практиці найшвидший для чисел до 10100. Асипмтотично є другим за швидкістю після загального решета цифрового поля, і значно простіший за нього. Це метод факторизації загального призначення, тобто, час його виконання залежить лише від розміру цілого числа на вході, і не залежить від його вигляду (на відміну від Шаблон:Нп). Метод винайшов математик Шаблон:Нп 1981 року як поліпшення лінійного решета Шроппеля.[1]

Вступ

Візьмемо, наприклад, число 2419. Це число складене і не ділиться на жодне з малих простих чисел. Але можна побачити, що це 250081, тобто 2419=50292. Отже ми можемо розкласти 2419 як різницю квадратів. Це є (509)(50+9) або 41×59. Кожне непарне складене число можна розкласти як різницю квадратів:

n=pq=(p+q2)2(pq2)2.

Спробуймо знов з числом 1649. Воно також складене і не має малих простих дільників, менших ніж його логарифм. З 2419 ми взяли перший квадрат більший від нього, а саме 502 і тоді зауважили, що 5022419=81, що є квадратом. Можна подумати, що в пошуці квадратів можна пройти послідовність x2n з x=n1/2,n1/2+1,. Для n=1649 маємо:

412n=32,
422n=115,

Шаблон:NumBlk

і не бачимо квадратів поміж перших результатів.

Попри цю невдачу, попередні три рівняння вже можна використати для розкладення n. Хоча ані 32, ані 200 не є квадратами, однак їхній добуток — квадрат, а саме 802. отже з того, що

41232(modn),
432200(modn),

маємо 412×432802(modn), що рівнозначно Шаблон:NumBlk Ми знайшли розв'язок для a2b2(modn). Наскільки це цікаво? Звісно існує багато нецікавих пар a2b2(modn). А саме, якщо взяти будь-яке значення a і покласти b=±a. Але цей перелік не вичерпує всі розв'язки для цього рівняння, бо розкладення n як різницю квадратів дало б пару a,b з b=±a. Далі, будь-яка пара a,b з Шаблон:NumBlk має вести до нетривіального розкладу n, через gcd(ab,n). Справді, з Шаблон:EquationNote випливає, що n ділить (ab)(a+b), але не ділить жоден з множників, отже gcd(ab,n),gcd(a+b,n) мають бути нетривіальними дільниками n. НСД можна знайти через алгоритм Евкліда. Зрештою, якщо n має щонайменше два простих множники, тоді не менше половини розв'язків a2b2(modn) з ab взаємно простим з n також задовольняють b≢±a(modn), що і є Шаблон:EquationNote.

Доведення
Для степені непарного простого pu, конгруентність y21(modpu) має рівно 2 розв'язки, отже з того, що n ділимо не менш як двома різними непарними простими, конгруенція y21(modn) має щонайменше 4 розв'язки. Позначимо ці значення як y1,y2,y3,,ys, де y1=1, y2=1. Тоді повний перелік пар квадратичних залишків a,b за модулем n взаємно простих з n і з a2b2(modn) збігається з усіма парами a,yia, де a пробігає всі залишки, взаємно прості з n, a i=1,,s. Пари з i=1,2 не задовольняють Шаблон:EquationNote, тоді як інші так. З того, що s4, доведення завершене.

Ідея

В основі методу лежить така ідея. Припустимо x і y є цілими такими, що x2y2(modn), але x≢±y(modn). Тоді n ділить x2y2=(xy)(x+y), але не ділить ані (xy), ані (x+y). Звідси gcd(xy,n) має бути нетривіальним дільником n.

Припустимо, що маємо розкласти ціле n. Нехай m=n. Розглянемо многочлен q(x)=(x+m)2n. Зауважимо, що

q(x)=x2+2mx+m2nx2+2mx

є малим порівняно з n, якщо абсолютне значення x мале. Алгоритм квадратичного решета обирає ai=(x+m) і шукає серед чисел bi=(x+m)2  pt-гладкі. Зауважимо, що ai=(x+m)2bi(modn), звідси n є квадратичним залишком за модулем p. Отже фактор-база має складатися з простих чисел p, для яких символ Лежандра (np)=1. Окрім цього, тому що bi може бути від'ємним, 1 також включаємо до фактор-бази.

Перевірка гладкості просіюванням

Замість перевірки на гладкість перебором дільників застосовується ефективніша техніка відома як просіювання (Шаблон:Lang-en). Спочатку звернемо увагу на те, що якщо p є непарним простим у фактор-базі і p ділить q(x), тоді p також ділить q(x+lp) для кожного цілого l.

y(x)=x2n
y(x+kp)=(x+kp)2n
y(x+kp)=x2+2xkp+(kp)2n
y(x+kp)=y(x)+2xkp+(kp)2y(x)(modp)

Отже шляхом розв'язання рівняння q(x)0(modp) для x (для цього існують дієві алгоритми, наприклад Шаблон:Нп), отримуємо одну або дві (залежно від кількості квадратичних лишків) послідовності значень y, для яких p ділить q(y).

Для просіювання застосовується властивість логарифма: log(1npi)=1nlog(pi).

Перебіг просіювання такий. Створюється масив Q[x], де x,MxM, і кожний елемент ініціалізується значенням log|q(x)|. Нехай x1,x2 будуть розв'язками для q(x)0(modp), де p є непарним простим числом з фактор-бази. Тоді значення logp віднімають від тих елементів Q[x], для яких xx1 або x2(modp), і MxM. Дія повторюється для кожного простого p у фактор-базі. (Випадки з p=2 і степенями простих чисел можна обробити подібним чином.) Після просіювання елементи масиву Q[x] зі значеннями, близькими до 0, швидше за все відповідають pt-гладким числам (треба брати до уваги похибки округлення), і це можна перевірити перебором дільників.

Алгоритм

Вхід: ціле складене число n, яке не є степенем простого.

Вихід: нетривіальний дільник d для n.

  1. Обираємо базу дільників S={p1,p2,...,pt}, де p1=1 і pj(j2) є (j1)-е просте p для якого n є квадратичним залишком за модулем p.
  2. Обчислити m=n.
  3. Побудувати многочлен q(x)=(x+m)2n й обчислити значення log|q(x)| для x MxM. Просіяти побудований масив елементами факторної бази pi (та їх невеликими степенями).
  4. Серед близьких до нуля залишків у просіяному масиві знайти t+1 гладких чисел bi:
    Встановити i1. Поки it+1 робити наступне:
    1. Обчислити b=q(x)=(x+m)2n, і перевірити послідовним діленням на елементи з S чи є b pt-гладким. Якщо ні, обираємо новий x і повторюємо.
    2. Якщо b є pt-гладким, скажімо b=j=1tpieij, тоді покласти ai(x+m),bib,vi=(vi1,vi2,,vit), де vij=eijmod2 для 1jt.
    3. ii+1.
  5. Серед векторів vi над полем Z2 знайти нетривіальну лінійну комбінацію, яка дорівнює нульовому вектору, тобто, непорожню підмножину T1,2,,t+1 таку, що iTvi=0. Коефіцієнти такої лінійної комбінації можна знайти шляхом розв'язання системи лінійних рівнянь.
  6. Обчислити x=iTaimodn.
  7. Для кожного j,1jt, обчислити lj=(iTeij)/2.
  8. Обчислити y=j=1tpjljmodn.
  9. Якщо x±y(modn), тоді знайти іншу непорожню підмножину T{1,2,,t+1} таких, що iTvi=0, і перейти до етапу 5. (У малоймовірному випадку, якщо підмножина T не існує, замінити декілька з двійок (ai,bi) новими парами (етап 3), і перейти на етап 4.
  10. Обчислити d=gcd(xy,n) і повернути d.

Приклад роботи

Алгоритм квадратичного решета для находження нетривіального дільника для n=24961.

  1. Обираємо фактор-базу S={1,2,3,5,13,23} розміру t=6. (7,11,17 і 19 опущені з S, бо для цих простих (np)=1.)
  2. Обчислити m=24961=157.
  3. Далі йдуть дані зібрані для перших t+1 значень x, для яких q(x) є 23-гладкими.
i x q(x) факторизація q(x) ai bi
1 0 −312 23×3×13 157 (1, 1, 1, 0, 1, 0)
2 1 3 3 158 (0, 0, 1, 0, 0, 0)
3 −1 −625 54 156 (1, 0, 0, 0, 0, 0)
4 2 320 26×5 159 (0, 0, 0, 1, 0, 0)
5 −2 −936 23×32×13 155 (1, 1, 0, 0, 1, 0)
6 4 960 26×3×5 161 (0, 0, 1, 1, 0, 0)
7 −6 −2160 24×33×5 151 (1, 0, 1, 1, 0, 0)
  1. Візьмемо T={1,2,5}.[2] Маємо v1+v2+v5=0.
  2. Обчислимо x=(a1a2a5modn)=936.
  3. Обчислимо l1=1,l2=3,l3=2,l4=0,l5=1,l6=0.
  4. Обчислимо y=23×32×13modn=24025.
  5. Через те, що 93624025(modn), потрібно взяти наступну лінійну залежність.
  6. У випадку T={2,4,6}, отримуємо такий самий вислід.
  7. Наступна T={3,6,7},v3+v6+v7=0.
  8. Обчислимо x=(a3a6a7modn)=23405.
  9. Обчислимо l1=1,l2=5,l3=2,l4=3,l5=0,l6=0.
  10. Обчислимо y=(25×32×53modn)=13922.
  11. Тепер, 23405≢±13922(modn), отже обчислимо gcd(xy,n)=gcd(9483,24961)=109. Звідки, маємо два нетривіальних дільники для 24961109 і 229.

Примітки

Шаблон:Reflist

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

  1. Carl Pomerance, Analysis and Comparison of Some Integer Factoring Algorithms, in Computational Methods in Number Theory, Part I, H.W. Lenstra, Jr. and R. Tijdeman, eds., Math. Centre Tract 154, Amsterdam, 1982, pp 89-139.
  2. Повний перелік лінійно залежних підмножин векторів такий: 125, 264, 763, 1456, 2347, 13457, 1234567.