Articulo de referencia

Multiplicación de Toom-Cook

Toom-Cook , a veces conocido como Toom-3 , llamado así en honor a Andrei Toom , quien introdujo el nuevo algoritmo con su baja complejidad, y a Stephen Cook , quien limpió su de...

Toom-Cook , a veces conocido como Toom-3 , llamado así en honor a Andrei Toom , quien introdujo el nuevo algoritmo con su baja complejidad, y a Stephen Cook , quien limpió su descripción, es un algoritmo de multiplicación para números enteros grandes.

Dados dos enteros grandes, a y b , el algoritmo Toom-Cook divide a y b en k partes más pequeñas, cada una de longitud l , y realiza operaciones sobre dichas partes. A medida que k aumenta, se pueden combinar muchas de las suboperaciones de multiplicación, reduciendo así la complejidad computacional general del algoritmo. Estas suboperaciones de multiplicación se pueden calcular recursivamente utilizando nuevamente la multiplicación de Toom-Cook, y así sucesivamente. Si bien los términos "Toom-3" y "Toom-Cook" a veces se usan incorrectamente como sinónimos, Toom-3 es solo una instancia del algoritmo Toom-Cook, donde k = 3.

Toom-3 reduce nueve multiplicaciones a cinco y se ejecuta enΘ(norteregistro(5)/registro(3))Θ(norte1.46){\displaystyle \Theta (n^{\log(5)/\log(3)})\approx \Theta (n^{1.46})}. En general, Toom-k{\displaystyle k}corre enΘ(do(k)nortemi){\displaystyle \Theta (c(k)n^{e})}, dóndemi=registro(2k1)/registro(k){\displaystyle e=\log(2k-1)/\log(k)},nortemi{\displaystyle n^{e}}es el tiempo dedicado a las submultiplicaciones, ydo{\displaystyle c}es el tiempo empleado en sumas y multiplicaciones por constantes pequeñas (Knuth, p.  296). El algoritmo de Karatsuba es equivalente a Toom-2, donde el número se divide en dos más pequeños. Reduce cuatro multiplicaciones a tres y, por lo tanto, opera aΘ(norteregistro(3)/registro(2))Θ(norte1,58){\displaystyle \Theta (n^{\log(3)/\log(2)})\approx \Theta (n^{1.58})}.

Aunque el exponentemi{\displaystyle e}se puede establecer arbitrariamente cerca de 1 aumentandok{\displaystyle k}, el término constante en la función crece muy rápidamente. [ 1 ] [ 2 ] La tasa de crecimiento para los esquemas Toom-Cook de nivel mixto seguía siendo un problema de investigación abierto en 2005. [ 3 ] Una implementación descrita por Donald Knuth alcanza la complejidad temporalΘ(norte22registronorteregistronorte){\displaystyle \Theta (n\,2^{\sqrt {2\log n}}\log n)}. [ 4 ]

Debido a su sobrecarga, Toom–Cook es más lento que la multiplicación larga con números pequeños, y por lo tanto se usa típicamente para multiplicaciones de tamaño intermedio, antes del algoritmo Schönhage–Strassen asintóticamente más rápido (con complejidadΘ(norteregistronorteregistroregistronorte){\displaystyle \Theta (n\log n\log \log n)}) se vuelve práctico.

Toom describió este algoritmo por primera vez en 1963, y Cook publicó un algoritmo mejorado (asintóticamente equivalente) en su tesis doctoral en 1966. [ 5 ]

Detalles

Esta sección analiza exactamente cómo realizar Toom- k para cualquier valor dado de k , y es una simplificación de una descripción de la multiplicación de polinomios de Toom-Cook descrita por Marco Bodrato. [ 6 ] El algoritmo tiene cinco pasos principales:

  1. Terrible
  2. Evaluación
  3. Multiplicación punto por punto
  4. Interpolación
  5. Recomposición

En una implementación típica de números enteros grandes, cada entero se representa como una secuencia de dígitos en notación posicional , con la base o radix establecida en algún valor b (generalmente grande) ; para este ejemplo usamos b  =  10000, de modo que cada dígito corresponde a un grupo de cuatro dígitos decimales (en una implementación informática, b sería típicamente una potencia de 2). Supongamos que los dos enteros que se multiplican son:

Estos datos son mucho más pequeños de lo que normalmente se procesaría con el método Toom-Cook (la multiplicación en la escuela primaria sería más rápida), pero servirán para ilustrar el algoritmo.

