Mengapa anjak bilangan bulat besar dianggap sulit?

17

Saya membaca bahwa algoritma yang paling efisien ditemukan dapat menghitung faktor dalam waktu, tetapi kode saya tulis adalah O ( n ) atau mungkin tergantung pada seberapa cepat pembagian dan modulus. Saya cukup yakin saya telah salah mengerti sesuatu di suatu tempat, tapi saya tidak yakin di mana. Inilah yang saya tulis dalam bentuk kode semu.O(exp((64/9b)1/3(logb)2/3)O(n)O(nlogn)

function factor(number) -> list
    factors = new list
    if number < 0
        factors.append(-1)
        number = -number
    i = 2
    while i <= number
        while number % i == 0
            factors.append(i)
            number /= i
        i++
    return factors
EnderShadow
sumber
3
Google "polinomial semu".
Raphael
Algoritma itu sebenarnya sangat lambat - jika angka adalah bilangan prima loop sambil iterate (number) times. Ada argumen yang sangat sederhana yang memungkinkan Anda lolos dengan iterasi sqrt (angka).
gnasher729

Jawaban:

26

Anda mengacaukan angka dengan jumlah bit yang diperlukan untuk mewakili n . Di sini b = jumlah bit yang diperlukan untuk mewakili n (jadi b lg n ). Ini membuat perbedaan besar. Sebuah O ( n ) -waktu algoritma adalah O ( 2 b ) -waktu algoritma - eksponensial dalam jumlah bit. Sebagai perbandingan, algoritma "efisien" yang Anda temukan memiliki waktu berjalan yang subeksponensial dalam b .nnb=nblgnO(n)O(2b)b

Contoh: Pertimbangkan (2 juta). Kemudian b = 21 bit sudah cukup untuk mewakili angka n . Jadi, sebuah algoritma yang O ( 2 b 1 / 3 ) akan jauh lebih cepat daripada algoritma yang O ( 2 b ) . Sebuah O ( n ) algoritma jatuh ke dalam kategori yang terakhir, yaitu, sangat lambat.n=2,000,000b=21nO(2b1/3)O(2b)O(n)

Lihat https://en.wikipedia.org/wiki/Integer_factorization

DW
sumber
1
Saya tahu itu sesuatu yang sederhana seperti itu.
EnderShadow
3
@ EnnderShadow: Juga, jenis angka yang anjaknya dianggap sulit menggunakan perangkat keras yang tersedia saat ini, dan digunakan misalnya dalam enkripsi RSA, memiliki (yaitu n > 2 1.000 ) atau lebih. Sebagai latihan, dengan anggapan bahwa komputer Anda dapat menjalankan algoritma O ( n ) Anda , katakanlah, satu miliar iterasi per detik, hitung berapa tahun yang diperlukan untuk faktor n 2 1.000 . (Jika reaksi awal Anda adalah "itu tidak mungkin benar!", Anda mungkin telah menghitungnya dengan benar.)b>1,000n>21,000O(n)n21,000
Ilmari Karonen
1

Anda memiliki sekitar dua pertanyaan di sini, yang umum dan yang khusus tentang kode Anda. yang spesifik ditangani di jawaban yang lain. pertanyaan umum dalam judul tentang kompleksitas anjak sangat dalam. Sayangnya tidak ada bukti ilmiah yang kuat bahwa anjak piutang berada di luar P selain dari (sebagian besar keadaan) "banyak ahli telah mencoba dan gagal" dan beberapa ahli menduga itu ada di dalam P; ini dianggap sebagai salah satu masalah teori kompleksitas yang terbuka (dan sangat sulit untuk diselesaikan). setelah beberapa dekade "serangan berat", algoritma terbaik bersifat eksponensial. kompleksitas anjak adalah salah satu dari "beberapa masalah luar biasa" yang diketahui terletak "antara" P dan NP lengkap tetapi belum diklasifikasikan sebagai sejauh ini.

seperti yang ditunjukkan, kompleksitas itu tidak banyak masalah sampai digunakan ("kira-kira") di cryptosystems RSA pada pertengahan 1980-an di mana keamanan kriptografi tergantung pada asumsi. (dua lainnya "tidak terlalu mendorong" terkait datapoints: algoritma Shors untuk P-time kuantum factoring dan pengujian primality terbukti berada di P pada awal 2000-an dalam algoritma AKS yang terkenal / terkenal .) kemungkinan hasil positif adalah bahwa itu dalam waktu kuasipolinomial , yang lebih lemah dari NP lengkap (dengan asumsi P ≠ NP dan NP lengkap memiliki waktu eksponensial lebih rendah terikat ) tetapi secara teknis masih "keras".

sejauh ini belum menemukan survei hebat tentang subjek utama ini. Namun lihat juga

ay
sumber
Skenario lain yang mungkin tampak "edge-case" adalah bahwa anjak piutang bisa dalam P tetapi masih belum ada algoritma yang layak. alias algoritma galaksi
vzn
Harus disebutkan bahwa RSA adalah tentang memfaktorkan produk dari dua bilangan prima besar (di mana seseorang mengetahui bilangan prima dan hanya mengalikannya, dan orang lain diberikan produk dan seharusnya menemukan bilangan prima). Dapat dibayangkan bahwa mungkin ada algoritma yang dapat menentukan faktor produk dari dua bilangan prima besar, tetapi bukan produk lebih dari dua bilangan prima besar. Sama seperti angka anjak bilangan prima yang besar (tetapi tidak diketahui sebelumnya sebagai bilangan prima yang besar) dapat dilakukan dalam waktu polinomial.
gnasher729