2009-05-14 89 views
10

Necesito multiplicar varios enteros largos de 1000s de la manera más eficiente posible en Python. Los números se leen de un archivo.Entender el algoritmo de Schönhage-Strassen (multiplicación de enteros grandes)

Estoy tratando de implementar el algoritmo Schönhage-Strassen para la multiplicación de enteros, pero estoy atascado en la comprensión de la definición y las matemáticas detrás de ella, especialmente la Transformada rápida de Fourier.

Cualquier ayuda para comprender este algoritmo, como un ejemplo práctico o algún pseudocódigo sería muy apreciado.

+0

Una sugerencia muy importante: no intente implementar su propia FFT a menos que realmente tenga que hacerlo. Si está disponible para python, intente utilizar el FFTW para su cálculo. Será muy superior a cualquier cosa con la que puedas soñar alguna vez. Una simple FFT no es tan difícil, pero la parte más difícil es hacerlo rápido, especialmente si los números que estás crujiendo no son poderes de poderes de dos. – LiKao

+1

@LiKao: Schönhage-Strassen se implementa normalmente utilizando un vector de tamaño fijo de enteros de tamaño arbitrario y la Transformación teórica numérica, mientras que las FFT implementadas por paquetes como FFTW utilizan elementos de coma flotante y de tamaño fijo, por lo que no son realmente muy útil. –

Respuesta

4

El capítulo 4.3.3 de Knuth's TAOCP lo describe y también tiene algunos pseudocódigos FFT en otros capítulos que podrían usarse para esto.

2

1000 dígitos es "pequeño" para que valga la pena usar Schönhage-Strassen. Puede echar un vistazo a la multiplicación Toom Cook. gmpy es un contenedor Python a gmp que proporciona estas funciones.

+1

+1, aunque espero que el OP sea consciente de eso. La entrada de wikipedia con la que se vinculó explica esto muy temprano ("comienza a superar a los métodos anteriores [...] (10,000 a 40,000 dígitos decimales). – schnaader

+1

lo siento, soy consciente de eso, quise preguntar" varios miles de dígitos " Voy a editar la pregunta. – JPCosta

2

No reinventar la rueda. GMP tiene una excelente implementación de alto rendimiento de este algoritmo y cualquier algoritmo escrito en Python puro será al menos 100 veces más lento, simplemente porque Python es un lenguaje interpretado. Use gmpy para llamar a GMP desde su aplicación Python. También me llama la atención qué aplicación en la que estás trabajando requiera la multiplicación de tan grandes cantidades; puede haber una forma más sencilla de manejar tu problema.

Además, como se menciona en otras respuestas, "varios dígitos de 1000 de longitud" no es lo suficientemente largo como para justificar Schönhage-Strassen (tendría que tener al menos 10000 dígitos decimales, probablemente más). Algunas variantes de Toom-Cook como Toom-3 se usan normalmente en este rango. Una vez más, no escriba esto usted mismo en Python: la implementación de GMP se optimiza cuidadosamente.

+0

Bueno, ¿qué pasa con PyopenCL, por ejemplo? – user2284570

Cuestiones relacionadas