La multiplicación de polinomios se utiliza ampliamente en las pruebas de conocimiento cero y en la criptografía matemática. Pero el enfoque de fuerza bruta o tradicional para multiplicar polinomios se ejecuta en , lo cual está bien para entradas pequeñas pero se vuelve bastante costoso a medida que aumenta el grado del polinomio. Este artículo analiza detalladamente la multiplicación de polinomios con el fin de explorar formas de hacerla más rápida.
- Comenzamos con un repaso de la aritmética de polinomios tradicional/de libro de texto
- Seguido de un estudio de las diferentes formas de representación de los polinomios
- Examinamos y comparamos la aritmética de polinomios en estas diferentes formas
- Finalmente, vemos cómo estas formas pueden potencialmente acelerar la multiplicación de polinomios - y cómo sientan las bases para un algoritmo llamado Number Theoretic Transform (NTT)
Multiplicación de Polinomios - Enfoque tradicional
Consideremos dos polinomios y de grado cada uno:
Multiplicar estos dos polinomios utilizando la forma simple de distribución de la multiplicación sobre la suma toma . Aquí, cada término de se multiplica con cada término de :
Por ejemplo,
sea ,
y .
Entonces,

Al programarlo, esto se implementa en forma de bucles anidados.
# Let A be array representing the coefficients of p1(x)
A = [a0, a1, ..., an]
# Let B be array representing the coefficients of p2(x)
B = [b0, b1, ..., bn]
# Let C be the array storing coefficients of p1(x).p2(x)
function multiply_polynomials(A, B):
n = len(A)
m = len(B)
C = array of zeros of length (n + m - 1)
for i from 0 to n - 1:
for j from 0 to m - 1:
C[i + j] += A[i] * B[j]
return C
Obtendrías el resultado así:
Por cada iteraciones del bucle exterior, el bucle interior se ejecuta n veces (asumiendo grados iguales ), dando así n por n, es decir, un tiempo de ejecución de .
Ahora queremos ver si podemos optimizar esto y hacerlo mejor. O simplemente, ¿hay alguna forma de hacer que la multiplicación de polinomios sea más rápida?
Formas de representar un Polinomio
Hay dos formas en las que podemos representar un polinomio: forma de coeficientes y forma de puntos.
Forma de Coeficientes
Los polinomios generalmente se expresan en lo que se llama la base monomial, o la forma de coeficientes, lo que significa que se escriben como una combinación lineal de potencias de la variable.
Por ejemplo, un polinomio de grado , cuando se expresa como
se expresa en la base monomial, ya que utiliza como base para sus coeficientes, que son
En esta representación, los coeficientes de pueden escribirse como un vector o un arreglo, como , donde el primer elemento corresponde al término constante o coeficiente de , mientras que el último elemento corresponde al coeficiente de .
Debes tener en cuenta que el método anterior de multiplicación distributiva que vimos (tiempo de ejecución ) se aplicó sobre la forma de coeficientes de los polinomios.
Forma de Puntos (o Valores)
La representación en forma de puntos (o valores) se basa en el hecho de que todo polinomio de grado puede representarse mediante un conjunto de puntos distintos que se encuentran sobre él.
Por ejemplo, consideremos un polinomio cuadrático (grado ):
Ahora toma cualesquiera puntos (porque ) que se encuentren en esta curva, digamos , y . Podemos decir que estos puntos representan el polinomio dado. Alternativamente, si solo se nos dan estos puntos, es posible recuperar el polinomio a partir de esa información. ¿Por qué funciona esto? ¿O cómo somos capaces de representar de manera equivalente un polinomio de grado con puntos?
Esto es porque:
Para cada conjunto de puntos distintos, existe un único polinomio de menor grado, de grado a lo sumo , que pasa a través de todos ellos.
Este polinomio de menor grado se llama Polinomio de Lagrange.
Por ejemplo,
dados dos puntos y , existe un único polinomio de grado (una línea) que pasa por estos puntos:
De manera similar,
dados tres puntos , y , el Polinomio de Lagrange de grado que pasa por estos puntos es:
Cómo se calcula este polinomio especial dado un conjunto de puntos es algo que se discute en este artículo sobre la interpolación de Lagrange.
Unicidad del Polinomio de Lagrange
Debes notar que para un conjunto de puntos, hay múltiples polinomios de un grado dado que pasan por todos ellos. Pero solo el polinomio de menor grado es único.
Por ejemplo, en el caso anterior de los puntos y , existen muchos polinomios que pasan por estos dos puntos:
y son dos de los muchos polinomios de grado (cuadráticos) que pasan por estos dos puntos.

