Answers:
如果数字n
不是素,它可以分解成两个因素a
和b
:
n = a * b
现在a
并且b
不能都大于的平方根n
,因为从那以后乘积a * b
将大于sqrt(n) * sqrt(n) = n
。因此,在的任何因式分解中n
,至少一个因数必须小于的平方根n
,并且如果我们找不到任何小于或等于平方根的因数,则n
必须为素数。
sqrt(n)
考虑到我们使用的是浮点数,如何足够精确地保持此属性。
i * i <= n
代替i <= sqrt(n)
。
比方说,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
不是素数。
n is not a prime
,并证明这一点,否则就是素数。
一个更直观的解释是:
100的平方根是10。比方说,对于a和b的各种对,axb = 100。
如果a == b,则它们相等,并且正好是100的平方根。是10
如果其中一个小于10,则另一个必须大于10。例如,5 x 20 ==100。一个大于10,另一个小于10。
考虑到axb,如果其中一个下降,则另一个必须增大以进行补偿,因此乘积保持在100。它们围绕平方根旋转。
101的平方根约为10.049875621。因此,如果您要测试数字101的素数,则只需要尝试10之前的整数,包括10。但是8、9和10本身不是素数,因此只需要测试7即可。主要。
因为如果存在一对因子,其中一个大于10,则该对中的另一个必须小于10。如果不存在较小的因子,则不存在匹配的较大因子101。
如果要测试121,则平方根为11。您必须测试1到11(包括11)的质数,看它是否均匀分布。11进入11次,所以121不是素数。如果您已经停在10,并且没有测试11,那么您将错过11。
假设您仅测试奇数,则必须测试每个大于2但小于或等于平方根的素数。
`
假设给定的整数N
不是素数,
然后N可以被分解成两个因素a
和b
, 2 <= a, b < N
使得N = a*b
。显然,两者不能同时大于sqrt(N)
。
让我们假设不失一般性地假设它a
较小。
现在,如果您找不到N
范围内的所有除数,[2, sqrt(N)]
那是什么意思?
这意味着as N
中没有任何除数。[2, a]
a <= sqrt(N)
因此,a = 1
并b = n
因此根据定义,N
是素数。
...
如果您不满意,请继续阅读:
的许多不同组合(a, b)
是可能的。假设它们是:
(a 1,b 1),(a 2,b 2),(a 3,b 3),.....(a k,b k)。不失一般性,假设 i <b i,1<= i <=k
。。
现在,要证明N
不是素数,就足以证明i不能进一步分解。而且我们也知道i <= sqrt(N)
,因此您需要检查直到sqrt(N)
覆盖所有i。因此,您将能够得出结论是否N
为质数。
...
这实际上只是分解和平方根的基本用途。
它可能看起来是抽象的,但实际上,它仅在于非素数的最大可能阶乘必须是其平方根的事实,因为:
sqrroot(n) * sqrroot(n) = n
。
鉴于此,如果上下任意整数1
或整数均sqrroot(n)
分为n
,则n
不能是一个素数。
伪代码示例:
i = 2;
is_prime = true;
while loop (i <= sqrroot(n))
{
if (n % i == 0)
{
is_prime = false;
exit while;
}
++i;
}
guard
,结合方便的stackoverflow.com/a/25555762/4475605在Swift中创建一条语句,可以尽早退出计算,而不是浪费计算能力。感谢您的发表。
++i
将其变为数字1,则该数字将始终返回false(因为1除以所有内容)。我已经纠正了上面的答案。
假设我们有一个数字“ a”,它不是质数[不是质数/复合数的意思-一个可以除以1或其他数字的数。例如,可以将6平均除以2、3或1或6]。
6 = 1×6或6 = 2×3
因此,现在如果“ a”不是素数,则可以将其除以另外两个数字,假设这些数字是“ b”和“ c”。意思是
a = b * c。
现在,如果“ b”或“ c”,则它们中的任何一个都大于“ a”的平方根,“大于” b”和“ c”的乘积将大于“ a”。
因此,“ b”或“ c”始终小于等于“ a”的平方根,以证明等式“ a = b * c”。
由于上述原因,当我们测试一个数字是否为质数时,我们只会检查该数字的平方根。
给定任意数字n
,找到其因子的一种方法是求平方根p
:
sqrt(n) = p
当然,如果我们p
自己相乘,那么我们会得到n
:
p*p = n
可以将其重写为:
a*b = n
在哪里p = a = b
。如果a
增加,则b
减少以维持a*b = n
。因此,p
是上限。
更新:我今天重新阅读了这个答案,对我来说,它变得更加清晰。该值p
不一定表示整数,因为如果为整数,则n
不是质数。因此,p
可以是一个实数(即带分数)。并且无需遍历整个范围n
,现在我们只需要遍历整个范围p
。另一个p
是镜像副本,因此实际上我们将范围减半。然后,现在我看到我们实际上可以继续重做,square root
并将其p
范围扩大一半。
任何复合数字都是质数的乘积。
说n = p1 * p2
,在哪里p2 > p1
是素数。
如果n % p1 === 0
再ñ是一个复合数字。
如果n % p2 === 0
那你猜怎么着n % p1 === 0
着!
所以没有办法,n % p2 === 0
但n % p1 !== 0
要同时做到。换句话说,如果合成数n可以除以
p2,p3 ... pi(其更大的因数),则它也必须除以最低的因数p1。事实证明,最低因素p1 <= Math.square(n)
始终是正确的。
为了测试数字n的素数,首先需要一个如下所示的循环:
bool isPrime = true;
for(int i = 2; i < n; i++){
if(n%i == 0){
isPrime = false;
break;
}
}
上面的循环是这样的:给定1 <i <n,它将检查n / i是否为整数(余数为0)。如果存在一个i,其中n / i是整数,那么我们可以确定n不是质数,此时循环终止。如果没有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> a> 1。
因此,a和k都是介于1和n之间的整数(不包括)。因为,我到达该范围内的每个整数,所以在某个迭代中,i = a,在其他迭代中,i = k。如果n的素数测试对min(a,k)失败,那么对max(a,k)也会失败。因此,我们仅需要检查这两种情况之一,除非min(a,k)= max(a,k)(其中两次检查都减少为1),即a = k,此时a * a = n,意味着一个= sqrt(n)。
换句话说,如果n的素数测试对于某些i> = sqrt(n)(即max(a,k))失败,那么对于某些i <= n(即min(a))也将失败。 ,k))。因此,如果我们对sqrt(n)的i = 2进行测试就足够了。
n = a*b
和a <= b
再a*a <= a*b = n
。