要查找N是否为素数,我们只需要查找小于或等于sqrt(N)的所有数字。这是为什么?我正在编写一个C代码,试图理解它背后的原因。
答案 0 :(得分:28)
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本身),否则会产生矛盾。
所以我们有一个更好的测试:
[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)
,但另一个可能更大。