De manera similar, si consideras el grado , dos ejemplos de polinomios que pasan por los puntos y son y .

Pero para el menor grado, aquí , existe solo un polinomio del menor grado, y ese es . Es único, y no hay otro polinomio de grado que pueda pasar por estos dos puntos dados.

¿Cómo se determina este menor grado?
Para cada conjunto de puntos distintos, hay un único polinomio de grado a lo sumo que pasa por ellos. El grado del polinomio único es menor que si algunos de los puntos son colineales o se encuentran en un polinomio de menor grado. Por lo tanto, usamos el término “a lo sumo ” para cubrir el caso en el que el grado es exactamente , así como los casos donde el grado es menor.
Por ejemplo,
dados los puntos y , el polinomio de menor grado que pasa por ellos es . Esto se debe a que los puntos son colineales, es decir, se encuentran en una línea. Uno puede comprobar que la pendiente entre cualquier par de ellos es la misma:
Por lo tanto, el menor grado es , y es el único Polinomio de Lagrange.
De manera similar,
Dados cinco puntos, , encontramos que todos ellos se encuentran en una parábola con la ecuación
Este es un caso donde todos los puntos dados se encuentran en un polinomio de menor grado, aquí grado , y por lo tanto el Polinomio de Lagrange tiene grado , que es menor que (Aquí, ).
Consulta el Apéndice al final para la demostración de la unicidad del polinomio de menor grado.
Conversión Entre Forma de Coeficientes y Forma de Puntos
Dado que la forma de coeficientes y la forma de puntos son equivalentes, podemos convertir fácilmente entre ellas como mostraremos ahora.
Interpolación (Forma de Puntos → Forma de Coeficientes)
La conversión de la forma de puntos a la forma de coeficientes, llamada interpolación, consiste en calcular el polinomio de menor grado que pasa por todos los puntos dados. Uno de los métodos más conocidos en que esto se hace es usando la Interpolación de Lagrange, que mencionamos anteriormente. Si no estás familiarizado con ella, puedes revisar este artículo.
En resumen, dado un conjunto de puntos distintos
podemos encontrar el único polinomio de menor grado, de grado a lo sumo , utilizando la fórmula para la interpolación de Lagrange, de tal manera que:
Debes tener en cuenta que el tiempo de ejecución de la interpolación de Lagrange es .
Evaluación (Forma de Coeficientes → Forma de Puntos)
La conversión de la forma de coeficientes a la forma de puntos, llamada evaluación, consiste en evaluar el polinomio en valores de para obtener los correspondientes valores de , y así un conjunto de puntos , que representan el polinomio. Una forma común en que esto se puede hacer es utilizando la regla de Horner (que se discutirá en detalle en un futuro artículo).
En resumen, dados los coeficientes de un polinomio y un valor , el Método de Horner evalúa de la siguiente manera:
Este método factoriza las potencias comunes de , una a la vez hasta que se procesan todos los términos. Veamos un ejemplo para entenderlo mejor.
Dado el polinomio y un valor , revisaremos cómo la regla de Horner evalúa .
Podemos reescribir de la siguiente manera (como se muestra en la expresión generalizada de arriba):
Sustituyendo :

