Por que a transformação no algoritmo de multiplicação de Schönhage – Strassen é barata?


8

O algoritmo de multiplicação de Schönhage-Strassen funciona transformando multiplicações de tamanho em muitas multiplicações de tamanho com uma transformação teórica numérica e recorrendo. Pelo menos eu acho que é o que faz, porque há alguma outra inteligência e eu realmente não a entendo o suficiente para resumir com precisão. Ele termina em .Nlg(N)O(Nlg(N)lg(lg(N)))

Uma transformação teórica numérica é exatamente como uma Transformada Discreta de Fourier , exceto que é feita no campo finito do número inteiro módulo . Isso torna as operações muito mais baratas, uma vez que a transformação de Fourier se multiplica por raízes da unidade, e as raízes da unidade de são todas potências de 2, para que possamos mudar! Além disso, números inteiros são muito mais fáceis de trabalhar do que números complexos de ponto flutuante.F2N+12N+1F2N+1

De qualquer forma, o que me confunde é que é muito grande. Se eu fornecer um elemento aleatório de , são necessários bits para especificá-lo. Portanto, a adição de dois elementos deve levar tempo . E a DFT faz muita adição.F2N+1F2N+1O(N)O(N)

Schönhage – Strassen divide a entrada em grupos com bits . Esses grupos são os valores de que ele transformará. Cada passagem do DFT terá adições / subtrações, e há . Portanto, com base na adição que leva tempo , parece que o custo de todas essas adições deve ser , que é assintoticamente o mesmo que .Nlg(N)lg(N)F2N+1O(Nlg(N))O(lg(Nlg(N)))O(N)O(NNlg(N)lg(Nlg(N)))O(N2)

Podemos fazer um pouco melhor que isso ... porque os valores começam muito pequenos, as adições são muito escassas. As adições da primeira passagem realmente custam apenas cada, e a segunda passagem 'custa cada, e a i-ésima passagem' custa cada, mas isso ainda totaliza um terrível .O(lg(N))21O(lg(N))O(min(N,2ilg(N)))N2lg(N)

Como Schönhage – Strassen está tornando as adições baratas? Quanto eles custam no geral?

É porque o algoritmo realmente usa (com garantido que é uma potência de 2)? Há bastante e alemão empilhados no jornal que eu realmente não tenho certeza. Por outro lado, não acho que isso garanta raízes de unidade suficientes para que as coisas funcionem.FN+1N22n


Você leu o artigo da Wikipedia? No mínimo, não está em alemão. Segundo a Wikipedia, o tamanho é reduzido de para em cada etapa, o que ocorre desde então . NnNn2=Θ(N)
Yuval Filmus

@Yuval Onde você vê no artigo? Há muitas "raízes primitivas" e um truque extra de otimização envolvendo raízes quadradas, mas, caso contrário, não a vejo. Eu vejo "Divida cada número de entrada nos vetores X e Y de partes cada, onde divide N.", mas nenhuma definição de . nN2k2kk
Craig Gidney

@Yuval Isso parece ajudar ... mas ainda há acréscimos de por passagem com cada custo . Portanto, um passe custa , o que é melhor, mas não é bom o suficiente. O(N)O(N)O(N32)
22714 Craig Gidney

11
A configuração de aparece na frase "O número ideal de peças para dividir a entrada é proporcional a ." O valor de é então , portanto, cada adição custa . kNn2Θ(N)+1O(N)
Yuval Filmus

Respostas:


5

De acordo com o artigo da Wikipedia , a cada etapa, o comprimento dos números inteiros é reduzido de para (aproximadamente) , e existem (aproximadamente) deles, e as adições custam apenas . Há uma análise detalhada do tempo de execução no parágrafo final da seção vinculada, copiada aqui, caso ela mude:NNNO(N)

Na etapa recursiva, a observação é usada para:

  • Cada elemento dos vetores de entrada possui no máximo bits;N/2k
  • O produto de quaisquer dois elementos do vetor de entrada possui no máximo bits;2N/2k
  • Cada elemento da convolução é a soma de no máximo desses produtos e, portanto, não pode exceder bits.2k2N/2k+k

Aqui é o comprimento de entrada atual e . A aritmética é feita no módulo , onde é algum múltiplo de que é maior que ; Observe queNk=Θ(N)2n+1n2k2N/2k+kn=Θ(N).


Não entendo por que cada elemento da convolução não pode exceder 2N2k+kbits. Eu entendo que se nós apenas os juntássemos sem nenhuma mudança, eles não seriam maiores do que isso, mas não estamos fazendo aritmética?F2N+1e escalar coisas por enormes potências de 2? oNo elemento da convolução é i=0Nxi2iN, aumentando o poder N para cada elemento, para que ele não se beneficie da sobreposição de seus bits e exija Nbits?
Craig Gidney

As adições estão sendo feitas em F2N+1? O artigo diz que "é necessário usar um N menor para multiplicações recursivas", mas não está claro se essa redução é feita para as multiplicações de transformação e de ponto ou apenas para as multiplicações de ponto.
Craig Gidney

O artigo da Wikipedia mistura N e n; espero que isso esteja corrigido na minha resposta revisada. Aritmética é feita módulo2n+1, Onde n=Θ(N). O vetor resultante pode então ser combinado para dar um módulo de resultado2N+1.
Yuval Filmus

Reiterando, o truque é realizar um módulo aritmético de um módulo menor, cujo tamanho é compatível com o tamanho das peças. oNinteiros de um bit são divididos em aproximadamente N pedaços de comprimento Nbits.
Yuval Filmus

Ah, isso explica tudo então. Isso significaria olg(n) A versão também é bastante rápida, uma vez que possui lg(n)operações dimensionadas. Se você pudesse explicitamente dizer isso em sua resposta, seria ótimo.
Craig Gidney

3

Há uma excelente explicação sobre exatamente o que está acontecendo, incluindo como o tamanho do campo diminui à medida que você avança, na documentação do GMP: 15.1.6 Multiplicação FFT .

Uma visão geral mais aprofundada teoricamente começa na página 55 da Aritmética de computadores modernos (pdf) (bem ... o navegador diz a página 71, mas a própria página diz 55). Explica a correção do algoritmo e divide a análise de complexidade.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.