2016-06-16 12 views
2

zeisel numbers番号がゼイゼル番号であるかどうかを確認するプログラムを作成するにはどうすればよいですか?

Aツァイゼル数パターンa及びbは

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

に分類少なくとも三つ素因数と正方形フリー整数kであるの詳細を知ることいくつかの整数の定数であり、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'は否定できないでしょうか? wikipediaはこれについて何も言っていない。もしaが負であるとaとbに対して無限の解があるかもしれない! – niceman

+0

'' Math.sqrt(num)==(int)Mat.sqrt(num) 'は、「平方和なし」の適切なテストではありません。 「10」は正方形のない数字ですが、「18」は正方形(3^2)で均等に分割できるためではありません。 – AJNeufeld

答えて

0

ab要因を決定するために、任意のループ実行のための必要はありません。あなたは2つの未知数での方程式があります。第二から第一を引く

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; 
関連する問題