Para ampliar la idea de Steven Stadnicki, podemos construir rápidamente un algoritmo ingenuo que funcione mejor que la multiplicación de matrices usando la Transformada discreta de Fourier.
Contamos el número de unos en . Si menos de la mitad de los bits son unos, construimos una lista vinculada de sus posiciones. Para multiplicar, simplemente desplazamos hacia la izquierda por cada posición en la lista (multiplicando por ese bit que está representado) y agregamos los resultados.BAB
Si más de la mitad de los bits son unos, hacemos lo mismo que arriba, pero en su lugar usamos los ceros para completar la lista de posiciones. La idea es que restaremos esta suma de la suma que se obtendría multiplicando por todas. Para obtener la suma de todos, cambiamos por el número de bits en y restamos de esto. Entonces podemos restar nuestra suma obtenida de la lista vinculada.A BBAB
Podemos llamar a eso el ingenuo algoritmo de lista enlazada. Su tiempo de ejecución es en el peor de los casos, pero en el caso promedio, que es más rápido que DFT para pequeños.O ( | B | √O(n2)| A|O(|B||A|2π−−−√)|A|
Para utilizar la idea de listas de manera óptima, utilizamos divide y vencerás. Dividimos por la mitad y encontramos los tamaños de las listas asociadas utilizando el algoritmo ingenuo. Si son mayores que 5, llamamos al algoritmo ingenuo nuevamente en mitades mayores a 5 hasta que logremos cortar todas las mitades a menos de cinco. (Esto se debe a que podemos reducir esto a 4 restas)A
Aún mejor, mejoramos nuestro algoritmo de divide y vencerás. Recorremos todas las combinaciones posibles de ramificación, escogiendo con avidez la mejor. Este preprocesamiento tarda aproximadamente el mismo tiempo que la multiplicación real.
Si se nos permite una libertad infinita con el preprocesamiento, resolvemos el algoritmo optimizado de dividir y conquistar para todas las ramas de manera óptima. Esto lleva tiempo en el peor de los casos, pero debería ser ~ óptimo mediante métodos de cadena de adición.O(2|A|)
Estoy trabajando en calcular valores más exactos para los algoritmos anteriores.