다항식 시간에서 숫자가 완벽한 거듭 제곱인지 확인하는 방법


23

AKS 우선 순위 테스트 알고리즘의 첫 번째 단계는 입력 번호가 완벽한 검정력인지 확인하는 것입니다. 논문이 자세히 설명하지 않았기 때문에 이것은 숫자 이론에서 잘 알려진 사실 인 것 같습니다. 누군가 다항식 시간 에이 작업을 수행하는 방법을 말해 줄 수 있습니까? 감사.


7
AKS 알고리즘의 첫 번째 단계는 입력 숫자가 완전한 거듭 제곱인지 ( 일부 정수 c, n> 1 의 경우 형식의 숫자 임 ) 테스트하는 것입니다.이 숫자는 소수입니다. 완벽한 힘을 시험하는 것은 논문 ( von zur Gathen and Gerhard, 2003의 Modern Computer Algebra) 에 인용 된 책의 연습 문제 9.44입니다 . 나는 책을 읽지 않았고 답을 모른다. 그러나 당신은 그 책을 참고 했는가? 기음
Tsuyoshi Ito

1
AKS의 첫 번째 단계는 숫자가 양의 정수인지, 반드시 소수가 아닌지 확인하는 것입니다. AKS 이전에 다항식 시간의 주요 검정력을 확인하는 방법을 알고 있다면 이미 다항식 시간 우선 성 테스터를 제공했을 것입니다.
arnab

@Tsuyoshi 내 실수를 지적 해 주셔서 감사합니다. 나는 책을 참고하지 않았다.
yzll

2
질문이 걱정되는 경우 게시하기 전에 문제를 해결해보십시오.
Tsuyoshi Ito

Tsuyoshi / arnab, 아마도 답변으로 다시 게시해야합니다.
Suresh Venkat

답변:


31

그것과 같이 쓸 수있다 모두 한 경우, 숫자 N이 주어 B 후, (b> 1) b를 < 로그 ( N ) + 1 . 모든 고정 대해 B ,가 존재하는지 검사 가진 B = N 이진 검색을 사용하여 수행 될 수있다. 따라서 총 실행 시간은 O ( log 2 n ) 입니다.ab<log()+1에이에이=영형(로그2)


5
Ramprasad의 답은 지수 인 를 수행 할 시간을 남겨둔다 . 또 다른 방법은 b를 선택한 다음 총 시간이 O ( l o g 3 n )nb 근 을 계산 하는 것 입니다. 영형(영형)영형(영형)
David Marquis

1
간단한 개선 더 제거하는 것을 의해서만 프라임 계수 선택 B를 . 로그로그
Chao Xu

16

Bach and Sorenson, 완벽한 전력 테스트를위한 시브 (Sieve) 알고리즘, Algorithmica 9 (1993), 313-328, DOI : 10.1007 / BF01228507 및 DJ Bernstein, 본질적으로 선형적인 시간에 완벽한 전력 감지, Math를 참조하십시오. Comp. 67 (1998), 1253-1283.


DJ Bernstein, HW Lenstra Jr. 및 J. Pila, 개선 된 점근 실행 시간 및 간단한 치료법을 갖춘 후속 논문도 있습니다. Comp. 76 (2007), 385-388.
Erick Wong

3

2003 년 3 월 18 일, R.Crandall과 J.Papadopoulos의 AKS class primality test 구현에 대해 흥미롭고 우아한 해결책을 찾았습니다.


2

어떻게 든 이진 검색 알고리즘이 임을 알 수 있습니다 .영형( (  )2)

먼저, 이면 b < l g n이 있습니다. 이진 검색 알고리즘 : 각각에 대해 B , 우리는 찾아 진 검색을 사용 .에이=< 
에이

마다의 계산 B의 선정 L g B = L 개의 g의 리터 g N 이용한 동작 빠른 지수화 . 따라서, 남아있는 문제의 범위 A는 .에이 =  에이

경우 의 최대 가능한 값이고 , A는 , 이진 검색이 필요 리터 g의 동작을에이에이 에이

참고 이며, 리터 g의 = 리터 g의 N은  에이= 

 에이= 
 에이= (11+12+...+1)=  =   

영형(   )

에이영형( (  )2) 마침내.

추신 : 모든 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.