La página de Wikipedia sobre algoritmos de multiplicación menciona una interesante de Donald Knuth . Básicamente, implica combinar la multiplicación de transformada de Fourier con una tabla precalculada de multiplicaciones de tamaño logarítmico. Se ejecuta en tiempo lineal.
El artículo actúa como si este algoritmo de alguna manera no cuenta como un algoritmo de multiplicación "verdadero". Más significativamente, ¡se considera una pregunta abierta si la multiplicación se puede hacer en un O(n lg n)
tiempo parejo !
¿Qué detalles de este algoritmo lo descalifican de contar como un algoritmo de multiplicación "verdadero"?
Mis conjeturas son:
- El cálculo previo de la tabla lleva más tiempo lineal. Por otro lado, todavía se puede hacer a
n lg n
tiempo, por lo que aún parece impresionante. - El acceso aleatorio de alguna manera no está permitido. Pero entonces, ¿por qué otros algoritmos pueden usar cosas como tablas hash y punteros?
- De alguna manera, se escala mal a medida que aumenta el tamaño de palabra de una máquina, como si tuviera una máquina de 256 bits que realiza multiplicaciones de 256 bits en una sola instrucción, entonces no tiene sentido este algoritmo hasta que tenga más de 2 ^ 256 elementos. Por otro lado, nos molestamos con el factor inverso de Ackermann en union-find.
- El "¿hay un algoritmo de multiplicación de tiempo lineal?" La pregunta es secretamente en términos de alguna máquina más débil, pero esto solo se insinúa.
algorithms
runtime-analysis
multiplication
Craig Gidney
fuente
fuente
Respuestas:
Si bien el algoritmo que menciona aparece en el TAOCP de Knuth, ciertamente no se debe a Knuth, y es más conocido como el algoritmo de Schönhage-Strassen ; Knuth incluso les atribuye este algoritmo en el texto. De hecho, este algoritmo se ejecuta en tiempo lineal en la llamada máquina RAM , en la que las variables pueden contener enteros de tamañoO ( logn ) , dónde norte es el tamaño de la entrada. La complejidad de bits es, sin embargo,O ( n logn logIniciar sesiónn ) , y para este modelo, el algoritmo de Fürer es más rápido.
La búsqueda de algoritmos de multiplicación de enteros rápidos en la literatura se ha concentrado en la complejidad de bits como medida de complejidad; Esto es como permitir que sus registros contengan solo un bit (o soloC bits para alguna constante arbitraria C ) Se espera que la multiplicación entera tomeΩ ( n logn ) , aunque no está claro si esto debería ser ajustado, y no se conocen límites inferiores no triviales (por lo tanto, esto Ω ( n logn ) es solo una conjetura).
Para una discusión sobre el modelo "correcto" para la multiplicación práctica de enteros grandes, consulte el artículo reciente de Fürer . Su conclusión es a favor del algoritmo "práctico" de Schönhage-Strassen (hay dos de ellos, y el otro tiene una mejor complejidad de bits pero funciona peor en la práctica; Fürer aborda este tema en el documento).
fuente