如何在java中优化此代码?

时间:2015-03-23 19:50:08

标签: java algorithm math optimization

public class factorize {

public static void f(int n) {
    int i = 2;
    while( n > 1) {
        if (n%i == 0) {
            System.out.println("Factors " + i);
            n = n / i;
        }
        else {
            i++;
        }
    }
}

你好,我在java中做了factorize的一个函数但是需要多次执行,我试着在网上看到一些定理,但结果是一样的。 你能告诉我一些算法尽可能快地执行这个分解吗?这段代码需要2分钟。

1 个答案:

答案 0 :(得分:2)

试试这个:

public static void f(int n) {
    int i = 2;
    while(i*i <= n) {
        if (n%i == 0) {
            System.out.println("Factors " + i);
            n = n / i;
        }
        else {
            i++;
        }
    }

    if (n > 1) {
        System.out.println("Factors " + n);
    }
}

这是有效的,因为您只能有一个大于sqrt(n)的素数因子:如果您有两个素数因子,那么他们的产品将超过n,因为sqrt(n)*sqrt(n) = n。因此,检查这些内容就足够了,如果n > 1,则剩余的n是另一个主要因素。

注意: 2732983441203969650是一个很大的数字,不适合int。如果您希望算法适用,请考虑使用long。请注意,它的平方根也非常大,因此算法可能仍然非常慢。对于如此大的数字,因子分解非常困难。您可以尝试的一种算法可能适用于64位数字的Pollard's Rho algorithm

您可以在代码中优化的其他内容:

  1. 单独检查2,然后仅按奇数检查可分性;

  2. 使用Sieve of Eratosthenes生成低于n平方根的素数,并检查这些素数的可分性。