El algoritmo de Berlekamp-Rabin (también el método de Berlekamp ) es un método probabilístico para encontrar las raíces de polinomios sobre un campo con complejidad polinomial . El método fue descrito por el matemático estadounidense Alvin Berlekamp en 1970 [1] como un derivado del algoritmo de factorización para polinomios sobre campos finitos y más tarde (en 1979) fue modificado por Michael Rabin para el caso de campos finitos arbitrarios [2] . La versión original del algoritmo propuesto por Berlekamp en 1967 [3] no era polinomial [4] . La versión del algoritmo publicada en 1970 basada en los resultados de Zassenhaus trabajaba con valores grandes de , en la que se usaba el método del título como auxiliar [1] . En el momento de la publicación, el método era común en el entorno profesional, pero rara vez se encontraba en la literatura [4] .
El método fue propuesto por Alvin Berlekamp en su trabajo sobre la factorización de polinomios sobre campos finitos [1] . En él, la factorización de un polinomio en factores irreducibles sobre un cuerpo se reduce a encontrar las raíces de algunos otros polinomios sobre un cuerpo . Al mismo tiempo, en el trabajo original no había pruebas de la corrección del algoritmo [2] . El algoritmo fue finalizado y generalizado para el caso de campos finitos arbitrarios por Michael Rabin [2] . En 1986, René Peralta describió un algoritmo similar [5] que resuelve el problema de encontrar la raíz cuadrada en un campo [6] , y en 2000 se generalizó el método de Peralta para resolver ecuaciones cúbicas [7] .
En el algoritmo de Berlekamp , un polinomio se representa primero como un producto , donde es el producto de polinomios de grado . Luego, la factorización de cada polinomio de grado se reduce a encontrar las raíces del nuevo polinomio de grado . El artículo que presenta el algoritmo de factorización también proponía tres métodos para encontrar las raíces de un polinomio en un campo de Galois . Los dos primeros reducen encontrar raíces en un campo a encontrar raíces en un campo . El tercer método, que es el tema de este artículo, resuelve el problema de encontrar raíces en el campo , que, junto con los otros dos, resuelve el problema de factorización [1] .
La versión del algoritmo de factorización propuesto por Berlekamp en su primer artículo en 1967 [3] corrió en , donde es el número de factores irreducibles del polinomio. Por lo tanto, el algoritmo no era polinomial y no era práctico cuando el número primo era lo suficientemente grande. En 1969, este problema fue resuelto por Hans Zassenhaus , quien mostró cómo reducir el cuello de botella del algoritmo al problema de encontrar las raíces de algún polinomio [4] . En 1970 se volvió a publicar el artículo de Berlekamp, teniendo en cuenta las soluciones de Zassenhaus [1] .
En 1980, Michael Rabin llevó a cabo un análisis riguroso del algoritmo, lo generalizó para trabajar con campos finitos de la forma y demostró que la probabilidad de error de una iteración del algoritmo no supera [2] , y en 1981 Michael Ben- O reforzó esta estimación a , donde — el número de raíces diferentes del polinomio [8] . La cuestión de la existencia de un algoritmo determinista de polinomios para encontrar las raíces de un polinomio sobre un campo finito sigue abierta: los principales algoritmos de factorización de polinomios , el algoritmo de Berlekamp y el algoritmo de Cantor-Zassenhaus son probabilísticos. En 1981, Paul Camion demostró [9] que tal algoritmo existe para cualquier número dado , pero este resultado es puramente teórico y la cuestión de la posibilidad de construir los conjuntos descritos por él en la práctica permanece abierta [10] .
En la primera edición del segundo volumen de "El arte de la programación " sobre algoritmos numéricos, Donald Knuth escribe que en 1960 se conocían procedimientos de factorización similares, pero rara vez se encontraban en el dominio público [4] . Uno de los primeros ejemplos publicados del uso del método se puede encontrar en el trabajo de Golomb , Welsh y Hales de 1959 sobre la factorización de trinomios sobre , donde se consideró un caso especial [11] .
Sea un número primo impar. Considere un polinomio sobre el campo de residuos módulo . Es necesario encontrar todos los números tales que para todos los posibles [2] [12] .
deja _ Encontrar todas las raíces de tal polinomio es equivalente a dividirlo en factores lineales. Para encontrar una partición de este tipo, es suficiente aprender a dividir el polinomio en dos factores cualesquiera y luego ejecutarlos recursivamente. Para ello, introducimos un polinomio , donde es un número aleatorio de . Si tal polinomio puede representarse como un producto , entonces en términos del polinomio original esto significa que , lo que da una factorización del polinomio original [1] [12] .
Según el criterio de Euler, para cualquier monomio se cumple exactamente una de las siguientes propiedades [1] :
Por tanto, si no es divisible por , lo que se puede comprobar por separado, entonces es igual al producto de los máximos comunes divisores y [12] .
Lo anterior conduce al siguiente algoritmo [1] :
Si además se divide por algún polinomio que no tiene raíces en , entonces al calcular con y , se obtendrá una partición del polinomio libre de cuadrados en factores no triviales, por lo que el algoritmo permite encontrar todas las raíces de cualquier polinomios sobre , y no solo aquellos que se descomponen en un producto de monomios [12] .
Sea necesario resolver una comparación cuyas soluciones sean los elementos y respectivamente. Encontrarlos es equivalente a factorizar un polinomio sobre un campo . En este caso particular, el problema se simplifica, ya que para la solución basta con calcular solamente . Para el polinomio resultante, exactamente una de las declaraciones será verdadera:
En el tercer caso, el monomio resultante debe ser igual a o , o . Esto permite escribir la solución como [1] .
EjemploResolvamos la comparación . Para hacer esto, necesitas factorizar . Consideremos los valores posibles :
La verificación muestra eso y es válida .
El algoritmo encuentra una partición en factores no triviales en todos los casos, excepto en aquellos en los que todos los números son residuos o no residuos al mismo tiempo. De acuerdo con la teoría de la ciclotomía [1] , la probabilidad de tal evento para el caso en que ambos son residuos o no residuos al mismo tiempo (es decir, cuando no es adecuado para nuestro procedimiento) se puede estimar como [8] , donde es el número de números diferentes entre [1] . Por lo tanto, la probabilidad de error del algoritmo no excede .
Se sabe por la teoría de campos finitos que si el grado de un polinomio irreducible es , entonces dicho polinomio es un divisor y no un divisor de .
Así, considerando secuencialmente los polinomios donde y para , podemos dividir el polinomio en factores de la forma , donde es el producto de todos los polinomios irreducibles de grado que dividen el polinomio . Conociendo el grado de , podemos determinar el número de tales polinomios igual a . deja _ Si consideramos el polinomio , donde , entonces el orden de tal polinomio en el campo debe dividir el número . Si no es divisible por , entonces el polinomio es divisible pero no por .
Con base en esto, Zassenhaus sugirió buscar divisores de un polinomio en la forma , donde hay algún divisor suficientemente grande , por ejemplo, . En un caso particular , se obtiene exactamente el método de Berlekamp como se describe anteriormente [4] .
Paso a paso, el tiempo de ejecución de una iteración del algoritmo se puede estimar de la siguiente manera, asumiendo que el grado del polinomio es :
Por lo tanto, se puede realizar una iteración del algoritmo para operaciones aritméticas con elementos , y encontrar todas las raíces del polinomio requiere un promedio [8] . En el caso particular de extraer la raíz cuadrada, el valor es dos, por lo que el tiempo de ejecución se estima como una iteración del algoritmo [12] .
Algoritmos de teoría de números | |
---|---|
Pruebas de simplicidad | |
Encontrar números primos | |
Factorización | |
logaritmo discreto | |
Encontrar MCD | |
Módulo aritmético | |
Multiplicación y división de números. | |
Calcular la raíz cuadrada |