stringtranslate.com

Algoritmo de Schönhage-Strassen

El algoritmo de Schönhage-Strassen se basa en el método de multiplicación de enteros por transformada rápida de Fourier (FFT) . Esta figura demuestra cómo multiplicar 1234 × 5678 = 7006652 usando el método FFT simple. Se utiliza la base 10 en lugar de la base 2 w con fines ilustrativos.
Schönhage (a la derecha) y Strassen (a la izquierda) jugando al ajedrez en Oberwolfach , 1979

El algoritmo de Schönhage-Strassen es un algoritmo de multiplicación asintóticamente rápido para números enteros grandes , publicado por Arnold Schönhage y Volker Strassen en 1971. [1] Funciona aplicando recursivamente la transformada rápida de Fourier (FFT) sobre los enteros módulo 2 n +1. La complejidad de bits en tiempo de ejecución para multiplicar dos números de n dígitos usando el algoritmo está en notación O grande .

El algoritmo de Schönhage-Strassen fue el método de multiplicación asintóticamente más rápido conocido desde 1971 hasta 2007. Es asintóticamente más rápido que los métodos más antiguos, como la multiplicación de Karatsuba y Toom-Cook , y comienza a superarlos en la práctica para números de más de 10.000 a 100.000 dígitos decimales. [2] En 2007, Martin Fürer publicó un algoritmo con una complejidad asintótica más rápida. [3] En 2019, David Harvey y Joris van der Hoeven demostraron que la multiplicación de varios dígitos tiene complejidad teórica; sin embargo, su algoritmo tiene factores constantes que lo hacen increíblemente lento para cualquier problema práctico imaginable (ver algoritmo galáctico ). [4]

Las aplicaciones del algoritmo de Schönhage-Strassen incluyen grandes cálculos realizados por sí mismos, como la Gran Búsqueda de Mersenne Prime en Internet y aproximaciones de π , así como aplicaciones prácticas como la factorización de la curva elíptica de Lenstra mediante la sustitución de Kronecker , que reduce la multiplicación de polinomios a multiplicación de enteros. . [5] [6]

Descripción

Esta sección tiene una versión simplificada del algoritmo, que muestra cómo calcular el producto de dos números naturales , módulo de un número de la forma , donde es un número fijo. Los números enteros deben dividirse en bloques de bits, por lo que en implementaciones prácticas es importante lograr el equilibrio adecuado entre los parámetros . En cualquier caso, este algoritmo proporcionará una manera de multiplicar dos números enteros positivos, siempre que se elija de modo que .

Sea el número de bits en las señales y , donde es una potencia de dos. Divida las señales y en bloques de bits cada uno, almacenando los bloques resultantes como matrices (cuyas entradas consideraremos por simplicidad como números enteros de precisión arbitraria).

Ahora seleccionamos un módulo para la transformada de Fourier, como sigue. Sea tal que . También ponga y considere los elementos de las matrices como módulos enteros (precisión arbitraria) . Observe que desde , el módulo es lo suficientemente grande como para acomodar cualquier acarreo que pueda resultar de la multiplicación y . Por lo tanto, el producto (módulo ) se puede calcular evaluando la convolución de . Además, con , tenemos , y también lo es una raíz primitiva de módulo unitario .

Ahora tomamos la transformada discreta de Fourier de las matrices en el anillo , usando la raíz de la unidad para la base de Fourier, dando las matrices transformadas . Como es una potencia de dos, esto se puede lograr en tiempo logarítmico usando una transformada rápida de Fourier .

Sea (producto puntual) y calcule la transformada inversa de la matriz , nuevamente usando la raíz de la unidad . La matriz ahora es la convolución de las matrices . Finalmente, el producto se obtiene evaluando

Este algoritmo básico se puede mejorar de varias maneras. En primer lugar, no es necesario almacenar los dígitos con precisión arbitraria, sino solo hasta bits, lo que proporciona una representación mecánica más eficiente de las matrices . En segundo lugar, está claro que las multiplicaciones en las transformadas directas son simples desplazamientos de bits. Con cierto cuidado, también es posible calcular la transformada inversa utilizando únicamente desplazamientos. Teniendo cuidado, por lo tanto es posible eliminar cualquier multiplicación verdadera del algoritmo, excepto cuando se evalúa el producto puntual. Por lo tanto, es ventajoso seleccionar los parámetros para que este producto puntual se pueda realizar de manera eficiente, ya sea porque es una sola palabra de máquina o usando algún algoritmo optimizado para multiplicar números enteros de un número (idealmente pequeño) de palabras. Por tanto, la selección de los parámetros es un área importante para una mayor optimización del método.

