1 votos

Multiplicación de enteros sin valores intermedios

Estoy haciendo un proyecto de programación para aprender, en el que intento calcular potencias de números muy grandes en el menor tiempo posible.

Una cosa que podría hacer es intentar hacer la multiplicación de dos números sin utilizar ningún valor intermedio. Supongo que un algoritmo de este tipo recorrería los dígitos desde el más significativo hasta el menos.

¿Cuál es un buen algoritmo para multiplicar dos enteros sin utilizar valores intermedios?

(Nota: También publiqué esta pregunta, de forma más orientada a la programación, en Stack Overflow: https://stackoverflow.com/questions/8408139/in-place-integer-multiplication )

1voto

John Fouhy Puntos 759

Probablemente no es lo que querías decir, pero también es una respuesta a tu pregunta. La multiplicación rápida de enteros utiliza algoritmos totalmente diferentes al algoritmo de la "alta escuela". Puedes encontrar una descripción de algunos de estos algoritmos en Wikipedia o en el documentación de GMP, que es una biblioteca para la aritmética exacta rápida.

El más sencillo de ellos, la multiplicación de Karatsuba, es similar al conocido algoritmo de multiplicación de matrices de Strassen. Para multiplicar dos números $x$ y $y$ Primero divide ambos números en dos mitades más o menos iguales $x = x_H x_L$ , $y = y_H y_L$ . Hay un truco que permite el cálculo de $xy$ dado sólo tres multiplicaciones de números de tamaño medio, a costa de tener más sumas (el algoritmo trivial requiere cuatro: $x_Hy_H,x_Hy_Lx_Ly_H,x_Ly_L$ ). Cuando se aplica recursivamente, el rendimiento es $O(n^{\log_2 3})$ en lugar de $O(n^2)$ . La idea se generaliza al algoritmo Toom-Cook, que divide los números en más de dos partes.

El algoritmo de Karatsuba sólo vale la pena para números lo suficientemente grandes (la multiplicación de secundaria lo supera para números pequeños). Para números aún más grandes, se utilizan métodos de FFT. La idea es pensar en la multiplicación de enteros como una multiplicación polinómica (después de todo, un entero en base $B$ es un polinomio en $B$ ), y luego utilizar la FFT para multiplicar los polinomios (aplicar la FFT, multiplicar los resultados puntualmente, aplicar la FFT inversa). Esto mejora la asintótica a $\tilde{O}(n\log n)$ .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X