Terrible

En Toom- k , queremos dividir los factores en k partes.

El primer paso consiste en seleccionar la base B  = b i , de modo que el número de dígitos tanto de m como de n en la base B sea como máximo k (por ejemplo, 3 en Toom-3). Una elección típica para i viene dada por: 

i=máximo{registrobmetrok,registrobnortek}+1.{\displaystyle i=\max \left\{\left\lfloor {\frac {\left\lfloor \log _{b}m\right\rfloor }{k}}\right\rfloor ,\left\lfloor {\frac {\left\lfloor \log _{b}n\right\rfloor }{k}}\right\rfloor \right\}+1.}

En nuestro ejemplo haremos Toom-3, así que elegimos B = b 2 = 10 8 . Luego separamos m y n en sus dígitos de base B m i , n i :

metro2=123456metro1=78901234metro0=56789012norte2=98765norte1=43219876norte0=54321098{\displaystyle {\begin{aligned}m_{2}&{}=123456\\m_{1}&{}=78901234\\m_{0}&{}=56789012\\n_{2}&{}=98765\\n_{1}&{}=43219876\\n_{0}&{}=54321098\end{aligned}}}

Luego usamos estos dígitos como coeficientes en polinomios de grado ( k − 1) p y q , con la propiedad de que p ( B )  = m y q ( B ) = n :   

pag(incógnita)=metro2incógnita2+metro1incógnita+metro0=123456incógnita2+78901234incógnita+56789012{\displaystyle p(x)=m_{2}x^{2}+m_{1}x+m_{0}=123456x^{2}+78901234x+56789012\,}
q(incógnita)=norte2incógnita2+norte1incógnita+norte0=98765incógnita2+43219876incógnita+54321098{\displaystyle q(x)=n_{2}x^{2}+n_{1}x+n_{0}=98765x^{2}+43219876x+54321098\,}

El propósito de definir estos polinomios es que si podemos calcular su producto r ( x ) = p ( x ) q ( x ) , nuestra respuesta será r ( B ) = m × n .

En el caso de que los números que se multiplican sean de diferente magnitud, es útil usar diferentes valores de k para m y n , que llamaremos k m y k n . Por ejemplo, el algoritmo "Toom-2.5" se refiere a Toom-Cook con k m  =  3 y k n  =  2. En este caso, el i en B  = b i se elige típicamente de la siguiente manera: 

i=máximo{registrobmetrokmetro,registrobnorteknorte}.{\displaystyle i=\max \left\{\left\lfloor {\frac {\left\lceil \log _{b}m\right\rceil }{k_{m}}}\right\rfloor ,\left\lfloor {\frac {\left\lceil \log _{b}n\right\rceil }{k_{n}}}\right\rfloor \right\}.}

Evaluación

El método de Toom-Cook para calcular el producto polinomialpag(incógnita)q(incógnita){\displaystyle p(x)q(x)}es uno de uso común. Nótese que un polinomio de gradod{\displaystyle d}está determinado de forma única pord+1{\displaystyle d+1}puntos (por ejemplo, una línea – un polinomio de grado uno está especificado por dos puntos). La idea es evaluarpag(){\displaystyle p(\cdot )}yq(){\displaystyle q(\cdot )}en varios puntos. Luego, multiplica sus valores en esos puntos para obtener puntos en el polinomio producto. Finalmente, interpola para hallar sus coeficientes.

Desdegrados(pagq)=grados(pag)+grados(q){\displaystyle \deg(pq)=\deg(p)+\deg(q)}, necesitaremosgrados(pag)+grados(q)+1=kmetro+knorte1{\displaystyle \deg(p)+\deg(q)+1=k_{m}+k_{n}-1}puntos para determinar el resultado final. Llame a estod{\displaystyle d}. En el caso de Toom-3,d=5{\displaystyle d=5}El algoritmo funcionará independientemente de los puntos que se elijan (con algunas pequeñas excepciones, véase el requisito de invertibilidad de la matriz en Interpolación ), pero para simplificar el algoritmo es mejor elegir valores enteros pequeños como 0, 1, -1 y -2.