Detalles

Todo número en base B se puede escribir como un polinomio:

Además, la multiplicación de dos números podría considerarse como el producto de dos polinomios:

Porque, para : , tenemos una convolución.

Mediante el uso de FFT ( transformada rápida de Fourier ), utilizada en la versión original en lugar de NTT, [7] con regla de convolución; obtenemos

Eso es; , donde es el coeficiente correspondiente en el espacio de Fourier. Esto también se puede escribir como: fft(a * b) = fft(a) ● fft(b).

Tenemos los mismos coeficientes debido a la linealidad bajo la transformada de Fourier y porque estos polinomios solo constan de un término único por coeficiente:

y

Regla de convolución:

Hemos reducido nuestro problema de convolución a un problema de producto, mediante FFT.

Al encontrar ifft (interpolación polinómica), para cada uno , se obtienen los coeficientes deseados.

El algoritmo utiliza la estrategia de dividir y conquistar para dividir el problema en subproblemas.

Convolución bajo mod N

, donde y en el algoritmo de Schönhage-Strassen.

Dejando:

y

¿Dónde está la raíz enésima?

Se ve que: [8]

Esto significa que se puede usar peso y luego multiplicar por después.

En lugar de utilizar peso; uno puede debido a , en el primer paso de la recursividad (cuando ), calcular:

En FFT normal, que opera con números complejos, se usaría:

Sin embargo, la FFT también se puede utilizar como NTT (transformación teórica de números) en Schönhage-Strassen. Esto significa que tenemos que usar θ que genere números en un campo finito (por ejemplo ).

Una raíz de unidad bajo un campo finito GF( r ) , es un elemento tal que o . Por ejemplo, GF( p ) , donde p es un número primo, da .

Observe que en y en . Para estos candidatos, bajo su campo finito, y por lo tanto actúan de la manera que queremos.

Sin embargo, aún se pueden usar los mismos algoritmos FFT, siempre que θ sea la raíz de la unidad de un campo finito.

Para encontrar la transformación FFT/NTT, hacemos lo siguiente:

El primer producto da contribución a , para cada k . El segundo contribuye a , debido al mod .

Para hacer lo inverso:

o

dependiendo de si fft uno usa datos normalizados o no.

Uno multiplica por , para normalizar los datos de fft a un rango específico, donde , donde m se encuentra usando el inverso multiplicativo modular.

Detalles de implementacion

Por qué N = 2 M + 1 en mod N

En el algoritmo de Schönhage-Strassen ,. Uno debería pensar en esto como un árbol binario, donde uno tiene valores en . Al dejar , se pueden encontrar todos para cada K : Se pueden agrupar todos los pares en M grupos diferentes. Usar para agrupar pares mediante convolución es un problema clásico en algoritmos. [9] Por ejemplo: Sea k el ingreso total, i el ingreso del hombre y j el ingreso de la mujer; Al utilizar la convolución, se pueden agrupar en K grupos según el ingreso total deseado.

Teniendo esto en cuenta, ayúdanos a agrupar en grupos, para cada grupo de subtareas en profundidad k ; en árbol con

Observe que , para algunos L. Este es el número de Fermat. Al hacer mod , tenemos algo llamado anillo Fermat.

Debido a que algunos números de Fermat son primos de Fermat, en algunos casos se pueden evitar los cálculos.

Hay otros N que podrían haberse utilizado, por supuesto, con las mismas ventajas de los números primos. Al dejar , uno tiene el número máximo en un número binario con bits. es un número de Mersenne, que en algunos casos es un número primo de Mersenne. Es un candidato natural contra el número de Fermat

En busca de otro N

Hacer varios cálculos mod contra diferentes N puede ser útil cuando se trata de resolver un producto entero. Utilizando el teorema del resto chino , después de dividir M en tipos diferentes más pequeños de N , se puede encontrar la respuesta de la multiplicación xy [10]

Los números de Fermat y los números de Mersenne son solo dos tipos de números, en algo llamado número de Fermat Mersenne generalizado (GSM); con fórmula: [11]

En esta fórmula; es un número de Fermat y es un número de Mersenne.

Esta fórmula se puede utilizar para generar conjuntos de ecuaciones, que se pueden utilizar en CRT (teorema del resto chino): [12]

, donde g es un número tal que existe una x donde , suponiendo

Además; , donde a es un elemento que genera elementos de forma cíclica.

Si , dónde , entonces .

Cómo elegir K para una N específica

La siguiente fórmula ayuda a encontrar un K adecuado (número de grupos para dividir N bits) dado el tamaño de bit N calculando la eficiencia: [13]

