Para expandir a idéia de Steven Stadnicki, podemos rapidamente construir um algoritmo ingênuo que se sai melhor do que a multiplicação de matrizes usando a Transformada Discreta de Fourier.
Contamos o número de uns em . Se menos da metade dos bits forem um, construímos uma lista vinculada de suas posições. Para multiplicar, simplesmente deslocamos para cada posição da lista (multiplicando pelo bit representado) e adicionamos os resultados.BAB
Se mais da metade dos bits são um, fazemos o mesmo que acima, mas usamos os zeros para preencher a lista de posições. A idéia é que subtrairemos essa soma da soma que seria obtida multiplicando por todas. Para obter a soma de todos, alteramos pelo número de bits em e subtraímos disso. Em seguida, podemos subtrair nossa soma obtida da lista vinculada.A BBAB
Podemos chamar isso de ingênuo algoritmo de lista vinculada. Seu tempo de execução é no pior caso, mas no caso médio, que é mais rápido que o DFT para pequenos.O ( | B | √O(n2)O(|B||A|2π−−−√)|A|
Para usar a idéia de listas de maneira ideal, usamos dividir e conquistar. Dividimos ao meio e localizamos os tamanhos das listas associadas usando o algoritmo ingênuo. Se eles são maiores que 5, chamamos o algoritmo ingênuo novamente em metades maiores que 5 até conseguirmos cortar todas as metades para menos de cinco. (Isso ocorre porque podemos reduzir isso para 4 subtrações)A
Ainda melhor ainda, melhoramos nosso algoritmo de dividir e conquistar. Repetimos todas as combinações possíveis de ramificação, escolhendo avidamente a melhor. Esse pré-processamento leva aproximadamente o mesmo tempo que a multiplicação real.
Se nos for permitida liberdade infinita com o pré-processamento, resolveremos o algoritmo otimizado de dividir e conquistar para todos os ramos da melhor maneira possível. Isso leva tempo na pior das hipóteses, mas deve ser ótimo pelos métodos da cadeia de adição.O(2|A|)
Estou trabalhando no cálculo de valores mais exatos para os algoritmos acima.