AKS 우선 순위 테스트 알고리즘의 첫 번째 단계는 입력 번호가 완벽한 검정력인지 확인하는 것입니다. 논문이 자세히 설명하지 않았기 때문에 이것은 숫자 이론에서 잘 알려진 사실 인 것 같습니다. 누군가 다항식 시간 에이 작업을 수행하는 방법을 말해 줄 수 있습니까? 감사.
AKS 우선 순위 테스트 알고리즘의 첫 번째 단계는 입력 번호가 완벽한 검정력인지 확인하는 것입니다. 논문이 자세히 설명하지 않았기 때문에 이것은 숫자 이론에서 잘 알려진 사실 인 것 같습니다. 누군가 다항식 시간 에이 작업을 수행하는 방법을 말해 줄 수 있습니까? 감사.
답변:
그것과 같이 쓸 수있다 모두 한 경우, 숫자 N이 주어 B 후, (b> 1) b를 < 로그 ( N ) + 1 . 모든 고정 대해 B ,가 존재하는지 검사 을 가진 B = N 이진 검색을 사용하여 수행 될 수있다. 따라서 총 실행 시간은 O ( log 2 n ) 입니다.
Bach and Sorenson, 완벽한 전력 테스트를위한 시브 (Sieve) 알고리즘, Algorithmica 9 (1993), 313-328, DOI : 10.1007 / BF01228507 및 DJ Bernstein, 본질적으로 선형적인 시간에 완벽한 전력 감지, Math를 참조하십시오. Comp. 67 (1998), 1253-1283.
어떻게 든 이진 검색 알고리즘이 임을 알 수 있습니다 .
먼저, 이면 b < l g n이 있습니다. 이진 검색 알고리즘 :
각각에 대해 B , 우리는 찾아 진 검색을 사용 을 .
마다의 계산 B의 선정 L g B = L 개의 g의 리터 g N 이용한 동작 빠른 지수화 . 따라서, 남아있는 문제의 범위 A는 .
경우 의 최대 가능한 값이고 , A는 , 이진 검색이 필요 리터 g의 의 동작을
참고 이며, 리터 g의 = 리터 g의 N은
마침내.
추신 : 모든 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