Un valor puntual inusual que se usa con frecuencia es el infinito, escrito{\displaystyle \infty }o1/0{\displaystyle 1/0}Para "evaluar" un polinomiopag{\displaystyle p}en el infinito en realidad significa tomar el límite depag(incógnita)/incógnitagradospag{\displaystyle p(x)/x^{\deg p}}comoincógnita{\displaystyle x}va al infinito. En consecuencia,pag(){\displaystyle p(\infty )}siempre es el valor de su coeficiente de grado más alto (en el ejemplo anterior coeficientemetro2{\displaystyle m_{2}}).

En nuestro ejemplo de Toom-3, utilizaremos los puntos0{\displaystyle 0},1{\displaystyle 1},1{\displaystyle -1},2{\displaystyle -2}, y{\displaystyle \infty }Estas opciones simplifican la evaluación, generando las siguientes fórmulas:

pag(0)=metro0+metro1(0)+metro2(0)2=metro0pag(1)=metro0+metro1(1)+metro2(1)2=metro0+metro1+metro2pag(1)=metro0+metro1(1)+metro2(1)2=metro0metro1+metro2pag(2)=metro0+metro1(2)+metro2(2)2=metro02metro1+4metro2pag()=metro2{\displaystyle {\begin{array}{lrlrlr}p(0)&=&m_{0}+m_{1}(0)+m_{2}(0)^{2}&=&m_{0}\\p(1)&=&m_{0}+m_{1}(1)+m_{2}(1)^{2}&=&m_{0}+m_{1}+m_{2}\\p(-1)&=&m_{0}+m_{1}(-1)+m_{2}(-1)^{2}&=&m_{0}-m_{1}+m_{2}\\p(-2)&=&m_{0}+m_{1}(-2)+m_{2}(-2)^{2}&=&m_{0}-2m_{1}+4m_{2}\\p(\infty )&=&m_{2}&&\end{array}}}

y análogamente paraq{\displaystyle q}En nuestro ejemplo, los valores que obtenemos son:

pag(0)=metro0=56789012=56789012pag(1)=metro0+metro1+metro2=56789012+78901234+123456=135813702pag(1)=metro0metro1+metro2=5678901278901234+123456=21988766pag(2)=metro02metro1+4metro2=567890122×78901234+4×123456=100519632pag()=metro2=123456=123456q(0)=norte0=54321098=54321098q(1)=norte0+norte1+norte2=54321098+43219876+98765=97639739q(1)=norte0norte1+norte2=5432109843219876+98765=11199987q(2)=norte02norte1+4norte2=543210982×43219876+4×98765=31723594q()=norte2=98765=98765{\displaystyle {\begin{array}{lrlrlr}p(0)&=&m_{0}&=&56789012&=&56789012\\p(1)&=&m_{0}+m_{1}+m_{2}&=&56789012+78901234+123456&=&135813702\\p(-1)&=&m_{0}-m_{1}+m_{2}&=&56789012-78901234+123456&=&-21988766\\p(-2)&=&m_{0}-2m_{1}+4m_{2}&=&56789012-2\times 78901234+4\times 123456&=&-100519632\\p(\infty )&=&m_{2}&=&123456&=&123456\\[4pt]q(0)&=&n_{0}&=&54321098&=&54321098\\q(1)&=&n_{0}+n_{1}+n_{2}&=&54321098+43219876+98765&=&97639739\\q(-1)&=&n_{0}-n_{1}+n_{2}&=&54321098-43219876+98765&=&11199987\\q(-2)&=&n_{0}-2n_{1}+4n_{2}&=&54321098-2\times 43219876+4\times 98765&=&-31723594\\q(\infty )&=&n_{2}&=&98765&=&98765\end{array}}}

Como se muestra, estos valores pueden ser negativos.

Para una explicación posterior, será útil ver este proceso de evaluación como una multiplicación matriz-vector, donde cada fila de la matriz contiene potencias de uno de los puntos de evaluación, y el vector contiene los coeficientes del polinomio:

(pag(0)pag(1)pag(1)pag(2)pag())=(000102101112(1)0(1)1(1)2(2)0(2)1(2)2001)(metro0metro1metro2)=(100111111124001)(metro0metro1metro2).{\displaystyle \left({\begin{matrix}p(0)\\p(1)\\p(-1)\\p(-2)\\p(\infty )\end{matrix}}\right)=\left({\begin{matrix}0^{0}&0^{1}&0^{2}\\1^{0}&1^{1}&1^{2}\\(-1)^{0}&(-1)^{1}&(-1)^{2}\\(-2)^{0}&(-2)^{1}&(-2)^{2}\\0&0&1\end{matrix}}\right)\left({\begin{matrix}m_{0}\\m_{1}\\m_{2}\end{matrix}}\right)=\left({\begin{matrix}1&0&0\\1&1&1\\1&-1&1\\1&-2&4\\0&0&1\end{matrix}}\right)\left({\begin{matrix}m_{0}\\m_{1}\\m_{2}\end{matrix}}\right).}

