Это не официальный сайт wikipedia.org 01.01.2023

Алгоритм Берлекэмпа — Рабина — Википедия

Алгоритм Берлекэмпа — Рабина

(перенаправлено с «Метод Берлекэмпа»)

Алгоритм Берлекэмпа — Рабина (также метод Берлекэмпа) — вероятностный метод нахождения корней многочленов над полем F p с полиномиальной сложностью. Метод был описан американским математиком Элвином Берлекэмпом в 1970 году[1] в качестве побочного к алгоритму факторизации многочленов над конечными полями и позже (в 1979 году) был доработан Михаэлем Рабином для случая произвольных конечных полей[2]. Изначальная версия алгоритма, предложенная Берлекэмпом в 1967 году[3], не была полиномиальной[4]. Опубликованная в 1970 году на основе результатов Цассенхауза[en] версия алгоритма работала с большими значениями p , в ней заглавный метод использовался в качестве вспомогательного[1]. На момент публикации метод был распространён в профессиональной среде, однако редко встречался в литературе[4].

Элвин Берлекэмп

ИсторияПравить

 
Михаэль Ошер Рабин

Метод был предложен Элвином Берлекэмпом в его работе по факторизации многочленов над конечными полями[1]. В ней факторизация многочлена на неприводимые сомножители над полем F p k   сводится к нахождению корней некоторых других многочленов над полем F p  . При этом в оригинальной работе отсутствовало доказательство корректности алгоритма[2]. Алгоритм был доработан и обобщён на случай произвольных конечных полей Михаэлем Рабином[2]. В 1986 году Рене Перальта описал похожий алгоритм[5], решающий задачу нахождения квадратного корня в поле F p  [6], а в 2000 году метод Перальты был обобщён для решения кубических уравнений[7].

В алгоритме Берлекэмпа многочлен f ( x ) = a 0 + a 1 x + + a n x n   сперва представляется в виде произведения f ( x ) = h 1 ( x ) h 2 ( x ) h n ( x )  , где h i   — произведение r i   многочленов степени i  . Затем факторизация каждого такого многочлена h i ( x )   степени i r i   сводится к поиску корней нового многочлена H ( x )   степени r i  . В статье, вводящей алгоритм факторизации, было также предложено три метода для поиска корней многочлена в поле Галуа F p k  . Первые два сводят нахождение корней в поле F p k   к поиску корней в поле F p  . Третий метод, являющийся предметом данной статьи, решает задачу поиска корней в поле F p  , что вместе с двумя другими решает задачу факторизации[1].

Версия алгоритма факторизации, предложенная Берлекэмпом в его первой работе в 1967 г.[3], работала за O ( n 3 + p r n )  , где r   — количество неприводимых сомножителей многочлена. Таким образом, алгоритм являлся неполиномиальным и был непрактичным в случае, когда простое число p   было достаточно большим. В 1969 г. эта проблема была решена Хансом Цассенхаузом[en], показавшим, как свести узкое место алгоритма к задаче поиска корней некоторого многочлена[4]. В 1970 г. статья Берлекэмпа была переиздана уже с учётом решений Цассенхауза[1].

В 1980 г. Михаэль Рабин провёл строгий анализ алгоритма, обобщил его для работы с конечным полями вида F p k   и доказал, что вероятность ошибки одной итерации алгоритма не превосходит 1 / 2  [2], а в 1981 г. Михаэль Бен-Ор усилил эту оценку до 1 1 / 2 k 1 + O ( 1 / p )  , где k   — количество различных корней многочлена f ( x )  [8]. Вопрос существования полиномиального детерминированного алгоритма для нахождения корней многочлена над конечным полем остаётся открытым — основные алгоритмы факторизации многочленов, алгоритм Берлекэмпа и Алгоритм Кантора — Цассенхауза[en] являются вероятностными. В 1981 году Поль Камьон[fr] показал[9], что такой алгоритм существует для любого наперёд заданного числа p  , однако этот результат исключительно теоретический и вопрос о возможности построения описанных им множеств на практике остаётся открытым[10].

