编程语言
首页 > 编程语言> > java – 为什么我们在获得素数因子时不必检查数字是否为素数?

java – 为什么我们在获得素数因子时不必检查数字是否为素数?

作者:互联网

这是寻找素因子的典型代码:

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

我的问题是为什么在将它添加到列表之前我们不检查我是否是素数?

解决方法:

我们可以通过矛盾来证明这不可能发生.

想象一下,一些复合数字被添加到列表中.必须有一些添加到列表中的最小复合数.我们称之为c,并想象它的最小素数因子是p.我们知道p< c,所以循环必须在用c运行之前用p运行.当循环确实用p运行时,我们知道循环会发现p是数n的除数,因为p是c的除数,c是n的除数.但是在这样做之后,代码将通过分割出p的所有副本来更新n.这意味着当我们到达循环在数字c上运行的部分时,数字c将不再分割n,因为p除以c,但是p不会除以n的新值(记住,我们将所有p)的副本.因此,c不会被添加到列表中 - 这是一个矛盾!

标签:java,math,primes,prime-factoring
来源: https://codeday.me/bug/20190608/1200222.html