Observa cómo los pasos involucran multiplicaciones y sumas alternas. Los pasos 1, 3 y 5 del cálculo anterior son multiplicaciones, mientras que los pasos 2, 4 y 6 son sumas. En total, hay multiplicaciones y sumas (aquí ), dando un tiempo de ejecución total de . Así es como la regla de Horner evalúa un polinomio de grado en un valor dado de en
Por lo tanto, evaluar el polinomio en valores distintos de - convirtiendo de la forma de coeficientes a la forma de puntos usando esta regla - toma por , es decir, .
Forma de Coeficientes VS Forma de Puntos
Dijimos que la forma de coeficientes y la forma de puntos de un polinomio son equivalentes, y una puede convertirse en la otra. Es decir, no hay diferencia en los resultados finales de la suma y la multiplicación cuando se hacen en cualquiera de las formas. Examinemos esto, con un ejemplo de suma primero.
Suma en forma de coeficientes
Consideremos dos polinomios dados en forma de coeficientes,
O sus respectivos arreglos de coeficientes:
Ahora, sumar los dos polinomios es simplemente sumar los dos arreglos elemento a elemento, y el arreglo de coeficientes resultante representa el polinomio final. Verifiquemos esto:
O simplemente,
Para dos polinomios de grado , realizamos sumas para obtener la representación de la suma. Por lo tanto, el tiempo de ejecución de la suma en forma de coeficientes es .
Suma en forma de puntos
Consideremos los mismos dos polinomios,
Primero, necesitamos convertirlos de la forma de coeficientes a la forma de puntos. Dado que el grado de ambos polinomios es , el grado de su suma será a lo sumo también. Por lo tanto, necesitamos tres puntos para representar la suma (grado más uno: ), lo cual requiere evaluaciones para cada uno de y .
Evaluemos y en para obtener nuestros puntos.
Nota: Solo estamos eligiendo por simplicidad. Podrías elegir cualesquiera otros puntos para la evaluación.
Ahora, sumar los dos polinomios requiere sumar las evaluaciones correspondientes elemento por elemento, es decir:
Estos tres puntos y nos dan la representación en forma de puntos de la suma. Verifiquemos si satisfacen el polinomio que calculamos anteriormente:
Por lo tanto, verás que la suma en ambas formas da el mismo resultado, o el mismo polinomio, solo representado de diferentes maneras.
En la suma en forma de puntos, para dos polinomios de grado , hay puntos que representan a cada uno de ellos, y por lo tanto realizamos sumas elemento por elemento para obtener los puntos representativos de la suma. Por lo tanto, el tiempo de ejecución de la suma en forma de puntos es .
Ahora, examinemos también de cerca la multiplicación.
Multiplicación en forma de coeficientes
Consideremos dos polinomios dados en forma de coeficientes:
O sus respectivos arreglos de coeficientes:
y
Multiplicarlos utilizando la forma distributiva discutida anteriormente da:
El polinomio resultante es , representado por el arreglo de coeficientes . El método distributivo de multiplicación en forma de coeficientes toma , como vimos al inicio de este artículo.
Multiplicación en forma de puntos
Ahora consideramos los mismos polinomios y los convertimos a sus formas de puntos.
Dado que ambos polinomios tienen grado , su producto tendrá un grado de a lo sumo , lo que significa que necesitamos puntos para representarlo, lo cual requiere 3 evaluaciones para cada uno de y .
Entonces, evaluemos y en .
Ahora, para obtener los puntos que representan su producto, multiplicamos las evaluaciones elemento por elemento:
Así que los tres puntos y nos dan la representación en forma de puntos del producto resultante.
Verifiquemos si satisfacen el producto de polinomios que obtuvimos anteriormente:
Por lo tanto, puedes ver que la multiplicación en ambas formas da el mismo polinomio, solo representado de diferentes maneras.
En resumen, para dos polinomios y de grado , su producto tendrá un grado de a lo sumo , lo que significa que necesitamos puntos para representarlo. Así, realizamos evaluaciones para cada polinomio en valores comunes de para convertirlos a la forma de puntos:
Luego realizamos la multiplicación en forma de puntos multiplicando estos dos conjuntos elemento por elemento, lo cual toma multiplicaciones, es decir, un tiempo de ejecución de .
Esto nos da los puntos que representan el producto :
Lo asombroso a notar aquí es que, mientras que la suma tanto en forma de coeficientes como de puntos toma el mismo tiempo , la multiplicación en forma de puntos es significativamente más rápida que en forma de coeficientes. En la forma de puntos, realizamos multiplicaciones elemento a elemento, dando un tiempo de ejecución de , ¡lo cual es mucho mejor que el requerido para la multiplicación en forma de coeficientes!
Sin embargo, todavía hay un problema: no hemos considerado la sobrecarga de convertir a la forma de puntos y viceversa.
Entonces, veamos el proceso completo de la multiplicación en forma de puntos, que implica tres pasos:
- Conversión de la forma de coeficientes a la forma de puntos
Evaluamos los dos polinomios de grado que se van a multiplicar en valores de , para obtener un conjunto de evaluaciones para cada uno. Esto toma usando el Método de Horner. - Multiplicación elemento a elemento en la representación de forma de puntos
Multiplicamos estos dos conjuntos elemento a elemento para obtener evaluaciones que nos dan la representación en forma de puntos de su producto. Esto toma . - Conversión de la forma de puntos a la forma de coeficientes
Calculamos el único polinomio de menor grado (forma de coeficientes) que pasa por todos los puntos resultantes. Esto toma utilizando la interpolación de Lagrange.
Por lo tanto, el tiempo de ejecución general para los pasos anteriores es:
lo cual no es mejor que desde donde empezamos. Por lo tanto, necesitamos explorar si alguna optimización puede hacer este proceso más rápido.
Optimizando la conversión
El punto clave a tener en cuenta es que la multiplicación en forma de coeficientes toma , mientras que la multiplicación en forma de puntos (elemento a elemento) toma . Por lo tanto, si podemos encontrar una manera de convertir la forma de coeficientes a la forma de puntos y viceversa (pasos 1 y 3 mencionados arriba) más rápido que , podemos optimizar la multiplicación para que se ejecute en tiempo subcuadrático.
Es importante notar que no podemos optimizar la suma de polinomios, porque la suma tanto en forma de coeficientes como en forma de puntos se ejecuta en cada una.
Así que ahora hagamos una lluvia de ideas sobre algunas formas en las que podríamos hacer la conversión de la forma de coeficientes a la de puntos más rápida.
¿Qué pasaría si conociéramos un punto cuya evaluación pudiera darnos los valores de varios puntos relacionados, ahorrándonos cálculos repetidos?
Por ejemplo, si tuviéramos un polinomio con una gráfica simétrica, evaluar un punto nos diría también la evaluación para su correspondiente punto simétrico.
Consideremos el polinomio .
Observa cómo,

