更有效的计算素数因子分解的方法?

时间:2015-03-31 15:54:49

标签: java

我目前有一个程序来查找给定数字的素数因子分解;使用较小的数字可以正常工作,但超过一百万的任何东西都需要很长时间我的代码非常低效,找到输入下面的所有素数,并检查哪些素数除以余数。我不知道如何降低效率,提供任何帮助?

static ArrayList<Integer> primeNumbersBelow(long n) {

    ArrayList<Integer> ay = new ArrayList<Integer>();
    ay.add(2);

    for(int i = 3; i < ((n % 2 != 0) ? (n + 1) / 2 : n / 2); i++) {
        boolean divides = false;
        for(int j = 2; j < i; j++) {
            if(i % j == 0) {
                divides = true;
            }
        }
        if(!divides) {
            ay.add(i);
            System.out.println(i);
        }
    }
    return ay;
}

static ArrayList<Integer> primeFactorisationOf() {

    ArrayList<Integer> ay = new ArrayList<Integer>();
    ArrayList<Integer> aay = primeNumbersBelow(input);
    long n = input;

    for(int i = 0, len = aay.size(); i < len; i++) {
        int f = aay.get(i);
        boolean run = true;

        while(run) {
            if(n % f == 0) {
                ay.add(f);
                n /= f;
            } else {
                run = false;
            }
        }
    }
    return ay;
}

3 个答案:

答案 0 :(得分:1)

来自Mr Lars Vogel @ vogella ...

 public static List<Integer> primeFactors(int number) {
    int n = number;
    List<Integer> factors = new ArrayList<Integer>();
    for (int i = 2; i <= n; i++) {
      while (n % i == 0) {
        factors.add(i);
        n /= i;
      }
    }
    return factors;
  }

答案 1 :(得分:0)

坚持您的通用算法而不是重写您的primesBelow(..)方法:我会说:

  1. 一旦divides = true,您就可以摆脱for-loop
  2. 素数检查的循环终止条件的复合体可以减少到Math.sqrt(n) - 我不会通过数学计算,但你可以自己查看。

答案 2 :(得分:0)

改进代码的一种方法是删除循环结构中的IO。 也就是说,

static ArrayList<Integer> primeNumbersBelow(long n) {
    ArrayList<Integer> ay = new ArrayList<Integer>();
    ay.add(2);

    for(int i = 3; i < ((n % 2 != 0) ? (n + 1) / 2 : n / 2); i++) {
        boolean divides = false;
        for(int j = 2; j < i; j++) {
            if(i % j == 0) {
                divides = true;
            }
        }
        if(!divides) {
            ay.add(i);
            //REMOVE THE FOLLOWING LINE
            System.out.println(i);
        }
    }
    return ay;
}

我相信你会看到一个巨大的性能提升。