Suponha que recebamos inteiros distintos a 1 , a 2 , ... , a n , de modo que 0 ≤ a i ≤ k n para alguma constante k > 0 e para todos i .
Estamos interessados em encontrar as contagens de todas as possíveis somas em pares . ( i = j é permitido).
Um algoritmo é construir o polinômio de grau ≤ k n , e calcular seu quadrado usando o método de transformação de Fourier e ler as potências com seus coeficientes no polinômio resultante. Este é um algoritmo de tempo O ( n log n ) .
Eu tenho duas perguntas:
Existe um algoritmo que não usa FFT?
Algoritmos melhores são conhecidos (ou seja, )? (FFT permitido).
algorithms
time-complexity
fourier-transform
Aryabhata
fonte
fonte
Respostas:
Parece que esse problema é equivalente ao número inteiro / quadrado polinomial:
1. Sabe-se que a multiplicação polinomial é equivalente à multiplicação inteira .
2. Obviamente, você já reduziu o problema ao quadrado polinomial / inteiro; portanto, esse problema é no máximo tão difícil quanto quadrático.
Agora vou reduzir o quadrado inteiro para esse problema:
Suponha que você tenha um algoritmo:
Esse algoritmo é essencialmente o algoritmo que você solicita na sua pergunta. Assim, se eu tivesse um algoritmo mágico que possa fazer isso, eu posso criar uma função, que quadrará o número inteiro y ( oh sim, eu amo mathjax: P ):S Q U A R E ( y) y
Python ( teste com o codepad ):
3. Portanto, a quadratura é no máximo tão difícil quanto esse problema.
4. Portanto, o quadrado inteiro é equivalente a esse problema. (cada um deles é tão duro quanto o outro, devido a ( 2 , 3 , 1 ))
5. Agora, seu problema não é exatamente a multiplicação, é o quadrado. Então, a quadratura é mais fácil? Bem, é um problema em aberto (não por enquanto) : sabe-se que o quadrado tem um algoritmo mais rápido que a multiplicação. Se você pudesse encontrar um algoritmo melhor para o seu problema do que usar multiplicação; então isso provavelmente seria um avanço.
fonte