Biarkan menjadi bilangan bulat positif tetap ukuran bit.
Satu diizinkan untuk pra-proses integer ini sebagaimana mestinya.
Diberikan bilangan bulat positif dari ukuran bit, apa kompleksitas dari perkalian ?
Catatan kita sudah memiliki algoritma . Pertanyaannya di sini adalah apakah kita bisa mengambil \ epsilon = 0 oleh sesuatu yang lebih pintar?
cc.complexity-theory
ds.algorithms
circuit-complexity
algebraic-complexity
arithmetic-circuits
T ....
sumber
sumber
Jawaban:
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 dariA f(B)=AB O(n) AB B A Seni Pemrograman Komputer untuk lebih jelasnya.
sumber
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.A B
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.B A B
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.
sumber
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.1 1 0 1 O(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).0 O(n) O(nmlogn) O(m) n m
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.logn O(n2logn)
sumber
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.
sumber
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 nk n→kn n k/2r 2r 2 k n→6n
Misalnya, dan . Jadi, dalam biner terbalik, ditulis sebagai dan (pilihan buruk, saya tahu ...) sebagai . Memproses entri pada otomat ini memberikan path185=1+8+16+32+128 6×185=1110=2+4+16+64+1024 185 10011101 1110 01101010001 10011101 01101010001
sumber