质因数分解如何保证因子为质数?

How does prime factorization guarantee that the factors will be prime?

在这个特定的代码中,它为什么不输出 6 1,因为 6 没有除以 18 的余数。

int n = 18;
int[] fact = new int[100];
int[] pow = new int[100];
int d = 0; 

for (int i = 2; i <= n; i++) 
{
    int s = 0;

    while(n % i == 0)
    {
        s++; 
        n /= i;
    } 

    if (s > 0)
    {
        fact[d] = i; 
        pow[d] = s;
        d++; 
    }
}

每个数字要么是质数,要么是质数的倍数。看:https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

如果它不能被一个素数整除,它也不能被那个素数的任何倍数整除。因为 18 可以除以 2 - 4, 6, 8, 10 并且其他任何东西都不需要测试。因为 19 不能被 2 整除,所以 4、6、8 和 10 永远不需要测试。 20 可以被 10 整除,永远不需要测试。它已经除以 2,所以我们当时排除了一半可能的数字。

我们本能地排除除数,但通常只针对 2 - 只测试奇数 - 但你可以进一步推动这种方式。由于除法的结果也必须是质数或质数的倍数,甚至过了平方根就可以停止了。

你真正需要的是一个完整的素数列表,直到任何素数 > Squarroot(PrimeCandidate)。除了从记忆中读取它,这是我知道的最快的方法。

实际上我前阵子就这个主题写了一些东西,关于检查素数的 5 种方法:https://social.msdn.microsoft.com/Forums/en-US/85fc2406-d2e9-495a-bea7-e516661f8b40/primal-issues-multithreading-lists-in-memory-and-checking-for-prime-number?forum=csharpgeneral