Las dimensiones de la matriz son d x k m para p y d x k n para q . La fila correspondiente al infinito siempre es toda cero, excepto por un 1 en la última columna.

Evaluación más rápida

La evaluación multipunto se puede obtener más rápidamente que con las fórmulas anteriores. Se puede reducir el número de operaciones elementales (suma/resta). La secuencia dada por Bodrato [ 6 ] para Toom-3, ejecutada aquí sobre el primer operando (polinomio p ) del ejemplo en ejecución es la siguiente:

pag0metro0+metro2=56789012+123456=56912468pag(0)=metro0=56789012=56789012pag(1)=pag0+metro1=56912468+78901234=135813702pag(1)=pag0metro1=5691246878901234=21988766pag(2)=(pag(1)+metro2)×2metro0=(21988766+123456)×256789012=100519632pag()=metro2=123456=123456.{\displaystyle {\begin{array}{l c l c l c r}p_{0}&\leftarrow &m_{0}+m_{2}&=&56789012+123456&=&56912468\\p(0)&=&m_{0}&=&56789012&=&56789012\\p(1)&=&p_{0}+m_{1}&=&56912468+78901234&=&135813702\\p(-1)&=&p_{0}-m_{1}&=&56912468-78901234&=&-21988766\\p(-2)&=&(p(-1)+m_{2})\times 2-m_{0}&=&(-21988766+123456)\times 2-56789012&=&-100519632\\p(\infty )&=&m_{2}&=&123456&=&123456.\end{array}}}

Esta secuencia requiere cinco operaciones de suma/resta, una menos que la evaluación directa. Además, la multiplicación por4{\displaystyle 4}en el cálculo depag(2){\displaystyle p(-2)}fue salvado.

Multiplicación punto por punto

A diferencia de multiplicar los polinomiospag(){\displaystyle p(\cdot )}yq(){\displaystyle q(\cdot )}multiplicando los valores evaluadospag(a){\displaystyle p(a)}yq(a){\displaystyle q(a)}Simplemente implica multiplicar números enteros , una instancia más pequeña del problema original. Invocamos recursivamente nuestro procedimiento de multiplicación para multiplicar cada par de puntos evaluados. En implementaciones prácticas, a medida que los operandos se vuelven más pequeños, el algoritmo pasará a la multiplicación larga estándar . Siendo r el polinomio producto, en nuestro ejemplo tenemos:

r(0)=pag(0)q(0)=56789012×54321098=3084841486175176r(1)=pag(1)q(1)=135813702×97639739=13260814415903778r(1)=pag(1)q(1)=21988766×11199987=246273893346042r(2)=pag(2)q(2)=100519632×31723594=3188843994597408r()=pag()q()=123456×98765=12193131840.{\displaystyle {\begin{array}{l c l c l c r}r(0)&=&p(0)\,q(0)&=&56789012\times 54321098&=&3084841486175176\\r(1)&=&p(1)\,q(1)&=&135813702\times 97639739&=&13260814415903778\\r(-1)&=&p(-1)\,q(-1)&=&-21988766\times 11199987&=&-246273893346042\\r(-2)&=&p(-2)\,q(-2)&=&-100519632\times -31723594&=&3188843994597408\\r(\infty )&=&p(\infty )\,q(\infty )&=&123456\times 98765&=&12193131840.\end{array}}}

Como se muestra, estos también pueden ser negativos. Para números suficientemente grandes, este es el paso más costoso, el único paso que no es lineal en los tamaños demetro{\displaystyle m}ynorte{\displaystyle n}.

Interpolación

Este es el paso más complejo, el inverso del paso de evaluación: dado nuestrod{\displaystyle d}puntos en el polinomio productor(){\displaystyle r(\cdot )}Necesitamos determinar sus coeficientes. En otras palabras, queremos resolver esta ecuación matricial para el vector del lado derecho:

(r(0)r(1)r(1)r(2)r())=(00010203041011121314(1)0(1)1(1)2(1)3(1)4(2)0(2)1(2)2(2)3(2)400001)(r0r1r2r3r4)=(10000111111111112481600001)(r0r1r2r3r4).{\displaystyle {\begin{aligned}\left({\begin{matrix}r(0)\\r(1)\\r(-1)\\r(-2)\\r(\infty )\end{matrix}}\right)&{}=\left({\begin{matrix}0^{0}&0^{1}&0^{2}&0^{3}&0^{4}\\1^{0}&1^{1}&1^{2}&1^{3}&1^{4}\\(-1)^{0}&(-1)^{1}&(-1)^{2}&(-1)^{3}&(-1)^{4}\\(-2)^{0}&(-2)^{1}&(-2)^{2}&(-2)^{3}&(-2)^{4}\\0&0&0&0&1\end{matrix}}\right)\left({\begin{matrix}r_{0}\\r_{1}\\r_{2}\\r_{3}\\r_{4}\end{matrix}}\right)\\&{}=\left({\begin{matrix}1&0&0&0&0\\1&1&1&1&1\\1&-1&1&-1&1\\1&-2&4&-8&16\\0&0&0&0&1\end{matrix}}\right)\left({\begin{matrix}r_{0}\\r_{1}\\r_{2}\\r_{3}\\r_{4}\end{matrix}}\right).\end{aligned}}}

Esta matriz se construye de la misma manera que la del paso de evaluación, excepto que esd×d{\displaystyle d\times d}Podríamos resolver esta ecuación con una técnica como la eliminación gaussiana , pero esto es demasiado costoso. En su lugar, utilizamos el hecho de que, siempre que los puntos de evaluación se hayan elegido adecuadamente, esta matriz es invertible (véase también la matriz de Vandermonde ), y por lo tanto:

(r0r1r2r3r4)=(10000111111111112481600001)1(r(0)r(1)r(1)r(2)r())=(1000012131162112120112161216200001)(r(0)r(1)r(1)r(2)r()).{\displaystyle {\begin{aligned}\left({\begin{matrix}r_{0}\\r_{1}\\r_{2}\\r_{3}\\r_{4}\end{matrix}}\right)&{}=\left({\begin{matrix}1&0&0&0&0\\1&1&1&1&1\\1&-1&1&-1&1\\1&-2&4&-8&16\\0&0&0&0&1\end{matrix}}\right)^{-1}\left({\begin{matrix}r(0)\\r(1)\\r(-1)\\r(-2)\\r(\infty )\end{matrix}}\right)\\&{}=\left({\begin{matrix}1&0&0&0&0\\{\tfrac {1}{2}}&{\tfrac {1}{3}}&-1&{\tfrac {1}{6}}&-2\\-1&{\tfrac {1}{2}}&{\tfrac {1}{2}}&0&-1\\-{\tfrac {1}{2}}&{\tfrac {1}{6}}&{\tfrac {1}{2}}&-{\tfrac {1}{6}}&2\\0&0&0&0&1\end{matrix}}\right)\left({\begin{matrix}r(0)\\r(1)\\r(-1)\\r(-2)\\r(\infty )\end{matrix}}\right).\end{aligned}}}

Solo queda calcular este producto matriz-vector. Aunque la matriz contiene fracciones, los coeficientes resultantes serán enteros , por lo que todo se puede realizar con aritmética entera, simplemente sumas, restas y multiplicaciones/divisiones por constantes pequeñas. Un desafío de diseño complejo en Toom-Cook es encontrar una secuencia eficiente de operaciones para calcular este producto; una secuencia propuesta por Bodrato [ 6 ] para Toom-3 es la siguiente, ejecutada aquí sobre el ejemplo en ejecución:

r0r(0)=3084841486175176r4r()=12193131840r3(r(2)r(1))/3=(318884399459740813260814415903778)/3=3357323473768790r1(r(1)r(1))/2=(13260814415903778(246273893346042))/2=6753544154624910r2r(1)r(0)=2462738933460423084841486175176=3331115379521218r3(r2r3)/2+2r()=(3331115379521218(3357323473768790))/2+2×12193131840=13128433387466r2r2+r1r4=3331115379521218+675354415462491012193131840=3422416581971852r1r1r3=675354415462491013128433387466=6740415721237444{\displaystyle {\begin{array}{l c l c r}r_{0}&\leftarrow &r(0)&=&3084841486175176\\r_{4}&\leftarrow &r(\infty )&=&12193131840\\r_{3}&\leftarrow &(r(-2)-r(1))/3&=&(3188843994597408-13260814415903778)/3\\&&&=&-3357323473768790\\r_{1}&\leftarrow &(r(1)-r(-1))/2&=&(13260814415903778-(-246273893346042))/2\\&&&=&6753544154624910\\r_{2}&\leftarrow &r(-1)-r(0)&=&-246273893346042-3084841486175176\\&&&=&-3331115379521218\\r_{3}&\leftarrow &(r_{2}-r_{3})/2+2r(\infty )&=&(-3331115379521218-(-3357323473768790))/2+2\times 12193131840\\&&&=&13128433387466\\r_{2}&\leftarrow &r_{2}+r_{1}-r_{4}&=&-3331115379521218+6753544154624910-12193131840\\&&&=&3422416581971852\\r_{1}&\leftarrow &r_{1}-r_{3}&=&6753544154624910-13128433387466\\&&&=&6740415721237444\end{array}}}

Ahora conocemos nuestro polinomio productor{\displaystyle r}:

r(incógnita)=3084841486175176+6740415721237444incógnita+3422416581971852incógnita2+13128433387466incógnita3+12193131840incógnita4{\displaystyle {\begin{array}{rrrl}r(x)=&&3084841486175176&\\&+&6740415721237444&\!\!\!\!x\\&+&3422416581971852&\!\!\!\!x^{2}\\&+&13128433387466&\!\!\!\!x^{3}\\&+&12193131840&\!\!\!\!x^{4}\end{array}}}

Si estuviéramos usando diferenteskmetro,knorte{\displaystyle k_{m},k_{n}}o puntos de evaluación, la matriz y por lo tanto nuestra estrategia de interpolación cambiaría; pero no depende de las entradas y por lo tanto se puede codificar de forma fija para cualquier conjunto dado de parámetros.

Recomposición

Finalmente, evaluamos r(B) para obtener nuestra respuesta final. Esto es sencillo ya que B es una potencia de b y, por lo tanto, las multiplicaciones por potencias de B son todos desplazamientos por un número entero de dígitos en base b . En el ejemplo actual, b = 10⁴ y B = = 10⁸ .

Y este es de hecho el producto de 1234567890123456789012 y 987654321987654321098.

Escisión asimétrica

El paso de interpolación depende del grado del polinomio producto, que es la suma de los grados de los polinomios factoriales, pero no de los grados individuales. Si bien el método Toom-3 básico divide cada factor en 3 partes ( polinomios cuadráticos ), si los factores difieren en tamaño, puede ser beneficioso dividir uno en 2 partes (un polinomio lineal ) y el otro en 4 partes (un polinomio cúbico ) con coeficientes de tamaño más equilibrado. Entonces, el mismo paso de interpolación puede producir un polinomio producto cuártico .

Para Toom-3, esta es la única división alternativa interesante (el caso degenerado de dividir cualquiera de los factores en solo 1 parte no ofrece ningún ahorro de tiempo), pero Toom-Cook de mayor grado permite posibilidades adicionales.

Además de los casos de división equitativa, es posible tener casos de semi-entero que siempre son asimétricos; el número total de partes es impar y el grado del polinomio producto es par. Por ejemplo, Toom-2.5 divide un factor en 2 partes y el otro en 3, mientras que Toom-3.5 puede dividir los factores como 2+5 o 3+4.

Matrices de interpolación para varios k

Aquí proporcionamos matrices de interpolación comunes para algunos valores pequeños comunes diferentes de k m y k n .

Toom-1

Aplicando formalmente la definición, podemos considerar Toom-1 ( k m = k n = 1). Esto no produce un algoritmo de multiplicación, sino un algoritmo recursivo que nunca se detiene, ya que reduce trivialmente cada instancia de entrada a una llamada recursiva con la misma instancia. El algoritmo requiere 1 punto de evaluación, cuyo valor es irrelevante, ya que se utiliza únicamente para "evaluar" polinomios constantes. Por lo tanto, la matriz de interpolación es la matriz identidad:

(1)1=(1).{\displaystyle \left({\begin{matrix}1\end{matrix}}\right)^{-1}=\left({\begin{matrix}1\end{matrix}}\right).}

Toom-1.5