В первом издании второго тома «Искусства программирования» про получисленные алгоритмы Дональд Кнут пишет, что аналогичные процедуры факторизации были известны к 1960 г., однако редко встречались в открытом доступе[4]. Один из первых опубликованных примеров использования метода можно обнаружить в работе Голомба, Велша[en] и Хейлса[en] от 1959 года о факторизации трёхчленов над F 2  , где рассматривался частный случай p = 2 , z = 1  [11].

АлгоритмПравить

Постановка задачиПравить

Пусть p   — нечётное простое число. Рассмотрим многочлен f ( x ) = a 0 + a 1 x + + a n x n   над полем Z p   остатков по модулю p  . Необходимо найти все числа λ 1 , , λ k   такие что f ( λ i ) 0 ( mod p )   для всех возможных i  [2][12].

РандомизацияПравить

Пусть f ( x ) = ( x λ 1 ) ( x λ 2 ) ( x λ n )  . Нахождение всех корней такого многочлена равносильно его разбиению на линейные множители. Чтобы найти такое разбиение, достаточно научиться разбивать многочлен на любые два множителя, а затем запускаться в них рекурсивно. Для этого вводится в рассмотрение многочлен f z ( x ) = f ( x z ) = ( x λ 1 z ) ( x λ 2 z ) ( x λ n z )  , где z   — случайное число из Z p  . Если такой многочлен можно представить в виде произведения f z ( x ) = p 0 ( x ) p 1 ( x )  , то в терминах исходного многочлена это значит, что f ( x ) = p 0 ( x + z ) p 1 ( x + z )  , что даёт разбиение на множители исходного многочлена f ( x )  [1][12].

Классификация элементов F p  Править

По критерию Эйлера для любого монома ( x λ )   выполнено ровно одно из следующих свойств[1]:

  1. Одночлен равен x  , если λ = 0  ,
  2. Одночлен делит g 0 ( x ) = ( x ( p 1 ) / 2 1 )  , если λ   — квадратичный вычет по модулю p  ,
  3. Одночлен делит g 1 ( x ) = ( x ( p 1 ) / 2 + 1 )  , если λ   — квадратичный невычет по этому модулю.

Таким образом, если f z ( x )   не делится на x  , что можно проверить отдельно, то f z ( x )   равно произведению наибольших общих делителей gcd ( f z ( x ) ; g 0 ( x ) )   и gcd ( f z ( x ) ; g 1 ( x ) )  [12].

Метод БерлекэмпаПравить

Написанное выше приводит к следующему алгоритму[1]:

  1. В явном виде вычисляются коэффициенты многочлена f z ( x ) = f ( x z )  ,
  2. Вычисляются остатки от деления x , x 2 , x 2 2 , x 2 3 , x 2 4 , , x 2 log 2 p   на f z ( x )   последовательным возведением в квадрат и взятием остатка от f z ( x )  ,
  3. Двоичным возведением в степень вычисляется остаток от деления x ( p 1 ) / 2   на f z ( x )   с использованием посчитанных на прошлом шаге многочленов,
  4. Если x ( p 1 ) / 2 ± 1 ( mod f z ( x ) )  , то указанные выше gcd   дают нетривиальное разбиение f z ( x )   на множители,
  5. В противном случае все корни f z ( x )   являются вычетами или невычетами одновременно и стоит попробовать другое значения z  .

Если f ( x )   также делится на некоторый многочлен g ( x )  , не имеющий корней в Z p  , то при подсчёте gcd   с g 0 ( x )   и g 1 ( x )   будет получено разбиение бесквадратного многочлена f z ( x ) / g z ( x )   на нетривиальные сомножители, поэтому алгоритм позволяет найти все корни любых многочленов над Z p  , а не только тех, которые разбиваются в произведение мономов[12].

Извлечение квадратного корняПравить

Пусть нужно решить сравнение x 2 a ( mod p )  , решениями которого являются элементы β   и β   соответственно. Их нахождение эквивалентно факторизации многочлена f ( x ) = x 2 a = ( x β ) ( x + β )   над полем Z p  . В таком частном случае задача упрощается, так как для решения достаточно посчитать только gcd ( f z ( x ) ; g 0 ( x ) )  . Для полученного многочлена будет верно ровно одно из утверждений:

  1. НОД равен 1  , из чего следует, что z + β   и z β   являются квадратичными невычетами одновременно,
  2. НОД равен f z ( x )  , из чего следует, что оба числа являются квадратичными вычетами,
  3. НОД равен одночлену ( x t )  , из чего следует, что ровно одно число из двух является квадратичным вычетом.

