Polinom zamanında bir sayının mükemmel bir güç olup olmadığı nasıl kontrol edilir?


23

AKS primality test algoritmasının ilk adımı, giriş sayısının mükemmel bir güç olup olmadığını kontrol etmektir. Bu, kağıt teorisinde ayrıntılı olarak açıklanmadığı için, sayı teorisinde iyi bilinen bir gerçektir. Biri bana polinom zamanında nasıl yapıldığını söyleyebilir mi? Teşekkürler.


7
AKS algoritmasının ilk adımı, giriş sayısının mükemmel bir güç olup olmadığını test etmektir ( bazı tamsayılar için formunun bir numarası ), bu sayının asal güç olup olmadığını test etmekten farklıdır. Mükemmel bir güç testi, makalede belirtilen kitabın 9.44'ünün Alıştırmasıdır ( von Modern Bilgisayar Cebiri , von zur Gathen ve Gerhard, 2003). Kitabı okumadım ve cevabı bilmiyorum, ama kitaba baktın mı? cn
Tsuyoshi Ito

1
AKS'nin ilk adımının, sayının zorunlu bir asal değil, bazı pozitif tamsayıların gücü olup olmadığını kontrol ettiğine inanıyorum. AKS'den önce polinom zamanında birincil bir gücün nasıl kontrol edileceği biliniyorsa, bu zaten bir polinom zaman önceliği test cihazı verecekti.
arnab

@Tsuyoshi Hatamı gösterdiğiniz için teşekkür ederiz. Ben kitaba bakmadım.
10:07

2
Eğer söz umurumda , yayınlamadan önce sorunu çözmek için deneyin.
Tsuyoshi Ito,

Tsuyoshi / arnab, belki de kabul etmek için cevap olarak tekrarlamalısınız?
Suresh Venkat

Yanıtlar:


31

Bir sayı n verildiğinde, eğer (b> 1), sonra olarak yazılabilir . Ve her bir sabit , bir a'nın var olup olmadığını kontrol etmek , olan ikili arama kullanılarak yapılabilir. Toplam çalışma süresi bu nedenle sanırım. b < log ( n ) + 1 b a a b = n O ( log 2 n )abb<log(n)+1baab=nO(log2n)


5
Süresi üzerinden Ramprasad cevabı yaprakları üs yapmak . Başka bir yolu seçmek için b sonra hesaplamak B inci kök n toplam zaman olurdu O ( l O g 3 N ) . O(log3n)bbnO(log3n)
David Marquis

1
Basit bir geliştirme ayrıca kaldırır bir o sadece tarafından faktör asal seçti b . loglognb
Chao Xu

16

Bach ve Sorenson, Mükemmel güç testi için elek algoritmaları, Algorithmica 9 (1993), 313-328, DOI: 10.1007 / BF01228507 ve DJ Bernstein, Doğrusal zamanda mükemmel güçlerin tespiti, Math'a bakınız. Zorunlu. 67 (1998), 1253-1283.


Aynı zamanda, gelişmiş asimptotik çalışma süresi ve daha basit tedavi ile bir takip kağıdı da var: DJ Bernstein, HW Lenstra Jr. ve J. Pila, Mükemmel güçlerin kopyalara çarpanlara ayrılması, Math. Zorunlu. 76 (2007), 385-388.
Erick Wong,

3

Makalede ilginç ve zarif bir çözüm buldum: AKS sınıfı ilkellik testinin uygulanması üzerine, R.Crandall ve J.Papadopoulos, 18 Mar 2003.


2

Her nasılsa, ikili arama algoritmasının olduğunu gösterebilirim .O(lg n(lg lg n)2)

İlk önce, , b < l g n var . İkili Arama Algoritması: Her biri için b , biz bulmak için ikili arama kullanmak bir .ab=nb<lg n
ba

Her bir hesaplama maliyet l g b = l g l g n kullanarak işlemleri hızlı üs . Bu nedenle, kalan konu aralığıdır bir .ablg b=lg lg na

Eğer azami olası değeri olan bir , daha sonra ikili arama ihtiyacı l g bir işlemleriAalg A

Not bu olduğu, l g A = l g nb lg a=lg n özetliyor, ΣlgA=lgn(1

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

Diğer bir deyişle, ikili arama için bütün operasyonlar O(lg nlg lg n)

abO(lg n(lg lg n)2)

ps: Tüm lg baz 2'dir.

Python kodu:

#--- 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.