Misalkan kita diberi bilangan bulat yang berbeda , sehingga untuk beberapa konstanta , dan untuk semua .a 1 , a 2 , … , a n 0 ≤ a i ≤ kk > 0
Kami tertarik untuk menemukan jumlah semua kemungkinan jumlah berpasangan . ( diizinkan).
Salah satu algoritma adalah untuk membangun polinomial derajat , dan menghitung kuadratnya menggunakan metode transformasi Fourier dan membaca kekuatan dengan mereka koefisien dalam polinomial yang dihasilkan. Ini adalah algoritma waktu . ≤ k n
Saya punya dua pertanyaan:
Apakah ada algoritma yang tidak menggunakan FFT?
Apakah algoritma yang lebih baik diketahui (yaitu )? (FFT diizinkan).
algorithms
time-complexity
fourier-transform
Aryabhata
sumber
sumber
Jawaban:
Tampaknya masalah ini setara dengan bilangan bulat / polinomial:
1. Diketahui bahwa perkalian polinomial sama dengan perkalian bilangan bulat .
2. Jelas, Anda sudah mengurangi masalah menjadi polinomial / bilangan bulat kuadrat; oleh karena itu masalah ini paling sulit seperti kuadrat.
Sekarang saya akan mengurangi bilangan bulat kuadrat untuk masalah ini:
Misalkan Anda memiliki algoritma:
Algoritma ini pada dasarnya adalah algoritma yang Anda minta dalam pertanyaan Anda. Jadi, jika saya memiliki algoritma ajaib yang dapat melakukan ini, saya dapat membuat suatu fungsi, yang akan mengkuadratkan bilangan bulat y ( oh ya, saya memang suka mathjax: P ):S Q U A R E ( y) y
Python ( uji dengan codepad ):
3. Jadi, mengkuadratkan paling keras seperti masalah ini.
4. Oleh karena itu, bilangan bulat integer setara dengan masalah ini. (mereka masing-masing paling keras seperti satu sama lain, karena ( 2 , 3 , 1 ))
Sekarang tidak diketahui apakah bilangan bulat / polinomial mengakui batas lebih baik daripada ; sebenarnya algoritma multiplikasi terbaik saat ini semuanya menggunakan FFT dan memiliki waktu-berjalan seperti O ( n log n log log n ) ( Algoritma Schönhage-Strassen ) dan O ( n log nO ( n logn) O(nlognloglogn) (Algoritma Fürer's). Arnold Schönhage dan Volker Strassen menduga batas bawahΩ ( n log n ) , dan sejauh ini tampaknya masih berlaku.O(nlogn2O(log∗n)) Ω(nlogn)
Ini tidak berarti penggunaan FFT Anda lebih cepat; untuk FFT adalah jumlah operasi (saya pikir), bukan kompleksitas bit; karenanya ia mengabaikan beberapa faktor perkalian yang lebih kecil; ketika digunakan secara rekursif, itu akan menjadi lebih dekat dengan algoritma multiplikasi FFT yang tercantum di atas (lihat Di mana kesalahan dalam algoritma multiplikasi yang tampaknya-O (n lg n) ini? ).O(nlogn)
5. Sekarang, masalah Anda bukan multiplikasi, melainkan kuadrat. Jadi, apakah mengkuadratkan lebih mudah? Yah, ini adalah masalah terbuka (tidak untuk saat ini) : kuadrat tidak diketahui memiliki algoritma yang lebih cepat daripada perkalian. Jika Anda bisa menemukan algoritma yang lebih baik untuk masalah Anda daripada menggunakan perkalian; maka ini kemungkinan akan menjadi terobosan.
sumber