了解有关zeisel numbers
的更多信息Zeisel数字是无方形整数k,至少有三个素数因子属于模式
p[x] = a*p[x-1] + b
其中a和b是一些整数常数,x是分解中每个素因子的索引号,从最低到最高排序。为了确定Zeisel数,p [0] = 1。
我在java中编写了以下代码。此功能测试正b,但不测试负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 :(得分:0)
无需任何循环来确定a
和b
因素。你有两个未知数的方程式:
p1 = a * (1) + b
p2 = a * p1 + b
从第二个中减去第一个给出:
p2 - p1 = a * (p1 - 1)
您可以使用哪个来直接求解a = (p2 - p1) / (p1 - 1)
,并假设它是一个整数,然后求解b = p1 - a
。
因此,在您fact[]
(已更正square-free条件)中生成了您的因素后,您的测试可能类似于:
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;