2012-04-18 5 views
2

유명한 종이 PRIMES is in P을 연구하면 혼란스러워집니다.다항식 시간 알고리즘을 사용하여 숫자 지수가 숫자인지 여부를 테스트 할 수 있습니까?

알고리즘의 첫 단계는 If (n=a^b for nature number a and b>1), output COMPOSITE.입니다. 전체 알고리즘이 다항식 시간으로 실행되므로이 ​​단계도 O (log n)^c에서 완료되어야합니다 (주어진 입력 크기는 O (log n)입니다. 일부 인터넷 검색 후 대상을 공격하기 위해 어떤 알고리즘을 알아낼 수 없습니다

질문 :.?

이 다항식 시간에 다른 수의 번호 지수 여부를 테스트 할 수있는 알고리즘이 있습니까

감사합니다 최고 감사합니다.

+0

이것은 아마도 http://cstheory.stackexchange.com에 더 적합 할 것입니다. –

+3

'a'는 알려져 있습니까? 그렇다면 'n'을'a'로 반복해서 나눠서 결국 1을 얻는 지 확인하십시오; 우리가 상수 시간을 나눈다면'log_a (n)'단계를 거친다. 또는'log_a (n)'을 직접 (아마도'log (n)/log (a)'로) 계산하고 정수인지 확인하십시오. :) – Dougal

+0

@Dougal 응답 해 주셔서 감사합니다. 나는'a'가 알려지지 않았거나 뭔가를 놓친다 고 생각합니다. IIRC, 알고리즘의 주된 아이디어는 수를 복합체로 주장하는 몇 가지 규칙을 수립하는 것입니다. 이 규칙에 따라 소유권 주장이 실패하면 숫자는 소수의 지수 여야합니다. 이 첫 번째 단계는 지수가 1보다 큰 경우를 제거합니다. –

답변

4

≤ 로그 2 N B, 우리는이를 테스트하기 log n보다 작은 모든 b 년대 확인할 수 n=a^b 후 (> 1의 경우), 우리는 N 로그 2 내지 b를 찾기 위해 반복 등에 대한 수 a을 찾으면 1..sqrt (n) 사이에서 이진 탐색을 수행해야합니다. 그러나 바이너리 검색은 반복을위한 O (logn) 시간을 필요로하며 마지막으로 검색의 각 단계에서 (확인을 위해 a을 찾음) b == n인지 확인해야하며 O (log n)이므로 전체 검색 시간은 O (로그 n) 일 것입니다. 더 빠른 방법이있을 수 있지만 AKS이 O (로그 n)임을 알게되면이 O (로그 3)는 아무런 해를 끼치 지 않습니다.

+0

감사합니다. 그건 의미가 있습니다. :) –

2

숫자 n은 b^e = n 인 b와 e가 존재하는 경우 완벽한 힘입니다. 예를 들어 216 = 6^3 = 2^3 * 3^3은 완벽한 힘이지만 72 = 2^3 * 3^2는 그렇지 않습니다. 숫자가 완벽한 힘인지 결정하는 속임수는 숫자가 완벽한 힘이라면 지수 e가 log2n보다 작아야한다는 것입니다. 왜냐하면 e가 더 크면 2^e가 n보다 커야하기 때문입니다. 또한 소수가 복합 지수의 완벽한 힘이라면 복합 요소의 주요 인자에 대한 완벽한 힘이기 때문에 소수를 테스트하는 것만으로 충분합니다. 예를 들어, 2^15 = 32768 = 32^3 = 8^5는 완벽한 큐브 루트이고 완벽한 5 번째 루트입니다. 따라서 알고리즘은 log2 n보다 작은 소수의리스트를 만들고 각각을 테스트하는 것입니다. log2 n이 작고 소수의리스트가 더 작기 때문에 이것은 큰 n의 경우조차별로 효과가 없다.

here 구현을 볼 수 있습니다.

+0

"작은"것인지 아닌지에 대한 질문이 아니라 O (log (n))에서 모든 작업을 수행 할 수 있는지 여부에 대한 질문입니다. –

+0

외부 루프가 log2 n보다 작은 소수를 넘습니다. x보다 작은 x/log x 소수이므로, 내부 루프는 log n/log log n 번 실행됩니다. 이제 log log n은 모든 실제적인 목적을위한 상수 인 매우 작습니다. 그래서 우리는 외부 루프가 log n이라고 말할 것입니다.내부 루프가 실행될 때마다 Newton의 방법을 사용하여 2 차적으로 수렴하는 루트를 계산합니다. – user448810

+0

전체 댓글은 누락 된 것으로 보이지만 O (log (n)^2)처럼 들립니다. (여기에 대한 답을 업데이트하는 것이 좋을 것 같습니다.) –

1
public boolean isPerfectPower(int a) { 
    if(a == 1) return true; 
    for(int i = 2; i <= (int)Math.sqrt(a); i++){ 
     double pow = Math.log10(a)/Math.log10(i); 
     if(pow == Math.floor(pow) && pow > 1) return true; 
    } 
    return false; 
}