N es el tamaño de bits (el que se usa en ) en el nivel más externo. K da grupos de bits, donde .

n se encuentra a través de N, K y k encontrando el x más pequeño , tal que

Si se supone una eficiencia superior al 50% y k es muy pequeño en comparación con el resto de la fórmula; uno consigue

Esto significa: Cuando algo es muy efectivo; K está ligado arriba por o asintóticamente ligado arriba por

Pseudocódigo

Siguiendo el algoritmo, el algoritmo de multiplicación modular estándar de Schönhage-Strassen (con algunas optimizaciones) se encuentra en una descripción general en [14]

  1. Divida ambos números de entrada a y b en n coeficientes de s bits cada uno.

    Utilice al menos bits para almacenarlos,

    para permitir la codificación del valor
  2. Pondere ambos vectores de coeficientes según (2.24) con potencias de θ realizando desplazamientos cíclicos sobre ellos.
  3. Mezcla los coeficientes y .
  4. Evaluar y . Las multiplicaciones por potencias de ω son cambios cíclicos.
  5. No hagas multiplicaciones puntuales en . Si SMUL se usa de forma recursiva, proporcione K como parámetro. De lo contrario, utilice alguna otra función de multiplicación como T3MUL y luego reduzca el módulo.
  6. Mezcla los coeficientes del producto .
  7. Evaluar los coeficientes del producto .
  8. Aplicar los contrapesos según (2.25). Ya que se deduce que
  9. Normalice el con (nuevamente un cambio cíclico).
  10. Sume y propague los acarreos. Asegúrese de manejar adecuadamente los coeficientes negativos.
  11. Haz un módulo de reducción .

Estudio adicional

Para obtener detalles sobre la implementación, se puede leer el libro Números primos: una perspectiva computacional . [15] Esta variante difiere algo del método original de Schönhage en que explota la transformada ponderada discreta para realizar convoluciones negacíclicas de manera más eficiente. Otra fuente de información detallada es The Art of Computer Programming de Knuth . [dieciséis]

Optimizaciones

Esta sección explica una serie de optimizaciones prácticas importantes al implementar Schönhage-Strassen.

Uso de otro algoritmo de multiplicación, algoritmo interno.

Por debajo de cierto punto de corte, es más eficiente utilizar otros algoritmos de multiplicación, como la multiplicación de Toom-Cook . [17]

Raíz cuadrada de 2 truco

La idea es utilizar como raíz de la unidad de orden en un campo finito (es una solución de la ecuación ), al ponderar valores en el enfoque NTT (transformación teórica de números). Se ha demostrado que ahorra un 10% en el tiempo de multiplicación de números enteros. [18]

El truco de Granlund

Dejando ; se puede calcular y . En combinación con CRT (Teorema del resto chino), para encontrar valores exactos de multiplicación uv [19]

