Bisakah kita menghitung dari bit dalam waktu ?


11

Saya mencari algoritma yang efisien untuk masalah ini:

Input : Bilangan bulat positif (disimpan sebagai bit) untuk beberapa bilangan bulat .3nn0

Output : Jumlahnya .n

Pertanyaan : Bisakah kita menghitung dari bit dalam waktu ?n3nO(n)


Ini adalah pertanyaan teoretis yang dimotivasi oleh jawaban saya terhadap matematika. Pertanyaan SE Bagaimana cara menemukan formula untuk penambangan ini? . Dalam pertanyaan ini, penulis ingin menemukan bijection dari dan bilangan asli . Saya mengusulkan sebagai solusi. Jawaban lain di sana menegaskan "tidak ada rumus sederhana", yang membuat saya bertanya-tanya bagaimana (secara komputasi) sederhana solusi yang saya usulkan.

{2n3m:n0 and m0}
N={1,2,}
2m3n2m(2n+1)

Dengan solusi yang saya usulkan, jika kita tahu dan , kita dapat dengan mudah menghitung (tulis digit biner dari diikuti oleh diikuti oleh nol). Ini membutuhkan waktu .nm2m(2n+1)n1mO(n+m)

Menemukan dari bit sama dengan menemukan bit paling signifikan (yang dapat dihitung dengan menghitung pergeseran bit kanan, meninggalkan dalam memori). Ini membutuhkan waktu .2 m 3 n 3 n O ( m )m2m3n3nO(m)

Namun, kita juga perlu menemukan , yang mungkin lebih sulit. Adalah mungkin untuk menemukan dengan berulang kali membaginya dengan , tetapi ini tampaknya sia-sia. Ini membutuhkan operasi divisi , yang masing-masing akan memakan waktu , jadi ini adalah total waktu . [Sebenarnya, setelah setiap iterasi, jumlah digit akan berkurang secara linear, tetapi ini masih menghasilkan waktu .]n 3 n O ( n ) O ( n 2 ) O ( n 2 )nn3nO(n)O(n2)O(n2)

Sepertinya kita harus bisa mengeksploitasi mengetahui input adalah kekuatan .3


2
Apa model perhitungan Anda yang tepat? Operasi apa yang diizinkan dalam waktu? (Jika kita bisa melakukan aritmatika dengan angka-angka seperti itu akan sangat berguna ...)log 2 3O(1)log23
Yuval Filmus

3
Bisakah para downvoter menjelaskan downvote? Ini sepertinya bukan pertanyaan sepele sama sekali. Apa waktu berjalan terbaik di bawah beberapa model perhitungan yang masuk akal?
Yuval Filmus

1
Saya membayangkan kaset dengan sel 0, 1 dan kosong (dengan jumlah kaset tak terbatas). Saya ingin operasi pengalihan bit tunggal dan kiri / kanan dijalankan dalam waktu . (Jika kita memiliki penanda bit ke-0 pada pita yang tidak terbatas, maka menggeser ke kiri / kanan dicapai dengan menggeser penanda). Tidak seperti mesin Turing, saya tidak ingin mengambil waktu untuk memindahkan pointer. Jadi "beralih bit 0-th" membutuhkan waktu yang sama dengan "beralih bit 124126-th". O(1)
Rebecca J. Stones

Entah bagaimana mungkin terkait dengan pertanyaan
J.-E.

Apakah batas bawah jelas? Ω(n)
Boris Bukh

Jawaban:


9

Pendekatan yang jelas adalah:

(1) Hitung aproksimasi ke . Anda dapat memperkirakannya dalam kesalahan aditif 1 dengan menghitung jumlah bit dalam representasi biner yang diberikan, dan ke dalam kesalahan aditif dengan tambahan melihat bagian atas bit dari input. Seharusnya cukup untuk memilih nilai konstan , sehingga (setelah digabungkan dengan kesalahan pada langkah (2)) hasil akhir berakhir dengan kesalahan aditif dari yang benar.ϵ O ( log 1log2(3n)ϵε1/2O(log1ϵ)ϵ1/2

(2) Hitung aproksimasi ke . Saya tidak terbiasa dengan algoritma untuk ini tetapi saya berharap mereka membutuhkan waktu polinomial dalam jumlah bit yang Anda butuhkan, dan Anda hanya perlu bit presisi.O ( log n )log2(3)O(logn)

(3) Bagi jawaban (1) dengan jawaban (2), dan bulatkan ke bilangan bulat terdekat.

Jadi langkah pertama membutuhkan waktu linier (dalam sebagian besar model perhitungan meskipun mungkin tidak untuk beberapa yang kurang bertenaga seperti mesin Turing satu-kepala ) dan langkah-langkah yang tersisa harus polylogarithmic.


3
Saya percaya bahwa menghitung ke bit t bit membutuhkan waktu O ( M ( t ) log t ) , di mana M ( t ) O ( t log t 2 log t ) adalah waktu untuk mengalikan bit angka. Lihat Brent - Zimmermann, loria.fr/ ~ zimmerma/ mcalog2(3)tO(M(t)logt)M(t)O(tlogt2logt)t
Ryan O'Donnell

Terima kasih untuk referensi, dan permintaan maaf karena terlalu malas untuk mencarinya sendiri.
David Eppstein

9

Untuk bilangan bulat apa pun , menulis 3 n dalam biner membutuhkan tepat L = log 2 ( 3 n ) + 1 bit. Beberapa aljabar dasar menyiratkan bahwa L - 2n>03nL=log2(3n)+1 Untuk setiap panjang bitL1, ada paling banyak satu bilangan bulat dalam kisaran ini. Dengan demikian, diberi kekuatan integral3yaitupanjangLbit, eksponen harus bilangan bulat n=L-1

L2log23nL1log23.
L13L
n=L1log23.

4

k3n3nmod10k 3 5 k 3 φ ( 5 k ) = 5 k - 1 × 43nmod5k35k3φ(5k)=5k1×4

Oleh karena itu, dengan menggunakan log diskrit dan pengangkatan Hensel, saya pikir Anda harus dapat menghitung dari angka rendah sangat efisien. Dengan kata lain, Anda mulai dengan menghitung dari digit rendah , dengan mengambil log diskrit ke basis , modulo ; ini mengungkapkan , dan dapat dilakukan dalam waktu. Kemudian, Anda menemukan log diskrit ke basis , modulo ; ini mengungkapkan , dan dapat dilakukan dik 3 n n mod 4 3 n 3 n mod 5 3 5 n mod 4 O ( 1 ) 3 n mod 25nmodφ(5k)k3nnmod43n3nmod535nmod4O(1)3nmod2525 n mod 20 O ( 1 ) n mod 4 5 n mod φ ( 5 k - 1 ) 3 n mod 5 k 5 n mod φ ( 5 k )e25nmod20O(1) waktu (memanfaatkan pengetahuan tentang , hanya ada kemungkinan yang harus Anda coba). Pengulangan. Pada setiap langkah, Anda menggunakan pengetahuan untuk membantu Anda menghitung log diskrit , memanfaatkan fakta bahwa hanya ada nilai yang mungkin untuk .nmod45nmodφ(5k1)3nmod5k5nmodφ(5k)

Sekarang biarkan menjadi cukup besar, dan ini mengungkapkan .nkn

Anda harus mengetahui apakah waktu yang berjalan adalah , tetapi sepertinya bagi saya sepertinya. Saya kira cukup untuk membiarkan , dan saya curiga Anda dapat melakukan setiap iterasi dalam waktu , untuk total waktu .k = O ( n ) O ( 1 ) O ( n )O(n)k=O(n)O(1)O(n)

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.