ทำไมแฟคตอริ่งจำนวนเต็มขนาดใหญ่จึงถือว่ายาก


17

ผมอ่านบางว่าอัลกอริทึมที่มีประสิทธิภาพมากที่สุดที่พบสามารถคำนวณปัจจัยในเวลา แต่รหัสที่ผมเขียนเป็นO ( n )หรือ อาจเป็นO ( n log n )ขึ้นอยู่กับว่าการหารและโมดูลัสรวดเร็วแค่ไหนฉันค่อนข้างแน่ใจว่าฉันเข้าใจผิดบางอย่าง แต่ฉันไม่แน่ใจว่าอยู่ที่ไหนนี่คือสิ่งที่ฉันเขียนในรูปแบบโค้ดหลอก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

3
Google "พหุนามหลอก"
กราฟิลส์

อัลกอริทึมนั้นช้ามาก - ถ้า number เป็นจำนวนเฉพาะวนซ้ำในขณะที่วนซ้ำ (จำนวน) ครั้ง มีอาร์กิวเมนต์ที่ง่ายมากที่อนุญาตให้คุณหลีกเลี่ยงการทำซ้ำ sqrt (number)
gnasher729

คำตอบ:


26

คุณมีความสับสนจำนวนกับจำนวนบิตที่จำเป็นในการเป็นตัวแทนของn ที่นี่b =จำนวนบิตที่ต้องใช้แทนn (ดังนั้นb lg n ) สิ่งนี้สร้างความแตกต่างอย่างมาก O ( n )เรียลไทม์อัลกอริทึมคือO ( 2 )เรียลไทม์อัลกอริทึม - ชี้แจงในจำนวนบิต ในการเปรียบเทียบขั้นตอนวิธีการ "ที่มีประสิทธิภาพ" คุณพบว่ามีเวลาทำงานที่เป็น subexponential ในขnnb=nblgnO(n)O(2b)b

ตัวอย่าง: พิจารณา (2 ล้าน) จากนั้น= 21บิตจะเพียงพอที่จะเป็นตัวแทนของจำนวนn ดังนั้นขั้นตอนวิธีการที่เป็นO ( 2 1 / 3 )จะเร็วกว่าอัลกอริทึมที่เป็นO ( 2 ) O ( n )ขั้นตอนวิธีการตกอยู่ในประเภทหลังคือช้ามากn=2,000,000b=21nO(2b1/3)O(2b)O(n)

ดูhttps://en.wikipedia.org/wiki/Integer_factorization


1
ฉันรู้ว่ามันเป็นอะไรที่เรียบง่ายแบบนั้น
EnderShadow

3
@EnderShadow: นอกจากนี้ชนิดของตัวเลขที่แฟคตอริ่งนั้นถือว่ายากโดยใช้ฮาร์ดแวร์ที่มีอยู่ในปัจจุบันและใช้ในการเข้ารหัส RSA เช่น >1,000 (เช่น n>21,000) หรือไม่ก็. เป็นการออกกำลังกายสมมติว่าคอมพิวเตอร์ของคุณสามารถใช้งานได้O(n) อัลกอริทึมที่พูดหนึ่งพันล้านครั้งต่อวินาทีคำนวณว่าต้องใช้เวลากี่ปีในการคำนวณ n21,000. (หากปฏิกิริยาเริ่มต้นของคุณคือ "ที่ไม่ถูกต้อง!" คุณอาจคำนวณได้อย่างถูกต้อง)
Ilmari Karonen

1

คุณมีคำถามสองข้อโดยประมาณที่นี่คำถามทั่วไปและคำถามเฉพาะเกี่ยวกับรหัสของคุณ คำตอบเฉพาะนั้นจะได้รับการจัดการในคำตอบอื่น ๆ คำถามทั่วไปในชื่อเรื่องความซับซ้อนของแฟคตอริ่งนั้นลึกมาก โชคไม่ดีที่ไม่มีหลักฐานทางวิทยาศาสตร์ที่ชัดเจนว่าแฟคตอริ่งอยู่นอกเหนือจาก P นอกเหนือจาก (ส่วนใหญ่สถานการณ์) "ผู้เชี่ยวชาญจำนวนมากได้ลองและล้มเหลว" และผู้เชี่ยวชาญบางคนคาดเดาว่ามันอยู่ใน P; มันถือเป็นหนึ่งในสำคัญที่สุด (และยากมากที่จะแก้ไข) ปัญหาเปิดของทฤษฎีความซับซ้อน หลังจากทศวรรษที่ผ่านมาของ "การโจมตีอย่างหนัก" อัลกอริธึมที่ดีที่สุดคือเลขชี้กำลัง ความซับซ้อนของแฟคตอริ่งเป็นหนึ่งใน "ปัญหาพิเศษสองสามข้อ" ซึ่งเป็นที่รู้กันว่าโกหก"ระหว่าง" P และ NP สมบูรณ์ แต่ยังไม่ได้รับการจำแนกว่าเป็นอย่างใดอย่างหนึ่ง

ตามที่ชี้ให้เห็นความซับซ้อนไม่ได้เป็นปัญหามากจนกระทั่งมันถูกนำมาใช้ ("คร่าว ๆ ") ในcryptosystems RSAในช่วงกลางทศวรรษ 1980 ที่ความปลอดภัยของการเข้ารหัสขึ้นอยู่กับสมมติฐาน (อีกสองข้อมูลที่ไม่สนับสนุนอย่างชัดเจน: อัลกอริทึม Shorsสำหรับการทดสอบควอนตัมแบบ P-time และการทดสอบแบบดั้งเดิมได้รับการพิสูจน์แล้วว่าเป็น P ในช่วงต้นปี 2000 ในอัลกอริทึม AKS ที่มีชื่อเสียง / โด่งดัง) มันอยู่ในเวลา quasipolynomialซึ่งอ่อนแอกว่าปัญหาที่สมบูรณ์ (สมมติว่า P NP NP และปัญหาที่สมบูรณ์มีช่วงเวลาลดลงชี้แจงแทน ) แต่ยังคงเทคนิค "ยาก"

ยังไม่พบการสำรวจที่ยอดเยี่ยมเกี่ยวกับคีย์ย่อยนี้จนถึงตอนนี้ อย่างไรก็ตามโปรดดูที่


another possible somewhat seemingly "edge-case" scenario is that factoring could be in P but there is still no feasible algorithm. aka galactic algorithms
vzn

มันควรจะกล่าวว่า RSA เป็นเรื่องเกี่ยวกับการแยกผลิตภัณฑ์ของสองช่วงเวลาที่มีขนาดใหญ่ (ที่มีคนรู้ช่วงเวลาและเพียงแค่คูณพวกเขาและคนอื่นจะได้รับผลิตภัณฑ์และควรจะหาช่วงเวลา) เป็นไปได้ว่าอาจมีอัลกอริทึมที่สามารถแยกผลิตภัณฑ์เป็นสองช่วงเวลาขนาดใหญ่ แต่ไม่ใช่ผลิตภัณฑ์ที่มีขนาดใหญ่กว่าสองช่วงเวลา เช่นเดียวกับตัวเลขแฟคตอริ่งที่เป็นช่วงเวลาที่มีขนาดใหญ่ (แต่ไม่ทราบล่วงหน้าว่าเป็นช่วงเวลาที่มีขนาดใหญ่) สามารถทำได้ในเวลาพหุนาม
gnasher729
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.