【问题标题】:Find a prime number?找到一个素数?
【发布时间】:2009-10-17 22:45:57
【问题描述】:

要确定 N 是否为素数,我们只需要查找所有小于或等于 sqrt(N) 的数。这是为什么?我正在编写 C 代码,因此试图了解其背后的原因。

【问题讨论】:

  • @ChssPly76:我认为这是一个完全有效的算法查询。
  • 嗯...我正在编写代码来实现这一点。怎么又不编程了?
  • 其实只需要检查素数
  • 属于mathoverflow.net
  • GMan:按照你的逻辑,algorithmscryptographycompression 和一大堆其他标签中的几乎每个问题都是题外话。归根结底,编程是一门应用数学学科 - 如果问题是 “我如何证明我只需要测试数字 .

标签: c++ c algorithm


【解决方案1】:

如果 N 是一个正整数,并且可以被两个正整数 1 和 N 整除,则 N 是素数。由于一个数的除数不能大于该数,因此可以进行简单的素性检验:

  • 如果大于 1 的整数 N 不能被[2, N-1] 范围内的任何整数整除,则 N 是素数。否则,N 不是素数。

但是,最好修改此测试以使其更快。所以让我们调查一下。

注意 N 的除数成对出现。如果 N 能被一个数 M 整除,那么它也能被 N/M 整除。例如,12 可以被 6 整除,因此也可以被 2 整除。此外,如果 M >= sqrt(N),则 N/M <= sqrt(N)

这意味着如果没有小于或等于sqrt(N)的数能整除N,那么也没有大于sqrt(N)的数能整除N(除了1和N本身),否则就会产生矛盾。

所以我们有一个更好的测试:

  • 如果大于 1 的整数 N 不能被[2, sqrt(N)] 范围内的任何整数整除,则 N 是素数。否则,N 不是素数。

如果你考虑上面的推理,你应该看到一个通过这个测试的数字也通过了第一个测试,一个没有通过这个测试的数字也没有通过第一个测试。因此,这些测试是等效的。

【讨论】:

    【解决方案2】:

    一个合数(非素数,或 1)至少有 1 对因数,并且保证每对数中的一个数小于或等于该数的平方根(即就是你要问的)。

    如果你对数字平方根,你会得到数字本身(sqrt(n) * sqrt(n) = n),所以如果你让其中一个数字更大(比sqrt(n)),你必须让另一个数字更小。如果您只检查数字 2 到 sqrt(n),您将检查所有可能的因素,因为这些因素中的每一个都将与大于 sqrt(n) 的数字配对(当然,如果该数字是其他数字的平方,例如 4、9、16 等...但这没关系,因为您知道它们不是素数;它们很容易被 sqrt(n) 本身分解)。

    【讨论】:

      【解决方案3】:

      原因很简单,任何大于 sqrt 的数,都会导致另一个乘数小于 sqrt。在这种情况下,你应该已经检查过了。

      【讨论】:

        【解决方案4】:

        n=a×b为复合物。

        假设 a>sqrt(n) 和 b>sqrt(n)。

        a×b > sqrt(n)×sqrt(n)

        a×b > n

        但是我们知道a×b=n,因此an) 或 bn).

        既然你只需要知道ab就可以显示n是合数,你只需要检查直到sqrt( n) 来找到这样的数字。

        【讨论】:

          【解决方案5】:

          因为在最坏的情况下,数字n 可以表示为a2

          如果数字可以用不同的方式表示,那么除数之一将小于a = sqrt(n),但另一个可以更大。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-22
            • 1970-01-01
            相关资源
            最近更新 更多