Toom-1.5 ( k m = 2, k n = 1) sigue siendo degenerado: reduce recursivamente una entrada a la mitad, pero deja la otra sin cambios; por lo tanto, solo podemos convertirlo en un algoritmo de multiplicación si proporcionamos un algoritmo de multiplicación de 1 × n como caso base (mientras que el verdadero algoritmo Toom-Cook se reduce a casos base de tamaño constante). Requiere 2 puntos de evaluación, elegidos aquí como 0 e ∞. Su matriz de interpolación es entonces la matriz identidad:

(1001)1=(1001).{\displaystyle \left({\begin{matrix}1&0\\0&1\end{matrix}}\right)^{-1}=\left({\begin{matrix}1&0\\0&1\end{matrix}}\right).}

El algoritmo es esencialmente equivalente a una forma de multiplicación larga: ambos coeficientes de un factor se multiplican por el único coeficiente del otro factor.

Toom-2

Toom-2 ( k m = 2, k n = 2) requiere 3 puntos de evaluación, elegidos aquí como 0, 1 e ∞. Es lo mismo que la multiplicación de Karatsuba , con una matriz de interpolación de:

(100111001)1=(100111001).{\displaystyle \left({\begin{matrix}1&0&0\\1&1&1\\0&0&1\end{matrix}}\right)^{-1}=\left({\begin{matrix}1&0&0\\-1&1&-1\\0&0&1\end{matrix}}\right).}

Toom-2.5

Toom-2.5 ( k m = 3, k n = 2) requiere 4 puntos de evaluación, elegidos aquí como 0, 1, −1 e ∞. Tiene entonces una matriz de interpolación de:

(1000111111110001)1=(10000121211121200001).{\displaystyle \left({\begin{matrix}1&0&0&0\\1&1&1&1\\1&-1&1&-1\\0&0&0&1\end{matrix}}\right)^{-1}=\left({\begin{matrix}1&0&0&0\\0&{\tfrac {1}{2}}&-{\tfrac {1}{2}}&-1\\-1&{\tfrac {1}{2}}&{\tfrac {1}{2}}&0\\0&0&0&1\end{matrix}}\right).}

Notas

  1. Knuth, pág. 296
  2. Crandall y Pomerance, pág. 474
  3. Crandall y Pomerance, pág. 536
  4. Knuth, pág. 302
  5. Resultados positivos , capítulo III de Stephen A. Cook: Sobre el tiempo mínimo de cálculo de las funciones .
  6. 1 2 3 Marco Bodrato. Hacia la multiplicación óptima de Toom-Cook para polinomios univariados y multivariados en característica 2 y 0. En las actas de WAIFI'07 , volumen 4547 de LNCS, páginas 116-133. 21-22 de junio de 2007. Sitio web del autor.

Referencias

  • D. Knuth. El arte de la programación informática , Volumen 2. Tercera edición, Addison-Wesley, 1997. Sección 4.3.3.A: Métodos digitales, pág. 294.
  • R. Crandall y C. Pomerance. Números primos: una perspectiva computacional . Segunda edición, Springer, 2005. Sección 9.5.1: Métodos de Karatsuba y Toom-Cook, pág. 473.
  • Bodrato, Marco (2007). "Hacia la multiplicación óptima de Toom-Cook para polinomios univariados y multivariados en característica 2 y 0" . En Carlet, Claude; Sunar, Berk (eds.). Aritmética de cuerpos finitos, Primer Taller Internacional, WAIFI 2007, Madrid, España, 21-22 de junio de 2007, Actas . Lecture Notes in Computer Science. Vol.  4547. Springer. pp. 116-133 . doi : 10.1007/978-3-540-73074-3_10 . ISBN  978-3-540-73073-6.
  • Bodrato, Marco (8 de agosto de 2011). "Multiplicación óptima de polinomios de Toom-Cook / convolución de Toom-Cook, implementación para polinomios" . Recuperado el 22 de septiembre de 2023 .
  • Multiplicación de tres vías de Toom-Cook de la documentación de GMP: "Multiplicación de tres vías de Toom" . Manual de la biblioteca aritmética de precisión múltiple GNU MP (versión 6.3.0) . Free Software Foundation, Inc. 30 de julio de 2023 [Copyright 1991, 1993-2016, 2018-2020].
Obtenido de " https://en.wikipedia.org/w/index.php?title=Toom–Cook_multiplication&oldid=1346870636 "