O, más simplemente, observa cómo para todo ,
Esto no solo es cierto para , sino que se generaliza a todos los polinomios que contienen solo coeficientes con potencias pares, los cuales también se conocen como polinomios pares.
Por ejemplo, consideremos el polinomio par (que contiene solo términos con potencias pares de ):

En la gráfica anterior, es fácil observar que
Visualmente hablando, las gráficas de los polinomios pares están reflejadas respecto al eje , y se evalúan al mismo tanto para valores positivos como negativos de cualquier dado.
¿Qué pasa con los polinomios impares que contienen solo coeficientes con potencias impares?
Consideremos .
Observa cómo

En la gráfica anterior, observa cómo, para todo ,
Nuevamente, esto no solo es cierto para , sino que se generaliza a todos los polinomios impares, es decir, polinomios que contienen solo términos con potencias impares de . Por ejemplo, consideremos el polinomio

En la gráfica anterior, observa que
Visualmente, las gráficas de todos los polinomios impares son simétricas con respecto al origen, lo que hace que la igualdad anterior sea cierta para todos ellos.
Ahora puedes ver que después de evaluar ciertos puntos, podemos obtener la evaluación en otros puntos sin ningún cálculo extra. Por ejemplo, en los casos anteriores, para polinomios pares e impares, conocer la evaluación para también nos da la evaluación para .
Podemos explotar este hecho para hacer que la multiplicación de polinomios sea más rápida, que es exactamente lo que un hermoso algoritmo llamado Number Theoretic Transform (NTT) nos permite hacer. NTT permite la evaluación y la interpolación en utilizando recursivamente las propiedades de simetría de ciertos puntos, haciendo así la conversión subcuadrática.
Pero como NTT opera sobre un campo finito, no hay valores negativos de con los que podamos trabajar. Aquí es donde los conceptos de subgrupos multiplicativos, ciclicidad y raíces de la unidad entran en juego. Estos conceptos nos permitirán explotar las simetrías presentes en los campos finitos para realizar la multiplicación de polinomios de manera más eficiente. Exploraremos cómo funciona NTT en detalle en próximos artículos.
Apéndice
Demostración de la unicidad del polinomio de menor grado
Mostramos que si hay dos polinomios y de igual grado que interpolan un conjunto de puntos, entonces debe existir un polinomio tal que .
Luego mostraremos que la única solución posible para es , de lo contrario terminamos con un polinomio que tiene más raíces que su grado, lo cual demostramos que es imposible. Veamos estos pasos en detalle ahora.
Supongamos que el Polinomio de Lagrange de menor grado no es único. Entonces hay al menos dos polinomios distintos de menor grado que pasan por todos los puntos dados. Sean estos dos polinomios y . Ahora, definamos el polinomio como la diferencia entre y .
Ahora, si mostramos que es para todos los valores de , entonces habremos demostrado que es igual a , y por lo tanto el Polinomio de Lagrange es único.
Dado que el grado tanto de como de es a lo sumo , se deduce de la simple resta algebraica que también debe tener un grado a lo sumo .
Además, dado que tanto como pasan por los mismos puntos, se evaluarán al mismo valor de para cada uno de los valores de .
Nota: Gráficamente, cuando dos polinomios diferentes se evalúan al mismo valor de para un dado, significa que se intersecan en ese punto. Por ejemplo:

