Penggandaan bilangan bulat ketika satu bilangan bulat diperbaiki

35

Biarkan menjadi bilangan bulat positif tetap ukuran bit.An

Satu diizinkan untuk pra-proses integer ini sebagaimana mestinya.

Diberikan bilangan bulat positif dari ukuran bit, apa kompleksitas dari perkalian ?BmAB

Catatan kita sudah memiliki algoritma . Pertanyaannya di sini adalah apakah kita bisa mengambil \ epsilon = 0 oleh sesuatu yang lebih pintar?(max(n,m))1+ϵϵ=0

T ....
sumber
6
Diberikan A , cukup buat tabel pencarian dengan entri 2n . (Jelas ini bukan yang Anda inginkan, tapi saya pikir Anda harus membuat persyaratan Anda lebih spesifik ...)
Jukka Suomela
9
Saya pikir pertanyaan itu masuk akal dalam model sirkuit Boolean standar.
Noam
4
Bisakah Anda meringkas batas atas dan bawah yang jelas, dan hasil terbaik yang Anda ketahui? Ini menunjukkan bahwa Anda peduli dengan masalah dan Anda telah memikirkannya, dan itu memberi orang lain lebih banyak insentif untuk memikirkan masalah Anda.
Robin Kothari
4
Saya pikir si penanya secara implisit berarti bahwa bagian yang telah diproses harus mengambil hanya ruang nO(1) . (Matriks-vektor mult memiliki properti itu.)
Ryan Williams
Saya ingin tahu apa yang Anda inginkan; Saya merasa seperti saya bisa melewati kasus yang tak ada habisnya dalam hal ini. Ini adalah jawaban pertama saya, jadi saya sangat senang mencoba memberi Anda sebanyak mungkin informasi. Jika Anda mau, Anda dapat mengirim email kepada saya di [email protected], dan saya akan senang bekerja sama dengan Anda lebih banyak lagi.
Matt Groff

Jawaban:

20

Meskipun tidak selalu menjadi algoritma yang paling efisien, pertanyaan ini memiliki hubungan yang sangat dekat dengan rantai penjumlahan; algoritma apa pun untuk komputasi dengan cepat oleh rantai penjumlahan diterjemahkan ke dalam suatu algoritma untuk komputasi dengan penambahan berulang (setiap penambahan, tentu saja, menjadi operasi ). Sebaliknya, algoritma cepat untuk menghitung untuk setiap mengarah ke algoritma cepat untuk komputasi , tetapi tentu saja algoritma ini tidak harus harus memiliki bentuk rantai tambahan; tetap saja, itu sepertinya tempat yang bagus untuk memulai. Lihat http://en.wikipedia.org/wiki/Addition_chain atau lihat vol. 2 dariAf(B)=ABO(n)ABBASeni Pemrograman Komputer untuk lebih jelasnya.

Steven Stadnicki
sumber
17

Untuk memperluas gagasan Steven Stadnicki, kita dapat dengan cepat membangun algoritma naif yang lebih baik daripada perkalian matriks menggunakan Discrete Fourier Transform.

Kami menghitung jumlah orang-orang di . Jika kurang dari setengah bit adalah bit, kami membuat daftar posisi yang ditautkan. Untuk mengalikan, kita cukup menggeser kiri oleh setiap posisi dalam daftar (mengalikan dengan bit yang diwakili) dan menambahkan hasilnya.AB

Jika lebih dari setengah bitnya adalah bit, kami melakukan hal yang sama seperti di atas, tetapi kami menggunakan angka nol untuk mengisi daftar posisi. Idenya adalah bahwa kita akan mengurangi jumlah ini dari jumlah yang akan diperoleh dengan mengalikannya dengan semua yang ada. Untuk mendapatkan jumlah semua yang ada, kita menggeser dengan jumlah bit dalam dan mengurangi dari ini. Kemudian kita dapat mengurangi jumlah kita yang diperoleh dari daftar tertaut.BAB

Kita dapat menyebutnya algoritma daftar-tertaut yang naif. Waktu berjalannya adalah dalam kasus terburuk, tetapi dalam kasus rata-rata, yang lebih cepat daripada DFT untuk kecil.O(n2)O(|B||A|2π)|A|

Untuk menggunakan gagasan daftar secara optimal, kami menggunakan divide-and-conquer. Kami membagi dua, dan menemukan ukuran daftar terkait menggunakan algoritma naif. Jika mereka lebih besar dari 5, kami memanggil algoritma naif lagi pada setengah lebih besar dari 5 sampai kami berhasil memotong semua bagian menjadi kurang dari lima. (Ini karena kita bisa mengurangi ini menjadi 4 pengurangan)A

Bahkan lebih baik lagi, kami meningkatkan algoritma divide-and-conquer kami. Kami beralih melalui semua kemungkinan kombinasi percabangan, dengan rakus memilih yang terbaik. Preprocessing ini membutuhkan waktu yang hampir sama dengan multiplikasi yang sebenarnya.

Jika kami diizinkan kebebasan tanpa batas dengan pra-pemrosesan, kami menyelesaikan algoritma divide-and-menaklukkan yang dioptimalkan untuk semua cabang secara optimal. Ini membutuhkan waktu dalam kasus terburuk, tetapi harus ~ optimal dengan metode rantai tambahan.O(2|A|)

Saya sedang mengerjakan penghitungan nilai yang lebih tepat untuk algoritme di atas.

