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.
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
complexity-theory
time-complexity
factoring
primes
EnderShadow
sumber
sumber
Jawaban:
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 .n n b= n b≈lgn O(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,000 b=21 n O(2b1/3) O(2b) O(n)
Lihat https://en.wikipedia.org/wiki/Integer_factorization
sumber
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
Anjak piutang mungkin lebih mudah dari yang Anda kira / Cohn
Bukti bilangan bulat integer dalam P / mathoverflow (menyebutkan pemikiran Sarnak dalam P, dan dijawab oleh Cohn juga)
"Dunia Impagliazzos, pandangan pribadi tentang kompleksitas kasus rata-rata / Impagliazzo. Berbicara tentang kompleksitas asumsi teoretis / dugaan yang secara umum terhubung dengan kriptografi (misalnya anjak piutang). Banyak / sebagian besar kunci (misalnya P vs NP dll) masih terbuka setelah beberapa dekade.
sumber