【问题标题】:How does prime factorization guarantee that the factors will be prime?素数分解如何保证因子是素数?
【发布时间】:2020-04-10 16:18:14
【问题描述】:

在这段特定的代码中,它如何不输出 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++; 
    }
}

【问题讨论】:

  • "6 除以 18 没有余数" 你的意思是 6 除以 18 还是 18 除以 6?前者给出的余数为 6,而后者给出的余数为 0。
  • 已修复,感谢指出!
  • 我建议你添加一些打印语句来看看发生了什么。我不清楚代码在做什么。
  • 我会从使用固定大小的数组切换到添加值的列表。
  • 我添加了打印语句,但这并没有向我解释这个过程

标签: c# primes


【解决方案1】:

每个数字要么是素数,要么是素数的倍数。看: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

【讨论】:

  • 18 不能被 4、8 或 10 整除。它可以被 2、3、6 和 9(当然还有 1 和 18)整除。
  • @juharr 我并不真正关心这些数字。 不必检查这些数字是质数分解有效且有用的原因。
  • 你字面意思是说 18 可以除以 2 - 4, 6, 8, 10。我指出这是完全错误的。我认为您的意思是说 18 只能被小于或等于它的数字整除。
  • @juharr 我实际上说过:“因为 18 可以除以 2 - 4, 6, 8, 10,其他所有内容从不需要测试。”和“作为19不能除以2、4、6、8和10永远不需要测试。"
  • @juharr 我最初也是这样读的。注意 2 和 4 之间的破折号。克里斯托弗打算用它来区分想法。它可能应该是一个句号或其他标点符号,以表明他将“18 可以除以 2”和“4、6、8、10 和其他一切都不需要测试”作为两个单独的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多