Qual é o algoritmo mais rápido para multiplicar dois números de n dígitos?

21

Quero saber qual algoritmo é mais rápido para a multiplicação de dois números de n dígitos? A complexidade do espaço pode ser relaxada aqui!

Andy
fonte
1
Você está interessado na questão teórica ou na questão prática?
Yuval Filmus
Ambos, mas mais inclinados para o prático!
Andy
1
Para a pergunta prática, eu recomendo usar o GMP. Se você está curioso para saber o que eles usam, consulte a documentação ou o código-fonte.
Yuval Filmus
Ninguém sabe. Ainda não o encontramos.
21413 JeffE

Respostas:

22

Atualmente, o algoritmo de Fürer de Martin Fürer possui uma complexidade temporal de que utiliza transformadas de Fourier sobre números complexos. Seu algoritmo é realmente baseado no algoritmo de Schönhage e Strassen, que tem uma complexidade de denregistro(n)2Θ(euog(n))Θ(nregistro(n)registro(registro(n)))

Outros algoritmos que são mais rápidos que o algoritmo de multiplicação da escola primária são a multiplicação de Karatsuba, que possui uma complexidade de tempo de ≈ e de algoritmo Toom 3, que possui complexidade de tempo deO(nregistro23)O(n1,585)Θ(n1.465)

Observe que esses são os algoritmos rápidos. Encontrar o algoritmo mais rápido para multiplicação é um problema em aberto na Ciência da Computação.

Referências :

  1. Algoritmo de Fürer
  2. Multiplicação baseada em FFT de grandes números
  3. Transformação rápida de Fourier
  4. Multiplicação Toom – Cook
  5. Algoritmo de Schönhage – Strassen
  6. Algoritmo de Karatsuba
avi
fonte
Observe o artigo recente de D. Harvey e J. van der Hoeven (março de 2019) descrevendo um algoritmo com complexidade . O(nemn)
hardmath 28/04
9

Observe que os algoritmos FFT listados por avi adicionam uma constante grande, tornando-os impraticáveis ​​para números menores que milhares + bits.

Além dessa lista, existem outros algoritmos interessantes e perguntas em aberto:

  • Multiplicação de tempo linear em um modelo de RAM (com pré-computação)
  • A multiplicação por uma constante é sub-linear ( PDF ) - significa um número sublinear de adições que obtém um total decomplexidadede. Isso é essencialmente equivalente à multiplicação longa (onde você alterna / adiciona com base no número des no número inferior), que é, mas com umaceleração.1O(n2)O(logn)O(n2registron)1O(n2)O(registron)
  • Sistema de números de resíduos e outras representações de números; multiplicação é tempo quase linear. A desvantagem é que a multiplicação é modular e {detecção de transbordamento, paridade, comparação de magnitude} são tão difíceis ou quase tão difíceis quanto converter o número de volta para representação binária ou similar e fazer a comparação tradicional; essa conversão é pelo menos tão ruim quanto a multiplicação tradicional (no momento, AFAIK).
    • Outras representações:
      • [ Representação logarítmica ]: multiplicação é adição da representação logarítmica. Exemplo:
        16×32.=2registro216+registro232.=24+5=29
        • O lado negativo é que a conversão para e da representação logarítmica pode ser tão difícil quanto a multiplicação ou mais difícil, a representação também pode ser fracionária / irracional / aproximada etc. Outras operações (adição?) Provavelmente são mais difíceis.
      • Representação canônica : representa os números como expoentes da fatoração primária. Multiplicação é a adição dos expoentes. Exemplo:
        36.×48.=3251×223141=22324151
      • A desvantagem é que requer fatores ou fatoração, um problema muito mais difícil que a multiplicação. Outras operações, como adição, provavelmente são muito difíceis.
Realz Slaw
fonte
1
Acredito que uma abordagem baseada no teorema de resíduos / resíduo chinês com os módulos certos pode levar a acelerações sobre a multiplicação tradicional, mesmo com a conversão de volta; em algum momento, isso ocorreu no capítulo 4 do TAOCP, pelo menos como uma nota de rodapé. (Ainda não chegar perto os métodos baseados em FFT, mas é uma nota histórica interessante)
Steven Stadnicki
@StevenStadnicki oh legal, eu preciso olhar para isso então; você conhece a complexidade?
Realz Slaw