¿Por qué el algoritmo de multiplicación de tiempo lineal de Knuth no "cuenta"?

13

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 ntiempo, 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.
Craig Gidney
fuente
Esto puede ser relevante: en.wikipedia.org/wiki/Transdichotomous_model
R .. GitHub DEJA DE AYUDAR AL HIELO

Respuestas:

16

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(Iniciar sesiónnorte), dónde nortees el tamaño de la entrada. La complejidad de bits es, sin embargo,O(norteIniciar sesiónnorteIniciar sesiónIniciar sesiónnorte), 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Ω(norteIniciar sesiónnorte), aunque no está claro si esto debería ser ajustado, y no se conocen límites inferiores no triviales (por lo tanto, esto Ω(norteIniciar sesiónnorte) 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).

Yuval Filmus
fuente
2
Gracias por la aclaración. No tengo una copia de TAOCP, así que todo lo que tuve que pasar fue lo que estaba en el artículo wiki (veo que ya lo has editado para solucionar el problema).
Craig Gidney