В третьем случае полученный одночлен должен быть равен или ( x z β )  , или ( x z + β )  . Это позволяет записать решение в виде β = ( t z ) ( mod p )  [1].

ПримерПравить

Пусть нужно решить сравнение x 2 5 ( mod 11 )  . Для этого нужно факторизовать f ( x ) = x 2 5 = ( x β ) ( x + β )  . Рассмотрим возможные значения z  :

  1. Пусть z = 3  . Тогда f z ( x ) = ( x 3 ) 2 5 = x 2 6 x + 4  , откуда gcd ( x 2 6 x + 4 ; x 5 1 ) = 1  . Оба числа 3 ± β   являются невычетами и нужно брать другое z  .
  1. Пусть z = 2  . Тогда f z ( x ) = ( x 2 ) 2 5 = x 2 4 x 1  , откуда gcd ( x 2 4 x 1 ; x 5 1 ) x 9 ( mod 11 )  . Отсюда x 9 = x 2 β  , значит β 7 ( mod 11 )   и β 7 4 ( mod 11 )  .

Проверка показывает, что действительно 7 2 49 5 ( mod 11 )   и 4 2 16 5 ( mod 11 )  .

Обоснование методаПравить

Алгоритм находит разбиение f z ( x )   на нетривиальные множители во всех случаях, за исключением тех, в которых все числа z + λ 1 , z + λ 2 , , z + λ n   являются вычетами или невычетами одновременно. Согласно теории циклотомии[1], вероятность такого события для случая, когда λ 1 , , λ n   сами одновременно являются вычетами или невычетами одновременно (то есть, когда z = 0   не подходит для нашей процедуры), можно оценить как 1 / 2 k 1  [8], где k   — количество различных чисел среди λ 1 , , λ n  [1]. Таким образом, вероятность ошибки алгоритма не превосходит 1 / 2  .

Применение к факторизации многочленовПравить

Из теории конечных полей известно, что если степень неприводимого многочлена q ( x )   равна d  , то такой многочлен является делителем x p d x   и не является делителем x p t x   для t < d  .

Таким образом, последовательно рассматривая многочлены h i ( x ) = gcd ( f i ( x ) , x p i 1 )   где f 1 ( x ) = f ( x )   и f i ( x ) = f i 1 ( x ) / h i 1 ( x )   для i > 1  , можно разбить многочлен f ( x )   на множители вида f ( x ) = h 1 ( x ) h n ( x )  , где h i ( x )   — это произведение всех неприводимых многочленов степени i  , которые делят многочлен f ( x )  . Зная степень h i ( x )  , можно определить количество таких многочленов, равное r i = deg h i ( x ) / i  . Пусть h i ( x ) = p 1 ( x ) p r i ( x )  . Если рассмотреть многочлен p j ( x z )  , где z F p  , то порядок такого многочлена d j   в поле F p i   должен делить число p i 1  . Если d j   не делится на d k  , то многочлен x d j x   делится на p j ( x z )  , но не на p k ( x z )  .

Исходя из этого Цассенхауз[en] предложил искать делители многочлена h i ( x z )   в виде gcd ( h i ( x z ) , x f 1 )  , где f   — некоторый достаточно большой делитель p i 1  , например, f = p i 1 2  . В частном случае i = 1   получается в точности метод Берлекэмпа как он описан выше[4].

Время работыПравить

Поэтапно время работы одной итерации алгоритма можно оценить следующим образом, считая степень многочлена равной n  :

  1. Учитывая, что ( x z ) k = i = 0 k ( k i ) ( z ) k i x i   по формуле бинома Ньютона, переход от f ( x )   к f ( x z )   делается за O ( n 2 )  ,
  2. Произведение многочленов и взятие остатка от одного многочлена по модулю другого делается за O ( n 2 )  , поэтому вычисление x 2 k mod f z ( x )   делается за O ( n 2 log p )  ,
  3. Аналогично предыдущему пункту, двоичное возведение в степень делается за O ( n 2 log p )  ,
  4. Взятие gcd   от двух многочленов по алгоритму Евклида делается за O ( n 2 )  .

