Teori kompleksitas-sulit memeriksa nilai

13

The Fungsi utama-menghitung , diturunkan , didefinisikan sebagai jumlah bilangan prima kurang dari atau sama dengan .π(x)x

Kita dapat mendefinisikan masalah keputusan dari sebagai berikut:π(x)

Diberi dua angka dan , ditulis dalam biner, putuskan jika .xnπ(x)=n

Seorang teman dan saya berbicara tentang masalah ini sebelumnya hari ini. Ada algoritma pseudopolinomial-waktu untuk masalah ini - cukup hitung hingga , gunakan pembagian percobaan pada setiap langkah untuk melihat berapa banyak bilangan prima, dan periksa apakah itu sama dengan . Masalahnya juga di PSPACE, karena algoritma yang baru saja saya jelaskan dapat diimplementasikan untuk menggunakan hanya ruang bantu polinomial.nxn

Namun, saya mengalami kesulitan menemukan cara untuk menempatkan masalah ini ke kelas kompleksitas yang lebih rendah. Saya tidak dapat melihat cara membuat verifikasi polinomial-waktu untuk masalah ini, jadi saya tidak yakin apakah itu dalam NP, dan saya tidak bisa memikirkan cara untuk memasukkannya ke dalam hierarki polinomial sama sekali.

Apa kelas kompleksitas yang paling tepat untuk masalah ini?

Terima kasih!

templatetypedef
sumber
biasanya masalah-masalah
semacam ini

Jawaban:

11

Ini masalah yang sangat terbuka. Saya akan membuat sketsa beberapa kelas yang masalahnya "alami" cocok.

Definisi Anda agak canggung untuk dikerjakan, masalahnya sulit untuk disesuaikan dengan kelas kompleksitas yang ada. Bahasa yang Anda tetapkan adalah persimpangan bahasa dan { ( x , n ) | π ( x ) n } . Jadi jika misalnya { ( x , n ) | π ( x ) n } ada di kelas{(x,n)|π(x)n}{(x,n)|π(x)n}{(x,n)|π(x)n} then { ( x , n ) | π ( x ) n } akan di c o K . Hal ini membuat memberikan karakterisasi bahasa yang Anda definisikan keras karena seseorang harus menyatakan "persimpangan bahasa dalam K dengan bahasa dalam c o K " untuk memberikan batas yang paling ketat.K{(x,n)|π(x)n}coKKcoK

Masalah "Hitung " adalah masalah dalam # P , di mana # P F P S P A C E adalah kelas masalah dari bentuk "Hitung jumlah jalur penerimaan dari polinomial TM" nondeterministic, polinomial ". Jelas kita dapat membuat TM non-deterministik yang menebak angka q x , dan kemudian (dengan AKS) menguji apakah q adalah prima.π(X)#P#PFPSPACEqxq

Varian keputusan adalah P P , yang merupakan kelas bahasa yang berbentuk: "Diberikan polinomial TM non-deterministik, apakah paling tidak setengah dari jalur komputasi diterima?". Keduanya { ( x , n ) | π ( x ) n } dan { ( x , n ) | π ( x ) n } mungkin dapat direduksi menjadi masalah dalam P P#PPP{(x,n)|π(x)n}{(x,n)|π(x)n}PP (dengan melakukan beberapa fudging ke TM yang disebutkan di atas untuk menyeimbangkan jumlah jalur penerimaan).

Tom van der Zanden
sumber
3

Masalah Anda ada di C = P= melalui algoritma,

menebak secara non-deterministik bilangan bulat sedemikian rupa[m dan sedikit0m<2log2(x+1)]b
jika x < mkemudian tolak
jika b=1kemudian:
jika m < nkemudian menerima lagi tolak
lain:
jika m prima maka terima yang lain tolak

.


Khususnya, masalah Anda juga dalam PP, karena PP ditutup di bawah pengurangan tabel kebenaran .


sumber
2

Dalam praktiknya, Anda mungkin mendapatkan jawabannya lebih cepat atau lebih lambat :-(

Ada perkiraan yang cukup baik untuk π (x). Jadi Anda menghitung perkiraan seperti itu, dan jika terlalu jauh Anda tahu bahwa π (x) ≠ n. Misalnya, jika n ≥ x maka saya tahu itu π (x) ≠ n tanpa menghitung apa pun.

Ada algoritma cepat yang menentukan apakah π (x) genap atau ganjil, berjalan di O (x ^ (1/2)). Anda dapat menjalankan algoritme ini dan dapat mendeteksi bahwa paritas n salah dan Anda selesai. Ini memiliki peluang lima puluh jika n adalah bilangan bulat acak mendekati π (x).

Selain itu, saya tidak tahu metode apa pun yang lebih cepat daripada menghitung π (x). Yang sangat merepotkan - jika saya menulis sebuah program yang seharusnya menghitung π (10 ^ 25), dan saya mendapatkan hasil yang tidak jelas salah, maka tidak ada cara untuk memeriksa bahwa hasil saya benar selain mengulangi perhitungan. Dan Anda tidak bisa hanya mengulangi perhitungan menggunakan program saya, Anda perlu menulis program yang berbeda, jika tidak, Anda tidak akan mendeteksi jika program saya memiliki bug yang membuatnya menghitung fungsi yang sedikit berbeda dari π (x).

π (x) dapat dihitung dengan mudah di sekitar O (n ^ (2/3)), dan lebih cepat dengan beberapa matematika yang sangat dalam.

gnasher729
sumber
1
Ini menarik, tetapi pertanyaannya lebih tentang kelas kompleksitas yang mengandung masalah.
usul