Perkalian dalam


10

Saya mencari di sini , dan saya melihat runtime terbaik untuk perkalian dua angka bit adalah , tetapi saya dapat dengan mudah melihat algoritma yang berjalan di .O ( n log n 2 O ( log n ) O ( n log n )nO(nlogn2O(logn)O(nlogn)

Bagaimanapun, kita tahu bagaimana mengalikan dua polinomial dari derajat di runtime . Tetapi mengalikan polinomial sama dengan mengalikan dua angka bit. Jadi kami memiliki algoritma untuk mengalikan dua angka bit di . Sekarang satu-satunya masalah yang mungkin terjadi adalah carry, tetapi dalam setiap fase kita dapat memperbaikinya dalam waktu , cukup dengan menggeser bit yang paling kanan dan tetangga kiri, sampai akhir. Artinya, runtime kami akan tetap .O ( n log n ) n n O ( n log n ) O ( n ) O ( n log n )nO(nlogn)nnO(nlogn)O(n)O(nlogn)

Jadi, apakah saya membuat penemuan baru (dan cukup jelas)? Atau apakah halaman wikipedia sudah ketinggalan zaman? Atau mungkin saya punya kesalahan?


Apa cara "kita tahu" "untuk melipatgandakan dua polinomial dari derajat di runtime "? O ( n log n )nO(nlogn)

Jawaban:


8

Seperti yang ditunjukkan oleh @DavidRicherby, kebingungan muncul karena berbagai ukuran kompleksitas semakin tercampur. Tapi saya akan sedikit menguraikan.

Biasanya, ketika mempelajari algoritma untuk perkalian polinomial atas cincin arbitrer, orang tertarik pada jumlah operasi aritmatika dalam cincin yang digunakan algoritma. Secara khusus, mengingat beberapa (komutatif, kesatuan) cincin , dan dua polinomial dengan derajat kurang dari , algoritma Schönhage-Strassen membutuhkan perkalian dan penambahan dalam untuk menghitung oleh, kira-kira, berdampingan akar primitif ke- ke untuk mendapatkan cincin lebih besar dari dan kemudian, menggunakan Fast Fourier Transform overf , g R [ X ] n O ( n log n log log n ) R f g R [ X ] n R D R D DRf,gR[X]nO(nlognloglogn)RfgR[X]nRDRD, Komputasi produk di .D

Jika cincin Anda berisi akar -th kesatuan, maka ini bisa melesat hingga operasi di dengan menggunakan Fast Fourier Transform langsung di atas . Lebih khusus, lebih dari , Anda dapat melakukan ini menggunakan operasi dering (mengabaikan fakta bahwa ini akan memerlukan aritmatika yang tepat atas angka-angka kompleks).O ( n log n ) R R ZC O ( n log n )nO(nlogn)RRZCO(nlogn)

Ukuran lain yang dapat diperhitungkan adalah kompleksitas bit operasi. Dan inilah yang kami tertarik ketika mengalikan dua bilangan bulat dari panjang bit . Di sini, operasi primitif mengalikan dan menambahkan dua digit (dengan carry). Jadi, ketika mengalikan dua polinomial lebih dari , Anda sebenarnya perlu memperhitungkan fakta bahwa angka yang muncul selama perhitungan tidak dapat dikalikan menggunakan jumlah konstan operasi primitif. Ini dan fakta bahwa tidak memiliki th akar primitif persatuan untuk mencegah Anda dari Appling algoritma. Anda mengatasinya dengan mempertimbangkanZ Z n n > 2 O ( n log n ) f , g Z /2 n + 1 n 2 n O ( n log n log log n )nZZnn>2O(nlogn)f,gdengan koefisien dari ring , karena koefisien polinomial produk tidak akan melebihi batas ini. Di sana (ketika adalah kekuatan dua), Anda memiliki (kelas kongruensi) sebagai akar ke- persatuan, dan dengan memanggil algoritme secara acak untuk penggandaan koefisien, Anda dapat mencapai total ) operasi primitif (yaitu, bit). Ini kemudian dibawa ke perkalian integer.Z/2n+1n2nO(nlognloglogn)

Untuk contoh yang menyoroti pentingnya perbedaan antara operasi cincin dan operasi primitif, pertimbangkan dua metode untuk mengevaluasi polinomial: metode Horner dan metode Estrin. Metode Horner mengevaluasi polinomial di beberapa dengan mengeksploitasi identitas sementara metode Estrin membagi menjadi dua bagian dan yaitu, berisi ketentuan derajat dan persyaratan derajatf=i=0nfiXixZ

f(x)=((fnx+fn1)x++)+f0
f
H=i=1n/2fn/2+iXi
L=i=0n/2fiXi
H>n/2Ln/2(anggap adalah kekuatan dua, untuk kesederhanaan).n

Kemudian, kita dapat menghitung menggunakan dan menerapkan algoritma secara rekursif.f(x)

f(x)=H(x)xn/2+L(x)

Yang pertama, menggunakan penambahan dan perkalian, terbukti optimal dengan jumlah penambahan dan perkalian (yaitu, operasi cincin), yang terakhir membutuhkan lebih banyak (setidaknya ).nn+logn

Tetapi, pada tingkat operasi bit, seseorang dapat (dengan mudah) menunjukkan bahwa dalam kasus terburuk, metode Horner melakukan penggandaan jumlah ukuran setidaknya , yang mengarah ke banyak bit operasi (ini berlaku bahkan jika kita mengasumsikan bahwa dua angka bit dapat dikalikan dalam waktu ), sedangkan skema Estrin menggunakan operasi untuk beberapa , yang sejauh ini, secara asimptotik lebih cepat.n / 2 Ω ( n 2 ) n O ( n ) O ( n log c n ) = ˜ O ( n ) c > 0n/2n/2Ω(n2)nO(n)O(nlogcn)=O~(n)c>0


9

Mengatakan bahwa Anda dapat mengalikan dua polinomial derajat dalam waktu menyiratkan bahwa, khususnya, Anda dapat melipatgandakan polinomial derajat-nol, yaitu konstanta, dalam waktu konstan. Jelas, oleh karena itu, klaim "mengalikan angka-angka membutuhkan waktu " dan "mengalikan derajat- polinomial membutuhkan waktu " relatif untuk model komputasi yang berbeda sehingga tidak dapat dibandingkan secara langsung.O ( n log n ) n O ( 2 log n n log n ) n O ( n log n )nO(nlogn)nO(2lognnlogn)nO(nlogn)


5
Saya tidak berpikir ini masalahnya. Jika kita menganggap angka sebagai polinomial yang "x" -nya adalah basis, misalnya 2, maka biasanya kita dapat mengalikan polinomial derajat-nol (angka lebih kecil dari basis) dalam waktu konstan. Saya kira masalahnya adalah bahwa algoritma O (n * log n) menggunakan FFT dan angka asimptotik yang lebih besar dapat muncul di dalam algoritma FFT.
jkff
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.