Cara memeriksa apakah angka adalah kekuatan sempurna dalam waktu polinomial

23

Langkah pertama dari algoritma pengujian primality AKS adalah untuk memeriksa apakah nomor input adalah kekuatan yang sempurna. Tampaknya ini adalah fakta yang terkenal dalam teori bilangan karena makalah ini tidak menjelaskannya secara terperinci. Dapatkah seseorang memberi tahu saya bagaimana melakukan ini dalam waktu polinomial? Terima kasih.

yzll
sumber
7
Langkah pertama dari algoritma AKS adalah untuk menguji apakah angka input adalah daya sempurna (sejumlah bentuk untuk beberapa bilangan bulat c, n> 1), yang berbeda dari pengujian apakah angka tersebut merupakan kekuatan utama. Tes untuk kekuatan sempurna adalah Latihan 9.44 dari buku yang dikutip dalam makalah ( Modern Computer Algebra oleh von zur Gathen dan Gerhard, 2003). Saya belum membaca buku dan saya tidak tahu jawabannya, tetapi Anda sudah berkonsultasi dengan buku itu? cn
Tsuyoshi Ito
1
Saya percaya langkah pertama AKS memeriksa apakah angka tersebut adalah kekuatan bilangan bulat positif, belum tentu prima. Jika diketahui bagaimana memeriksa kekuatan utama dalam waktu polinomial sebelum AKS, itu sudah akan memberikan penguji waktu polinomial waktu.
arnab
@ Tsuyoshi Terima kasih telah menunjukkan kesalahan saya. Saya belum membaca buku itu.
yzll
2
Jika Anda peduli dengan pertanyaan itu , cobalah untuk menyelesaikan masalah sebelum Anda mempostingnya.
Tsuyoshi Ito
Tsuyoshi / arnab, mungkin Anda harus memposting ulang sebagai jawaban agar ini dapat diterima?
Suresh Venkat

Jawaban:

31

Dengan diberi nomor n, jika bisa dituliskan sebagai (b> 1), maka . Dan untuk setiap tetap , memeriksa apakah ada dengan dapat dilakukan dengan menggunakan pencarian biner. Karenanya total waktu yang berjalan adalah . b < log ( n ) + 1 b a a b = n O ( log 2 n )abb<log(n)+1baab=nO(log2n)

Ramprasad
sumber
5
Jawaban daun Ramprasad keluar waktu untuk melakukan exponentiation yang . Cara lain adalah dengan memilih b kemudian menghitung b th akar n yang akan memiliki total waktu O ( l o g 3 n ) . O(log3n)bbnO(log3n)
David Marquis
1
Sebuah perbaikan sederhana yang selanjutnya menghilangkan faktor hanya memilih prime b . loglognb
Chao Xu
16

Lihat Bach dan Sorenson, algoritma Sieve untuk pengujian daya sempurna, Algorithmica 9 (1993), 313-328, DOI: 10.1007 / BF01228507, dan DJ Bernstein, Mendeteksi kekuatan sempurna dalam waktu yang pada dasarnya linear, Matematika. Comp. 67 (1998), 1253-1283.

Jeffrey Shallit
sumber
Ada juga makalah tindak lanjut dengan waktu berjalan asimptotik yang lebih baik dan perawatan yang lebih sederhana: DJ Bernstein, HW Lenstra Jr. dan J. Pila, Mendeteksi kekuatan sempurna dengan memfaktorkan ke koprimes, Math. Comp. 76 (2007), 385-388.
Erick Wong
3

Saya menemukan solusi yang menarik dan elegan di koran: Tentang penerapan uji keutamaan kelas AKS, oleh R.Crandall dan J.Papadopoulos, 18 Mar 2003.

Kuburan
sumber
2

O(lg n(lg lg n)2)

ab=nb<lg n
ba

ablg b=lg lg na

Aalg A

b lg a=lg n

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: Semua lg adalah basis 2.

Kode python:

#--- 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
Kevin
sumber