Таким образом, одна итерация алгоритма может быть произведена за O ( n 2 log p )   арифметических операций с элементами F p  , а нахождение всех корней многочлена требует в среднем O ( n 2 log n log p )  [8]. В частном случае извлечения квадратного корня величина n   равна двум, поэтому время работы оценивается как O ( log p )   на одну итерацию алгоритма[12].

ПримечанияПравить

  1. 1 2 3 4 5 6 7 8 9 10 11 Berlekamp E. R. Factoring polynomials over large finite fields (англ.) // Mathematics of Computation. — 1970. — Vol. 24, iss. 111. — P. 730—732. — ISSN 0025-5718. — doi:10.1090/S0025-5718-1970-0276200-X.
  2. 1 2 3 4 5 Rabin M. Probabilistic Algorithms in Finite Fields (англ.) // SIAM Journal on Computing. — 1980. — 1 May (vol. 9, iss. 2). — P. 273—280. — ISSN 0097-5397. — doi:10.1137/0209024. Архивировано 23 июня 2019 года.
  3. 1 2 Berlekamp E. R. Factoring polynomials over finite fields (англ.) // The Bell System Technical Journal. — 1967. — October (vol. 46, iss. 8). — P. 1853—1859. — ISSN 0005-8580. — doi:10.1002/j.1538-7305.1967.tb03174.x. Архивировано 17 февраля 2019 года.
  4. 1 2 3 4 5 Knuth D. E. The art of computer programming (англ.). — Reading, Massachusetts: Addison-Wesley Publishing Company, 1968. — Vol. 2. — P. 381—390. — 624 p. — ISBN 0-201-03802-1. Архивная копия от 3 августа 2019 на Wayback Machine
  5. Sze T. W. On taking square roots without quadratic nonresidues over finite fields (англ.) // Mathematics of Computation. — 2011. — 3 January (vol. 80, iss. 275). — P. 1797—1811. — ISSN 0025-5718. — doi:10.1090/s0025-5718-2011-02419-1.
  6. Peralta R. A simple and fast probabilistic algorithm for computing square roots modulo a prime number (Corresp.) (англ.) // IEEE Transactions on Information Theory. — 1986. — November (vol. 32, iss. 6). — P. 846—847. — ISSN 0018-9448. — doi:10.1109/TIT.1986.1057236. Архивировано 30 июня 2019 года.
  7. Padró C., Sáez G. Taking cube roots in Zm (англ.) // Applied Mathematics Letters. — 2002. — August (vol. 15, iss. 6). — P. 703—708. — ISSN 0893-9659. — doi:10.1016/s0893-9659(02)00031-9.
  8. 1 2 3 Ben-Or M. Probabilistic algorithms in finite fields (англ.) // 22nd Annual Symposium on Foundations of Computer Science (sfcs 1981). — 1981. — October. — P. 394—398. — doi:10.1109/SFCS.1981.37. Архивировано 29 июля 2019 года.
  9. Camion P. A Deterministic Algorithm for Factorizing Polynomials of Fq [X] (англ.) // Combinatorial Mathematics, Proceedings of the International Colloquium on Graph Theory and Combinatorics. — Elsevier, 1983. — P. 149—157. — ISBN 9780444865120.
  10. Grenet B., van der Hoeven J., Lecerf G. Deterministic root finding over finite fields using Graeffe transforms (англ.) // Applicable Algebra in Engineering, Communication and Computing. — 2015. — Vol. 27, iss. 3. — P. 239. — ISSN 0938-1279. — doi:10.1007/s00200-015-0280-5.
  11. Golomb S. W., Hales A., Welch L. R. On the factorization of trinomials over GF(2) (англ.) // Shift Register Sequences. — World Scientific, 2017. — March. — P. 90—108. — ISBN 978-981-4632-00-3. — doi:10.1142/9789814632010_0005.
  12. 1 2 3 4 5 Menezes A. J., Blake I. F., Gao X. H., Mullin R. C., Vanstone S. A. Applications of Finite Fields (англ.). — Springer US, 1993. — P. 22—26. — 218 p. — (The Springer International Series in Engineering and Computer Science). — ISBN 9780792392828. Архивная копия от 30 июня 2019 на Wayback Machine