Menghitung jumlah bit dari kekuatan integer yang besar

10

Diberikan dua bilangan bulat dan n dalam representasi biner, apa kompleksitas komputasi bit-size x n ?xnxn

Salah satu cara untuk melakukannya adalah dengan menghitung dengan menghitung perkiraan log 2 ( x ) dengan presisi yang cukup. Tampaknya menghitung log 2 ( x ) dengan k bit precision dapat dilakukan dalam O ( M ( k ) log k ) di mana M (1+log2(xn)=1+nlog2(x)log2(x)log2(x)kO(M(k)logk) adalah waktu yang dibutuhkan untuk menghitung produk dari dua bilangan bulat panjang k . Ini menghasilkan algoritma (tidak khusus sederhana) kompleksitas sekitar O ( s log 2 s ) jika s terikat pada bitsize baik x dan n (jika saya tidak membuat kesalahan).M(k)kO(slog2s)sxn

Bisakah kita mengalahkan mana s adalah ukuran x dan n (dalam kasus di mana mereka memiliki ukuran yang sebanding)? Apakah ada algoritma sederhana untuk mendapatkan kompleksitas ini atau lebih baik?O(slog2(s))sxn

Catatan: Saya tertarik pada kompleksitas dalam model teoretis seperti mesin Turing.

Bruno
sumber
sarankan bermigrasi / "mempromosikan" ini ke Theoretical Computer Science
vzn
@ vz: Saya rasa ini tidak berguna ...
Bruno
kenapa tidak? pertanyaan ini mengingatkan saya pada serangan algoritmik pada dugaan Dysons misalnya yang dibahas oleh RJLipton dalam 1 , 2
vzn
Hanya karena saya menemukan jawaban untuk pertanyaan saya, jadi tidak perlu menanyakannya di tempat lain di pikiran saya.
Bruno

Jawaban:

1

[Sunting] Seperti yang disarankan, saya mengedit jawaban saya untuk memberikan rincian lebih lanjut.

Jawaban untuk pertanyaan kedua saya adalah tidak :

Dalil. Menghitung hingga presisi k setidaknya sama sulitnya dengan menghitung bit-ukuran x 2 k .log(x)kx2k

Bukti. Biarkan menunjukkan ukuran bit integer y . Pemberitahuan pertama bahwa untuk bilangan bulat non-negatif y , ukuran bit y adalah 1 + log y .|y|yyy1+logy

Jadi, . Sekarang 2 k log ( x ) adalah log ( x ) menggeser posisi k ke kiri. Dengan demikian seseorang dapat menghitung log|x2k|=1+2klogx2klog(x)log(x)k ke presisi k hanya dengan mengurangi 1 ke ukuran bit x 2 k dan menggeser posisi hasil k ke kanan.log(x)k1x2kk

Bruno
sumber
1
Mengapa jumlah bit dalam memungkinkan Anda menghitung log x ke k bit dengan presisi? Apakah pengurangan Anda benar-benar berhasil? Bagaimana jika kasus khusus di mana n = 2 kx2klogxkn=2k jauh lebih mudah / lebih sulit daripada semua nilai lainnya yang mungkin (bukan-kekuatan-dua)? Apakah Anda memiliki cara untuk mengesampingkan kemungkinan itu? n
DW
@ WD: Saya kembali ke pertanyaan ini, setelah komentar vzn. Buktiku adalah sebagai berikut: Jumlah bit integer adalah 1 + log y . Jadi, jumlah bit dalam x 2 k adalah 1 + 2 k log x . Selanjutnya, 2 k log x sama dengan log x tetapi menggeser posisi k ke kiri. Jadi, 2 k log x memberi Anda (setidaknya) bit pertama ky1+logyx2k1+2klogx2klogxlogxk2klogxk . Jadi, jika Anda dapat menghitung jumlah bit x 2 k , dengan mengurangi 1 pada hasilnya, Anda mendapatkanbit k pertamadari log x . Apakah ini masuk akal? logxx2k1klogx
Bruno
Ya, itu lebih masuk akal bagi saya! Terutama karena Anda hanya berusaha menunjukkan kekerasan. Bolehkah saya mendorong Anda untuk memperbarui jawaban Anda dengan penjelasan yang lebih terperinci ini? Terima kasih telah kembali ke ini dan mendokumentasikan jawaban untuk pertanyaan Anda sendiri.
DW