Referencias

  1. ^ Schönhage, Arnold ; Strassen, Volker (1971). "Schnelle Multiplikation großer Zahlen" [Multiplicación rápida de números grandes]. Computación (en alemán). 7 (3–4): 281–292. doi :10.1007/BF02242355. S2CID  9738629.
  2. ^ La multiplicación de Karatsuba tiene una complejidad asintótica de aproximadamente y la multiplicación de Toom-Cook tiene una complejidad asintótica de aproximadamente

    Van Meter, Rodney; Itoh, Kohei M. (2005). "Exponenciación modular cuántica rápida". Revisión física . 71 (5): 052320. arXiv : quant-ph/0408006 . Código Bib : 2005PhRvA..71e2320V. doi : 10.1103/PhysRevA.71.052320. S2CID  14983569.

    Se puede encontrar una discusión sobre puntos de cruce prácticos entre varios algoritmos en: Descripción general de las características de Magma V2.9, sección aritmética Archivado el 20 de agosto de 2006 en Wayback Machine.

    Luis Carlos Coronado García, "¿Puede la multiplicación de Schönhage acelerar el cifrado o descifrado RSA? Archivado", Universidad Tecnológica de Darmstadt (2005)

    La biblioteca GNU Multi-Precision lo utiliza para valores de al menos 1728 a 7808 palabras de 64 bits (33 000 a 150 000 dígitos decimales), según la arquitectura. Ver:

    "Multiplicación FFT (GNU MP 6.2.1)". gmplib.org . Consultado el 20 de julio de 2021 .

    "MUL_FFT_THRESHOLD". Rincón de los desarrolladores de GMP . Archivado desde el original el 24 de noviembre de 2010 . Consultado el 3 de noviembre de 2011 .

    "MUL_FFT_THRESHOLD". gmplib.org . Consultado el 20 de julio de 2021 .

  3. ^ El algoritmo de Fürer tiene complejidad asintótica
    Fürer, Martín (2007). "Multiplicación de enteros más rápida" (PDF) . Proc. ESTOC '07 . Simposio sobre teoría de la computación, San Diego, junio de 2007, págs. 57–66. Archivado desde el original (PDF) el 5 de marzo de 2007.
    Fürer, Martín (2009). "Multiplicación de enteros más rápida". Revista SIAM de Computación . 39 (3): 979–1005. doi :10.1137/070711761. ISSN  0097-5397.

    El algoritmo de Fürer se utiliza en la biblioteca de código abierto de subprogramas de álgebra polinomial básica (BPAS). Ver: Covanov, Svyatoslav; Mohajerani, Davood; Moreno Maza, Marc; Wang, Linxiao (8 de julio de 2019). "Big Prime Field FFT en procesadores multinúcleo". Actas del Simposio internacional sobre computación simbólica y algebraica de 2019 (PDF) . Pekín China: ACM. págs. 106-113. doi :10.1145/3326229.3326273. ISBN 978-1-4503-6084-5. S2CID  195848601.

  4. ^ Harvey, David; van der Hoeven, Joris (2021). "Multiplicación de enteros en el tiempo O ( n log ⁡ n ) {\displaystyle O(n\log n)} " (PDF) . Anales de Matemáticas . Segunda Serie. 193 (2): 563–617. doi : 10.4007/anales.2021.193.2.4. SEÑOR  4224716. S2CID  109934776.
  5. ^ Este método se utiliza en la biblioteca ECM de INRIA.
  6. ^ "ECMNET". miembros.loria.fr . Consultado el 9 de abril de 2023 .
  7. ^ Becker, Hanón; Hwang, Vicente; J. Kannwischer, Matías; Panny, Lorenz (2022). "Multiplicación eficiente de números enteros algo pequeños mediante transformaciones de teoría de números" (PDF) .
  8. ^ Lüders, Christoph (2014). "Multiplicación rápida de números enteros grandes: implementación y análisis del algoritmo DKSS". pag. 26.
  9. ^ Kleinberg, Jon; Tardós, Eva (2005). Diseño de algoritmos (1 ed.). Pearson. pag. 237.ISBN 0-321-29535-8.
  10. ^ Gaudry, Pierrick; Alejandro, Kruppa; Pablo, Zimmermann (2007). "Una implementación basada en GMP del algoritmo de multiplicación de enteros grandes de Schönhage-Strassen" (PDF) . pag. 6.
  11. ^ S. Dimitrov, Vassil; V. Cooklev, Todor; D. Donevsky, Borislav (1994). "Transformada teórica de números de Fermat-Mersenne generalizada". pag. 2.
  12. ^ S. Dimitrov, Vassil; V. Cooklev, Todor; D. Donevsky, Borislav (1994). "Transformada teórica de números de Fermat-Mersenne generalizada". pag. 3.
  13. ^ Gaudry, Pierrick; Kruppa, Alejandro; Zimmermann, Paul (2007). "Una implementación basada en GMP del algoritmo de multiplicación de enteros grandes de Schönhage-Strassen" (PDF) . pag. 2.
  14. ^ Lüders, Christoph (2014). "Multiplicación rápida de números enteros grandes: implementación y análisis del algoritmo DKSS". pag. 28.
  15. ^ R. Crandall y C. Pomerance. Números primos: una perspectiva computacional . Segunda edición, Springer, 2005. Sección 9.5.6: Método de Schönhage, p. 502. ISBN 0-387-94777-9 
  16. ^ Knuth, Donald E. (1997). "§ 4.3.3.C: Transformadas discretas de Fourier". El arte de la programación informática . vol. 2: Algoritmos seminuméricos (3ª ed.). Addison-Wesley. págs. 305–311. ISBN 0-201-89684-2.
  17. ^ Gaudry, Pierrick; Kruppa, Alejandro; Zimmermann, Paul (2007). "Una implementación basada en GMP del algoritmo de multiplicación de enteros grandes de Schönhage-Strassen" (PDF) . pag. 7.
  18. ^ Gaudry, Pierrick; Kruppa, Alejandro; Zimmermann, Paul (2007). "Una implementación basada en GMP del algoritmo de multiplicación de enteros grandes de Schönhage-Strassen" (PDF) . pag. 6.
  19. ^ Gaudry, Pierrick; Kruppa, Alejandro; Zimmermann, Paul (2007). "Una implementación basada en GMP del algoritmo de multiplicación de enteros grandes de Schönhage-Strassen" (PDF) . pag. 6.