วิธีตรวจสอบว่าตัวเลขเป็นพลังที่สมบูรณ์แบบในเวลาพหุนาม


23

ขั้นตอนแรกของอัลกอริทึมการทดสอบแบบดั้งเดิมของ AKS คือการตรวจสอบว่าหมายเลขอินพุตนั้นเป็นพลังงานที่สมบูรณ์แบบหรือไม่ ดูเหมือนว่านี่เป็นข้อเท็จจริงที่รู้จักกันดีในทฤษฎีจำนวนเนื่องจากบทความไม่ได้อธิบายอย่างละเอียด มีคนบอกฉันได้ไหมว่าจะทำอย่างไรในเวลาพหุนาม ขอบคุณ


7
ขั้นตอนแรกของอัลกอริทึม AKS คือการทดสอบว่าหมายเลขอินพุทเป็นกำลังที่สมบูรณ์แบบ (จำนวนของรูปแบบสำหรับจำนวนเต็มบางส่วน c, n> 1) ซึ่งแตกต่างจากการทดสอบว่าจำนวนนั้นเป็นพลังงานเฉพาะหรือไม่ การทดสอบสำหรับพลังที่สมบูรณ์แบบคือการออกกำลังกาย 9.44 ของหนังสือที่อ้างถึงในกระดาษ ( พีชคณิตคอมพิวเตอร์สมัยใหม่โดย von zur Gathen และ Gerhard, 2003) ฉันยังไม่ได้อ่านหนังสือและไม่ทราบคำตอบ แต่คุณได้อ่านหนังสือเล่มนี้แล้วหรือยัง? cn
Tsuyoshi Ito

1
ฉันเชื่อว่าขั้นตอนแรกของ AKS จะตรวจสอบว่าตัวเลขนั้นเป็นจำนวนเต็มบวกหรือไม่ หากทราบวิธีการตรวจสอบพลังงานสำคัญในเวลาพหุนามก่อนที่ AKS จะได้รับการทดสอบพหุนามเวลาพหุนามแล้ว
arnab

@ ซึโยชิขอบคุณที่ชี้ให้เห็นความผิดพลาดของฉัน ฉันไม่ได้อ่านหนังสือ
yzll

2
หากคุณสนใจคำถามนี้โปรดลองแก้ปัญหาก่อนโพสต์
Tsuyoshi Ito

Tsuyoshi / arnab บางทีคุณควรโพสต์ใหม่เป็นคำตอบเพื่อให้สามารถยอมรับได้?
Suresh Venkat

คำตอบ:


31

ได้รับหมายเลข A N ถ้าที่ทั้งหมดมันสามารถเขียนเป็น (b> 1) จากนั้น< ล็อก( n ) + 1 และสำหรับทุก ๆ ค่าคงที่b การตรวจสอบว่ามีaกับa b = nสามารถทำได้โดยใช้การค้นหาแบบไบนารี เวลาทำงานทั้งหมดจึงเป็นO ( บันทึก2 n )ฉันเดาab<log(n)+1aab=nO(log2n)


5
Ramprasad ของใบคำตอบออกมาเวลาที่จะทำยกกำลังซึ่งเป็น ) อีกวิธีหนึ่งคือการเลือกแล้วคำนวณรากของ TH nซึ่งจะมีเวลารวมของO ( L o กรัม3 n ) O(log3n)bbnO(log3n)
David Marquis

1
การปรับปรุงอย่างง่ายที่จะลบ factor โดยเลือก prime bเท่านั้น loglognb
Chao Xu

16

ดู Bach และ Sorenson, อัลกอริทึม Sieve สำหรับการทดสอบพลังงานที่สมบูรณ์แบบ, อัลกอริทึม 9 (1993), 313-328, DOI: 10.1007 / BF01228507 และ DJ Bernstein ตรวจจับพลังที่สมบูรณ์แบบในเวลาเชิงเส้นเป็นหลัก คอมพ์ 67 (1998), 1253-1283


นอกจากนี้ยังมีกระดาษติดตามที่มีเวลาในการทำงานเชิงซีมโทติคที่ดีขึ้นและการรักษาที่ง่ายขึ้น: DJ Bernstein, HW Lenstra Jr. และ J. Pila, การตรวจจับพลังที่สมบูรณ์แบบโดยการแยกตัวประกอบใน coprimes, Math คอมพ์ 76 (2007), 385–388
Erick Wong

3

ฉันพบวิธีแก้ปัญหาที่น่าสนใจและสง่างามในบทความ: ในการดำเนินการทดสอบแบบดั้งเดิมของ AKS โดย R.Crandall และ J.Papadopoulos, 18 Mar 2003


2

ยังไงก็เถอะผมสามารถแสดงให้เห็นว่าการค้นหาแบบทวิภาคคือ )O(lg n(lg lg n)2)

ประการแรก = nมี< ลิตรกรัม n ค้นหาแบบไบนารีขั้นตอนวิธีการ: สำหรับแต่ละเราจะใช้ค้นหา binary ที่จะหาab=nb<lg n
ba

แต่ละเวลาในการคำนวณของต้นทุนลิตรกรัม= ลิตรกรัมต่อลิตรกรัมnการดำเนินงานโดยใช้ การยกกำลังอย่างรวดเร็ว ดังนั้นปัญหาที่เหลือคือช่วงของablg b=lg lg na

หากคือค่าสูงสุดที่เป็นไปได้ของaดังนั้นการค้นหาแบบไบนารีต้องการ การดำเนินการl g AAalg A

โปรดทราบว่านั่นคือ l g A = l g nb lg a=lg n เมื่อรวมกันแล้ว lgA=lgn(1)

lg A=lg nb
lg A=lg n(11+12+...+1B)=lg nlg B=lg nlg lg n

กล่าวอีกนัยหนึ่งการดำเนินการทั้งหมดสำหรับการค้นหาแบบไบนารี่คือO(lg nlg lg n)

abO(lg n(lg lg n)2)

ps: lg ทั้งหมดเป็นฐาน 2

รหัสหลาม:

#--- a^n ---------------------------------------
def fast_exponentation(a, n):
    ans = 1
    while n:
        if n & 1 : ans = ans * a
        a = a * a
        n >>= 1
    return ans
#------------------------------------------
# Determines whether n is a power a ^ b, O(lg n (lg lg n) ^ 2)
def is_power(n):
    if (- n & n) == n: return True  # 2 ^ k
    lgn = 1 + ( len( bin ( abs ( n ) ) ) - 2)
    for b in range(2,lgn):
        # b lg a = lg n
        lowa = 1L
        higha = 1L << (lgn / b + 1)
        while lowa < higha - 1:
            mida = (lowa + higha) >> 1
            ab = fast_exponentation(mida,b) 
            if ab > n:   higha = mida
            elif ab < n: lowa  = mida
            else:   return True # mida ^ b
    return False
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.