Bagaimana cincin bagian dalam dipilih dalam algoritma Schönhage-Strassen?


9

Saya telah mencoba untuk mengimplementasikan algoritma multiplikasi integer Schönhage-Strassen, tetapi menabrak batu sandungan pada langkah rekursif.

Saya memiliki nilai dengan bit dan saya ingin menghitung . Awalnya saya pikir idenya adalah untuk memilih sehingga , pisahkan menjadi masing-masing dengan bit, terapkan konvolusi SSA saat bekerja modulo , sebuah cincin dengan bit kapasitas per nilai, lalu kumpulkan kembali. Namun, output konvolusi memiliki sedikit lebih dari bit (yaitun x 2xnk 4 k2 n x 2 k 2 k - 1 2 2 k + 1 2 k 2 n > 2 kx2(mod2n+1)k4k2nx2k2k122k+12k2n>2kbit per nilai output, yang lebih dari kapasitas cincin, karena setiap nilai output merupakan jumlah dari beberapa produk) jadi ini tidak berfungsi. Saya harus menambahkan faktor tambahan 2 padding.

Faktor tambahan 2 di padding merusak kompleksitas. Itu membuat langkah rekursif saya terlalu mahal. Alih-alih algoritma , saya berakhir dengan algoritma.F(n)=nlgn+nF(2n)=Θ(nlgnlglgn)F(n)=nlgn+nF(4n)=Θ(nlg2n)

Saya membaca beberapa referensi yang ditautkan dari wikipedia, tetapi semuanya sepertinya mengabaikan detail bagaimana masalah ini diselesaikan. Sebagai contoh, saya dapat menghindari overhead padding tambahan dengan bekerja modulo 2hal2k+1 untuk hal yang bukan kekuatan 2 ... tapi kemudian hal-hal baru saja pecah, ketika saya hanya memiliki non-power- dari-2 faktor yang tersisa dan tidak dapat menerapkan Cooley-Tukey tanpa menggandakan jumlah bagian. Juga, hal mungkin tidak memiliki modul invers multiplikatif 2hal+1 . Jadi masih ada faktor paksa dari 2 yang diperkenalkan.

Bagaimana cara memilih cincin untuk digunakan selama langkah rekursif, tanpa menghilangkan kerumitan asimptotik?

Atau, dalam bentuk kode semu:

multiply_in_ring(a, b, n):
  ...
  // vvv                          vvv //
  // vvv HOW DOES THIS PART WORK? vvv //
  // vvv                          vvv //
  let inner_ring = convolution_ring_for_values_of_size(n);
  // ^^^                          ^^^ //
  // ^^^ HOW DOES THIS PART WORK? ^^^ //
  // ^^^                          ^^^ //

  let input_bits_per_piece = ceil(n / inner_ring.order);
  let piecesA = a.splitIntoNPiecesOfSize(inner_ring.order, input_bits_per_piece);
  let piecesB = b.splitIntoNPiecesOfSize(inner_ring.order, input_bits_per_piece);

  let piecesC = inner_ring.negacyclic_convolution(piecesA, piecesB);
  ...

Tolong jangan posting pertanyaan yang sama di beberapa situs . Setiap komunitas harus memiliki kesempatan jujur ​​untuk menjawab tanpa ada waktu yang terbuang. Saya sarankan Anda menghapus salah satu dari dua salinan.
DW

@DW Selesai. Saya mengirim silang setelah cs tidak memberikan jawaban selama seminggu, menganggap itu terlalu sulit untuk situs itu. Akan menghubungkan kembali jawaban yang jelas.
Craig Gidney

Saya mengerti. Jika muncul di masa mendatang, Anda selalu dapat menandai pos Anda untuk perhatian moderator dan meminta dimigrasi, dan kami dapat memindahkannya untuk Anda ke CSTheory. Terima kasih atas pengertian Anda!
DW

3
Ada versi algoritma yang berfungsi nomor modulo dari bentuk : A. Schönhage. Algoritma cepat asimtotik untuk perkalian numerik dan pembagian polinomial dengan koefisien kompleks. Dalam EUROCAM '82: Konferensi Aljabar Komputer Eropa, Lect. Notes Comp. Sci. 144, 3-15. iai.uni-bonn.de/~schoe/publi39.dvi2ν2n
Markus Bläser

IIRC Anda memiliki sebagian jawaban sendiri pada pertanyaan CS yang sekarang dihapus. Sayang sekali kehilangan itu. Bisakah Anda memasukkannya di sini (dalam pertanyaan, sehingga pertanyaan tidak ditandai sebagai sudah dijawab)?
Peter Taylor

Jawaban:


4

Jawaban ini diambil dari makalah "Algoritma cepat asimtotik untuk muitiplikasi numerik dan pembagian polinomial dengan koefisien kompleks" yang dihubungkan Markus dalam komentar.


Anda ingin persegi sebuah nomor-bit, modulo 2 n + 1 . Inilah yang Anda lakukan:n2n+1

  • Temukan dan s yang memuaskan n = ( p - 1 ) 2 s dan s p 2 s .halsn=(hal-1)2sshal2s

  • Pilih jumlah potongan untuk membagi n bit menjadi, dan parameter yang sesuai untuk ukuran potongan:2mn

    m=s/2+1s2=s/2+1hal2=hal/2+1

    Perhatikan bahwa dan p 2 terus memenuhi s 2p 22 s 2 yang tidak berubah. Perhatikan juga bahwa 2 m 2 s 2 p 22 n + m + 1 puas, sehingga input sesuai dengan ruang untuk membawa.s2p2s2p22s22m2s2hal22n+m+1

  • Lakukan konvolusi negasiklik berbasis FFT pada potongan, dan sisanya, seperti biasa.

Jadi itulah gagasan menyeluruh: faktor padding logaritmik . Sekarang untuk analisis kompleksitas. FFT akan mengambil n m pekerjaan yang harus dilakukan, dan kami recursing pada 2 m lembar ukuran ( p 2 - 1 ) 2 s 2 , jadi sekarang kita dapat melakukan matematika sangat kasar dengan kekambuhan hubungan wrt s :halnm2m(hal2-1)2s2s

F(s)()(hal-1)2sm+2mF(s/2+1)()2s2s(s/2+1)+2s/2+1F(s/2+1)()s22s+22s/2F(s/2+1)()s22s+4(s/2)22s+16(s/4)22s+...()2ss2lg(s)()nlgn(lgnlgn)2lglgnlgn()nlgn(lg2n)lglgn()n(lgn)lglgn

Yang sepertinya benar, meskipun saya cukup banyak berbuat curang dalam langkah-langkah itu.

s2ssscatatannhals

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.