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,g∈R[X]nO(nlognloglogn)Rfg∈R[X]nRD⊃RD, 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 Z ⊂ C O ( n log n )nO(nlogn)RRZ⊂CO(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+1⟩n2nO(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=∑ni=0fiXix∈Z
f(x)=(…(fnx+fn−1)x+…+…)+f0
fH=∑i=1n/2fn/2+iXi
L=∑i=0n/2fiXi
H>n/2L≤n/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