如何快速找到最大的素因子?

时间:2016-02-24 19:58:18

标签: java performance

我有这段代码可以找到数字600851475143的最大素数因子:

    BigInteger tal = new BigInteger("600851475143");
    BigInteger tempBiggest = new BigInteger("2");
    BigInteger temp = new BigInteger("2");
    boolean check = true;

    for (BigInteger I = new BigInteger("2"); I.compareTo(tal) < 0; I = I.add(BigInteger.ONE)) {
        if (tal.mod(I).equals(BigInteger.ZERO)) {
            temp = I;
            if (temp.mod(new BigInteger("2")).equals(BigInteger.ZERO)) {
                check = false;
            } else {
                for (BigInteger t = new BigInteger("2"); t.compareTo(temp) < 0; t = t.add(BigInteger.ONE)) {
                    if (temp.mod(t).equals(BigInteger.ZERO)) {
                        check = false;
                        break;
                    }
                }
                if (check) {
                    tempBiggest = I;
                }
                check = true;
            }
        }               
    }
    System.out.println(tempBiggest);
    System.exit(0);

该代码适用于较小的数字,但不适用于较大的数字。有没有办法简化这个或者我的整个代码是否错误构建?

4 个答案:

答案 0 :(得分:2)

这使我的平均电脑低于700毫安:

public static void main(String[] args) {
    long tal = 600851475143L;
    int i;
    for (i = 2; i <= tal; i++) {
        if (tal % i == 0) {
            tal /= i; i--;
        }
    } 
    System.out.println("largest prime factor is " + i); // largest prime factor is 6857
}

答案 1 :(得分:0)

首先,仅循环到mod(2)

其次,您可以跳过偶数,所以只需检查mod(3)然后检查mod(5)mod()等。

第三,在运行期间,您可以构建成功测试的素数列表,然后仅检查该列表中的项目check。这将节省大量时间,你可能会忘记第二点。

最后但并非最不重要 - true变量非常混乱,而是将其移动到内部块中,始终初始化为if并忘记下一个周期的最后一次更新。

答案 2 :(得分:0)

最大的素数因子可以是最多sqrt(num)。所以最好从那开始然后下降而不是上升。这样,只要你有一个因素,你就完成了。

BigInteger sqrt = getApproxSquareRoot(num);
for (BigInteger t = sqrt; t.compareTo(2) > 0; t = t.add(BigInteger.ONE)) {
   // if t divides num then you found it.
}

答案 3 :(得分:0)

您的代码是正确的,但您可以更改某些内容以使其快速运行。 例如,在第一个周期中,仅向i添加一个是没用的,因为您正在考虑每两个步骤为2的倍数。此外,您可以检查i.compareTo(sqrt(tal)) < 0;以避免其他无用的循环。 此外,我会想到一种不使用check的方法。