En , ambos dan , por lo que se intersecan en el punto . En este caso, estamos tratando con polinomios diferentes. ¡Otra posibilidad de tener el mismo para un dado es que en realidad sean el mismo polinomio! En ese caso, tendrán el mismo para todos los valores de , no solo para algunos valores particulares de .
En el caso de y , son iguales para al menos n + 1 valores diferentes de . Esto se puede expresar matemáticamente como:
Entonces, la diferencia entre y en todos los puntos será cero. Es decir,
Por lo tanto, se evalúa en cero en puntos, lo que implica que es un polinomio cero. Veamos más claramente por qué.
Un polinomio cero es aquel que se evalúa en cero para todos los valores de . El ejemplo más simple de un polinomio cero es:
Otra forma de ver esto es, si nuestro dominio de evaluación del polinomio - el conjunto de puntos en los que se puede evaluar el polinomio - es, digamos, , entonces un polinomio cero para este dominio puede ser:
Porque,
Podríamos tener muchos más polinomios cero para el dominio como:
Nota que cada uno de y se evalúa en cero para el dominio , y por lo tanto es un polinomio cero. Podemos tener muchos más. El más primitivo es , es decir, la propia constante cero.
Nota: Si el dominio se toma como el conjunto de todos los números reales, entonces el único polinomio cero que podemos tener es , ya que ningún otro polinomio se evaluará en cero para todos los números reales.
Ahora observa el número de raíces y el grado para cada uno de los ejemplos de polinomios cero que vimos.
Las raíces de un polinomio son los valores en el dominio para los cuales el polinomio se evalúa en cero, mientras que el grado de un polinomio es la mayor potencia de la variable, como bien sabes.
- Raíces- , Grado-
- Raíces- , Grado-
- Raíces- , Grado-
Todos ellos se evalúan en cero en ; por lo tanto, el número de raíces es , mientras que el grado puede variar modificando , cuyo grado es .
Nota también que tiene un número de raíces mayor que su grado. Esto solo es posible en el caso de un polinomio cero, específicamente el primitivo . De lo contrario, el número de raíces siempre es menor o igual al grado.
Considera un polinomio no nulo de grado ; puede tener a lo sumo raíces (o intersecciones con el eje ). El polinomio cero primitivo es la única excepción, ya que tiene más raíces que su grado.
Por ejemplo,
una ecuación cuadrática de grado , como , tiene dos raíces, es decir, y .

Para que una ecuación cuadrática tenga más de dos raíces, debe ser igual a cero, es decir, .
Ahora, volviendo a nuestro argumento: dado que se evalúa en cero en puntos, debe tener al menos raíces, lo cual es mayor que su grado . Por lo tanto debe ser igual a cero.
Esto implica que , lo que significa que son el mismo polinomio. Por lo tanto, el polinomio de menor grado que interpola un conjunto de puntos distintos es único.