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

时间:2016-05-26 18:35:09

标签: java math primes prime-factoring

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

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;
  }

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

2 个答案:

答案 0 :(得分:4)

我们可以通过矛盾来证明这不会发生。

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

答案 1 :(得分:1)

这里我们不需要检查天气数量是否为素数因为 要添加的数字肯定是素数..让我们举一些例子

1)16它是2,4,8,16的倍数,但由于while循环而只添加了2

2)18它的倍数是2,3,6,9和18但是因为while循环而只添加了2,3和3

3)n整数 我们不知道它的多重但是 当i = 2时,数字变为奇数,所以现在所有偶数都被消除(意味着任何数字的倍数不能被n / 2整除)

当i = 3时,如果mod为零,则添加并且三个中的所有三个得到消除 (表示3的倍数不能被n / 3整除)

这就是我们如何计算数字是否为素数,例如将数字除以2然后它也不是4,6,8等的倍数

在排序中我们除了用小数字除以之外的其他数字

我希望你理解逻辑