2016-06-16 1 views
2

번호가 제지 번호인지 아닌지 확인하려면 어떻게 프로그램해야합니까?

Zeisel 수 패턴입니다

p[x] = a*p[x-1] + b 

a와 b에 해당 적어도 세 소인수와 평방 무료 정수 k는 더 zeisel numbers에 대해 알아야 할 사항 일부 정수 상수이고 x는 인수 분해의 각 소수 요소의 인덱스 번호이며, 낮은 값에서 높은 값으로 정렬됩니다. Zeisel 수를 결정할 목적으로 p [0] = 1입니다.

이 코드는 java로 작성했습니다. 이 함수는 양수 b를 테스트하지만, 음수는이 아닙니다. 어떻게해야합니까?

// function to caluculate zeisel number 
public static boolean zeisel(int num) { 
    // returning false if not squarefree 
    if (Math.sqrt(num) == (int) Math.sqrt(num)) 
     return false; 
    int fac = 2, count = 0, str = num; 
    // arrray to store prime factors 
    int[] fact; 
    int a = 1, b = 0, i = 0; 
    // counting number of factors 
    while (num != 1) { 
     if(num % fac == 0) { 
      count++; 
      num /= fac; 
     } 
     else 
      fac++; 
    } 
    num = str; 
    fac = 2; 
    // storing factors in array 
    fact = new int[count]; 
    while (num != 1) { 
     if(num % fac == 0) { 
      fact[i] = fac; 
      i++; 
      num /= fac; 
     } else 
      fac++; 
    } 
    if(i < 3) 
     return false; 
    // checking for zeisel equation 
    while(a < fact[0]) { 
     b = fact[0] - a; 
     for(i = 1; i < count; i++) { 
      if(fact[i] != a*fact[i -1] + b) { 
       break; 
      } 
     } 
     if(i == count) { 
      return true; 
     } 
     a++; 
    } 
    return false; 
} 
+0

긍정적으로 부정적인 변환 : 당신이 (수정 square-free 조건) fact[]에 요소를 생성 한 후

그래서, 테스트 같은 일이 될 수 있습니다. – Krythic

+0

'a'는 음수 일 수 없습니다. 맞습니까? 위키피디아는 이것에 대해 아무 말도하지 않는다. 만약 'a'가 음수 일 수 있다면 a와 b에 대한 무한한 해결책이 될 수있다! – niceman

+0

'Math.sqrt (num) == (int) Mat.sqrt (num)'은 "제곱없는"테스트에 적합하지 않습니다. "10"은 정사각형이없는 숫자이지만 "18"은 정사각형 (3^2)으로 균등하게 나눌 수 있기 때문에 아닙니다. – AJNeufeld

답변

0

어떤이 ab 요소를 결정하기 위해 루프에 대한 필요가 없습니다. 당신은 두 개의 미지수의 방정식이 : 두 번째에서 첫 번째 빼면

p1 = a * (1) + b 
p2 = a * p1 + b 

은 제공 : 직접 a = (p2 - p1)/(p1 - 1)에 대한 해결하기 위해 사용하고 정수를 가정 할 수

p2 - p1 = a * (p1 - 1) 

, 다음에 대한 해결 b = p1 - a.

if ((fact[1] - fact[0]) % (fact[0] - 1) != 0) 
    return false; 

int a = (fact[1] - fact[0])/(fact[0] - 1); 
int b = fact[0] - a; 

for(int i=2; i<count; i++) { 
    if (fact[i] != a*fact[i-1] + b) { 
     return false; 
    } 
} 
return true; 
관련 문제