如何编程以检查数字是否是一个zeisel数字?

时间:2016-06-16 14:58:27

标签: java functional-programming number-theory

了解有关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;
}

1 个答案:

答案 0 :(得分:0)

无需任何循环来确定ab因素。你有两个未知数的方程式:

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;