查找素数?

时间:2009-10-17 22:45:57

标签: c++ c algorithm

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

5 个答案:

答案 0 :(得分:28)

N是素数,如果它是一个正整数,它可以被正整数,1和N整除。由于数字的除数不能大于该数,所以这会产生一个简单的素性测试:

  • 如果整数N(大于1)不能被[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本身),否则会产生矛盾。

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

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

如果您考虑上面的推理,您应该看到通过此测试的数字也通过了第一次测试,并且未通过此测试的数字也未通过第一次测试。因此测试是等效的。

答案 1 :(得分:6)

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

如果您对数字的平方根进行平方,则会得到数字本身(sqrt(n) * sqrt(n) = n),因此如果您将其中一个数字设置得更大(而不是sqrt(n)),那么您必须创建另一个数字一个小的。如果您之后只检查数字2到sqrt(n),您将检查所有可能的因素,因为每个因素都将与大于sqrt(n)的数字配对(当然,除非数字实际上是一个其他数字的正方形,如4,9,16等......但这并不重要,因为你知道它们不是素数;它们很容易被sqrt(n)本身考虑在内。

答案 2 :(得分:5)

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

答案 3 :(得分:3)

n = a × b 是复合的。

假设 a &gt; sqrt( n )和 b &gt; sqrt( n )。

a × b &gt; SQRT(名词)×SQRT(名词的)

a × b &gt; 名词

但我们知道 a × b = n ,因此 a &lt; sqrt( n )或 b &lt; sqrt( n )。

由于您只需要知道 a b 以显示 n 是复合的,您只需要检查最多为sqrt的数字( n )找到这样的数字。

答案 4 :(得分:0)

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

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