Matt Groff
sumber
Hai Matt: Apa itudan? |A||B|
T ....
A A n | A | n | B | n|A|adalah ukuran , pada dasarnya jumlah elemen dalam . Ini setara dengan Anda , yaitu . Hal yang sama untuk. Namun, rumus ini masih memegang ketika berbeda untuk dan . AAn|A|n|B|nAB
Matt Groff
17

Makalah yang disebut Penggandaan oleh konstanta adalah sublinear ( PDF ) memberikan algoritme untuk operasi shift / penambahan , di mana adalah ukuran konstanta .O(nlogn)n

Pada dasarnya, ini bekerja dengan mencari bit dalam konstanta, menggeser dan menambahkan angka yang akan dikalikan hanya untuk bit dalam konstanta (seperti perkalian panjang untuk biner, di mana bit pada angka bawah untuk dikalikan berarti bagian atas tidak bergeser dan ditambahkan, sedangkan bit berarti bagian atas digeser dan ditambahkan). Namun ini masih , karena mungkin ada bit dalam konstanta.1101O(n)O(n) 1

Makalah ini kemudian berbicara tentang mengubah representasi angka konstanta ke dalam sistem bilangan basa ganda, di mana tampaknya, bit non- lebih jarang, jika konversi dilakukan dengan benar (ini adalah sistem bilangan yang sangat redundan). Mereka menghitung seberapa jarang itu; jumlah bit non-nol dibatasi kurang dari , sehingga ada jumlah tambahan sublinear yang diperlukan. Namun itu masih operasi yang sebenarnya, karena biaya dari setiap penambahan (di mana adalah ukuran dari konstanta, dan adalah ukuran angka lainnya).0O(n)O(nmlogn)O(m)nm

Jadi untuk menjawab pertanyaan Anda, ya ada hasil yang mirip dengan perkalian matriks-vektor, di mana Anda mendapatkan speedup jika konstan; tapi tentu saja speedup ini hanya over-multiplikasi lama yang naif, dan ada algoritma multiplikasi yang jauh lebih baik daripada yang bisa Anda dapatkan dengan algoritma ini.lognO(n2logn)

Realz Slaw
sumber
@ JAS itu spesialisasi saya: D.
Realz Slaw
3
Ini muncul dalam ARITH 2007 sebagai dx.doi.org/10.1109/ARITH.2007.24 (untuk kelengkapan).
András Salamon
10

Seperti yang disarankan oleh Matt Groff, Anda mungkin tertarik untuk melihat komunitas praktik untuk mendapatkan inspirasi (atau jika dalam situasi Anda berada dalam lebar bit dari CPU saat ini). Memang, masalah perkalian bilangan bulat oleh sebuah konstanta telah dipertimbangkan oleh banyak penulis kompiler dan perancang sirkuit, meskipun mereka biasanya tertarik pada "multipler-less multipler" (multiply menggunakan shift, add, dan kurangi). Salah satu referensi awal yang saya ketahui adalah (saya belajar ini dari Hacker's Delight bagian 8.4.):n

Bernstein, R. (1986), Perkalian dengan konstanta integer. Perangkat Lunak: Praktik dan Pengalaman, 16: 641-652. doi: 10.1002 / spe.4380160704

Lebih banyak karya modern oleh Vincent Lefèvre dapat ditemukan di sini (pastikan untuk melihat karya lanjutannya), dan ia juga mencatat proyek CMU pada sintesis rangkaian efisien (lihat referensi di sana). Proyek terakhir ini bahkan mempertimbangkan perkalian simultan oleh seperangkat konstanta.

PS Saya mendorong Anda untuk mempertimbangkan mengubah nama pengguna Anda menjadi sesuatu yang dikenali.

Maverick Woo
sumber
9

Saya tidak yakin apakah ini secara langsung relevan dengan pertanyaan, tetapi hasil dasar berikut mungkin menarik. Diberi bilangan alami tetap , operasi dapat direalisasikan oleh automaton sekuensial, asalkan ditulis dalam notasi biner terbalik (yaitu, Least Significant Bit First). Jumlah status otomat adalah mana adalah kekuatan terbesar dari pembagi . Sebagai contoh, operasi diwujudkan oleh robot berikut ini. n k n n k / 2 r 2 r 2 k n 6 nknknnk/2r2r2kn6nmasukkan deskripsi gambar di sini

Misalnya, dan . Jadi, dalam biner terbalik, ditulis sebagai dan (pilihan buruk, saya tahu ...) sebagai . Memproses entri pada otomat ini memberikan path 185=1+8+16+32+1286×185=1110=2+4+16+64+10241851001110111100110101000110011101 01101010001

0011101000011110211200110201
yang memberikan hasil yang benar . Jenis automaton sekuensial yang saya gunakan di sini disebut berikutnya oleh Schützenberger: seperti yang Anda lihat ada awalan awal (berwarna hijau) dan fungsi keluaran terminal01101010001(juga berwarna hijau). Untuk detail lebih lanjut bagaimana mesin sekuensial ini dapat dihitung secara sistematis, lihat tautan ini .
J.-E. Pin
sumber
Bisakah Anda menguraikan komentar Anda?
J.-E.
> 2k adalah prime . >2
T ....
Konstruksi otomat berurutan yang menyadari operasi dapat dilakukan untuk semua . Namun, menghitung otomat ini mungkin lebih mudah untuk prime. k knknkk
J.-E.
k2r eksponensial.
T ....
nk adalah konstanta tetap, tidak terkait dengan . n
J.-E.