为了测试一个数字是否为素数,为什么我们必须测试它是否只能被该数字的平方根整除?
答案 0 :(得分:539)
如果数字n
不是素数,则可以将其考虑为两个因素a
和b
:
n = a * b
如果a
和b
都大于n
的平方根,那么a * b
将大于n
。因此,这些因素中至少有一个必须小于或等于n
的平方根,如果我们找不到小于或等于平方根的任何因子,n
必须是素数
答案 1 :(得分:313)
我们说m = sqrt(n)
然后m × m = n
。现在,如果n
不是素数,则n
可以写为n = a × b
,因此m × m = a × b
。请注意,m
是实数,而n
,a
和b
是自然数。
现在可能有3个案例:
在所有3个案例中,min(a, b) ≤ m
。因此,如果我们搜索到m
,我们必定会找到至少一个n
的因子,这足以表明n
不是素数。
答案 2 :(得分:51)
因为如果一个因子大于n的平方根,那么与它相乘的另一个因子必然小于n的平方根。
答案 3 :(得分:27)
更直观的解释是: -
100的平方根是10.对于各种a和b对,我们说x b = 100。
如果a == b,那么它们是相等的,并且是100的平方根。这是10。
如果其中一个小于10,则另一个必须更大。例如,5 x 20 == 100.一个大于10,另一个小于10.
考虑x b,如果其中一个发生故障,另一个必须变得更大以便进行补偿,因此产品保持在100个。它们围绕平方根旋转。
101的平方根约为10.049875621。因此,如果您要测试数字101的素数,您只需要尝试整数达到10,包括10.但是8,9和10本身不是素数,所以你只需要测试7,这是最好的。
因为如果有一对因子中的一个大于10,那么该对中的另一个必须小于10.如果较小的一个不存在,则没有匹配的更大因子为101。
如果您正在测试121,则平方根为11.您必须测试1到11(包括)的素数整数,以查看它是否均匀进入。 11进11次,所以121不是素数。如果你已经停在10点,而没有经过测试11,你就错过了11。
假设您只测试奇数,则必须测试大于2但小于或等于平方根的每个素数。
`
答案 4 :(得分:17)
假设n
不是素数(大于1)。所以有a
和b
这样的数字
n = ab (1 < a <= b < n)
通过将a<=b
与a
和b
相乘,得到:
a^2 <= ab
ab <= b^2
因此:(请注意n=ab
)
a^2 <= n <= b^2
因此:(注意a
和b
是正面的)
a <= sqrt(n) <= b
因此,如果一个数字(大于1)不是素数且我们测试的可达性达到数字的平方根,我们将找到其中一个因素。
答案 5 :(得分:7)
假设给定的整数N
不是素数,
然后N可以分解为两个因子a
和b
,2 <= a, b < N
,使得N = a*b
。
显然,它们都不能同时大于sqrt(N)
。
让我们假设a
更小而不失一般性。
现在,如果您找不到属于N
范围内[2, sqrt(N)]
的任何除数,那是什么意思?
这意味着N
[2, a]
中的a <= sqrt(N)
没有任何除数a = 1
。
因此,b = n
和N
因此根据定义,(a, b)
为素数。
...
如果您不满意,请进一步阅读:
1<= i <=k
的许多不同组合都是可能的。我们说它们是:
(a 1 ,b 1 ),(a 2 ,b 2 ),(a < sub> 3 ,b 3 ),.....,(a k ,b k )。在不失一般性的情况下,假设 i &lt; b i ,N
。
现在,为了能够证明sqrt(N)
不是素数,足以证明 i 都不能进一步分解。而且我们也知道 i &lt; = sqrt(N)
因此您需要检查直到N
,这将覆盖所有 i 。因此,您将能够得出$black
是否为素数的结论。
...
答案 6 :(得分:6)
这些只是分解和平方根的基本用法。
它可能看似抽象,但实际上它只是因为非素数的最大可能因子必须是它的平方根,因为:
sqrroot(n) * sqrroot(n) = n
鉴于此,如果 1
以上或 sqrroot(n)
以上的任何整数均匀分配到 {{1} } ,然后 n
不能是素数。
伪代码示例:
n
答案 7 :(得分:4)
所以要检查数字N是否为Prime。 我们只需要检查N是否可以被数字&lt; = SQROOT(N)整除。这是因为,如果我们将N分解为任何2个因子,比如X和Y,即。 N = X ÿ。 X和Y中的每一个都不能小于SQROOT(N),因为那时,X Y&lt; ñ X和Y中的每一个都不能大于SQROOT(N),因为那样,X * Y> N
因此,一个因子必须小于或等于SQROOT(N)(而另一个因子大于或等于SQROOT(N))。 因此,要检查N是否为Prime,我们只需检查那些数字&lt; = SQROOT(N)。
答案 8 :(得分:2)
假设我们有一个数字“a”,它不是素数[不是素数/复合数字意味着 - 一个数字可以用1或其自身以外的数字均分。例如,6可以均匀地分为2或3,以及1或6]。
6 = 1×6或6 = 2×3
所以现在如果“a”不是素数那么它可以除以另外两个数字,让我们说这些数字是“b”和“c”。这意味着
α= B * C
现在如果“b”或“c”,它们中的任何一个都大于“a”的平方根而不是“b”和“b”的乘积。 “c”将大于“a”。
所以,“b”&amp; “c”总是&lt; =“a”的平方根来证明方程“a = b * c”。
由于上述原因,当我们测试一个数字是否为素数时,我们只检查该数字的平方根。
答案 9 :(得分:1)
让n为非素数。因此,它至少有两个大于1的整数因子。令f是n个这样的因子中最小的。假设f> sqrt n。那么n / f是整数LTE sqrt n,因此小于f。因此,f不能是n的最小因子。 Reductio ad absurdum; n的最小因子必须是LTE sqrt n。
答案 10 :(得分:1)
给出任意数字n
,然后找到其因子的一种方法是求平方根p
:
sqrt(n) = p
当然,如果我们将p
自身相乘,那么我们将得到n
:
p*p = n
它可以重写为:
a*b = n
p = a = b
所在的位置。如果a
增加,则b
减少以维持a*b = n
。因此,p
是上限。
答案 11 :(得分:1)
是的,正如上面正确解释的那样,迭代到一个数的平方根的 Math.floor 来检查它的素性就足够了(因为 sqrt
涵盖了所有可能的除法情况;而 Math.floor
,因为任何高于 sqrt
的整数都将超出其范围)。
这是一个可运行的 JavaScript 代码片段,它代表了这种方法的一个简单实现——它的“运行时友好性”足以处理相当大的数字(我尝试检查质数和非质数高达 10**12(即 1 万亿)的数字与 online database of prime numbers 的结果进行了比较,即使在我的廉价手机上也没有遇到错误或滞后):
function isPrime(num) {
if (num % 2 === 0 || num < 3 || !Number.isSafeInteger(num)) {
return num === 2;
} else {
const sqrt = Math.floor(Math.sqrt(num));
for (let i = 3; i <= sqrt; i += 2) {
if (num % i === 0) return false;
}
return true;
}
}
<label for="inp">Enter a number and click "Check!":</label><br>
<input type="number" id="inp"></input>
<button onclick="alert(isPrime(+document.getElementById('inp').value) ? 'Prime' : 'Not prime')" type="button">Check!</button>
答案 12 :(得分:0)
要测试一个数字 n 的素数,人们会期望一个循环,例如首先跟随:
bool isPrime = true;
for(int i = 2; i < n; i++){
if(n%i == 0){
isPrime = false;
break;
}
}
上述循环的作用是:对于给定的 1&lt;我&lt; n ,它检查n / i是否为整数(留下余数为0)。如果存在i,其中n / i是整数,那么我们可以确定n不是素数,此时循环终止。如果对于no i,n / i是整数,那么n是素数。
与每种算法一样,我们会问:我们可以做得更好吗?
让我们看看上面的循环中发生了什么。
i的序列:i = 2,3,4,...,n-1
整数检查的顺序为:j = n / i,即n / 2,n / 3,n / 4,...,n /(n-1)
如果某些i = a,则n / a是整数,那么n / a = k(整数)
或n = ak,显然n> k> 1(如果k = 1,则a = n,但我永远不会达到n;如果k = n,则a = 1,但我从表格2开始)
此外,n / k = a,并且如上所述,a是i的值,因此n> 1。 a&gt; 1.
因此,a和k都是1和n之间的整数(不包括)。因为,我到达该范围内的每个整数,在某个迭代i = a,并且在某个其他迭代i = k。如果n的素数测试对于min(a,k)失败,则对于max(a,k)也将失败。所以我们只需要检查这两种情况中的一种,除非min(a,k)= max(a,k)(其中两个检查减少到一个),即a = k,此时a * a = n,暗示a = sqrt(n)。
换句话说,如果对于某些i&gt; = sqrt(n)(即max(a,k)),n的素性测试失败,那么对于某些i&lt; = n(也将失败)即,min(a,k))。因此,如果我们运行i = 2到sqrt(n)的测试就足够了。
答案 13 :(得分:0)
任何复合数字都是质数的产物。
假设n = p1 * p2
,其中p2 > p1
是质数。
如果n % p1 === 0
,则 n 是一个复合数字。
如果n % p2 === 0
,也猜猜n % p1 === 0
是什么!
因此,n % p2 === 0
不能同时为n % p1 !== 0
。
换句话说,如果复合数 n 可以除以
p2,p3 ... pi (更大的因子)也必须除以它的最低因子 p1 。
事实证明,最低因素p1 <= Math.square(n)
始终为真。
答案 14 :(得分:-1)
def print_hi(n):
if(n == 1 ):
return False;
if( n == 2 or n == 3):
return True;
if(n % 2 == 0 or n % 3 == 0):
return False;
for i in range (5,n,6):
if( i * i <= n):
if(n % i == 0 or n % (i+2) == 0):
return False
return True
if __name__ == '__main__':
x = print_hi(1032)
print(x)