为什么我们要检查质数的平方根以确定它是否为质数?


Answers:


659

如果数字n不是素,它可以分解成两个因素ab

n = a * b

现在a并且b不能都大于的平方根n,因为从那以后乘积a * b将大于sqrt(n) * sqrt(n) = n。因此,在的任何因式分解中n,至少一个因数必须小于的平方根n,并且如果我们找不到任何小于或等于平方根的因数,则n必须为素数。


sqrt(n)考虑到我们使用的是浮点数,如何足够精确地保持此属性。
贝诺瓦

@Benoît 如果不想避免浮点数的复杂性,可以始终使用支票i * i <= n代替i <= sqrt(n)
Sven Marnach,

348

比方说,m = sqrt(n)然后m × m = n。现在,如果n不是素数,则n可以写成n = a × b,所以m × m = a × b。请注意,m是实数,而na并且b是自然数。

现在可以有3种情况:

  1. a> m⇒b <m
  2. a = m⇒b = m
  3. a <m⇒b> m

在所有3种情况下,min(a, b) ≤ m。因此,如果我们搜索直到m,就必定会找到至少一个因子n,足以表明它n不是素数。


4
n = 12 m = sqrt(12)= 3.46,a = 2,b =6。n = m m,即12 = 3.46 * 3.46,n = a b,即12 = 2 * 6。现在条件3。a <m <b即2 <3.46 <6。因此,要检查素数,我们只需要检查小于3.46的数字(即2)即可发现该数字不是素数。因此,用小于或等于n的平方根(如果n = 4,m = a = b = 2)的数检查除数。
anukalp 2014年

2
我认为我们应该首先强调该假设。假设n is not a prime,并证明这一点,否则就是素数。
Huei Tan

实际上,我不认为这是一个更好的答案。这是一个正确的答案,但并不能真正回答问题。它只是描述了素数和平方根周围的其他动态。@Sven的答案既简洁又不会在此过程中提出更多问题。
乔恩·M

1
我回滚到上一个好的版本。当有人不必要地删除该流程所需的单词(“因此”)时,您会错过它。
Will Ness

55

因为如果一个因子大于n的平方根,则与其相乘等于n的另一个因子必然小于n的平方根。


37

一个更直观的解释是:

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但小于或等于平方根的素数。

`


3
“考虑到axb,如果其中一个下降,则另一个必须增大以进行补偿,因此乘积保持在100。它们围绕平方根旋转。” 我的那一刻!谢谢!
布莱恩·威金顿

这是最好的答案。
JeanieJ

19

假设n不是素数(大于1)。因此,有数字ab这样

n = ab      (1 < a <= b < n)

通过关系乘以a<=b通过ab我们得到:

a^2 <= ab
 ab <= b^2

因此:(请注意n=ab

a^2 <= n <= b^2

因此:(请注意,ab为正数)

a <= sqrt(n) <= b

因此,如果一个数字(大于1)不是质数,并且我们测试了除数直到该数字的平方根,我们就会发现其中一个因素。


8

假设给定的整数N不是素数,

然后N可以被分解成两个因素ab2 <= a, b < N使得N = a*b。显然,两者不能同时大于sqrt(N)

让我们假设不失一般性地假设它a较小。

现在,如果您找不到N范围内的所有除数,[2, sqrt(N)]那是什么意思?

这意味着as N中没有任何除数。[2, a]a <= sqrt(N)

因此,a = 1b = n因此根据定义,N是素数

...

如果您不满意,请继续阅读:

的许多不同组合(a, b)是可能的。假设它们是:

(a 1,b 1),(a 2,b 2),(a 3,b 3),.....(a k,b k)。不失一般性,假设 i <b i1<= i <=k。。

现在,要证明N不是素数,就足以证明i不能进一步分解。而且我们也知道i <= sqrt(N),因此您需要检查直到sqrt(N)覆盖所有i。因此,您将能够得出结论是否N为质数。

...


7

这实际上只是分解和平方根的基本用途。

它可能看起来是抽象的,但实际上,它仅在于非素数的最大可能阶乘必须是其平方根的事实,因为:

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中创建一条语句,可以尽早退出计算,而不是浪费计算能力。感谢您的发表。
阿德里安

@Adrian我必须承认,回到这个答案之后,在您发帖时确实发现了一个错误。您不能对0进行除法运算,从理论上讲,如果您可以++i将其变为数字1,则该数字将始终返回false(因为1除以所有内容)。我已经纠正了上面的答案。
超级猫

是的...我在代码中解决了这个问题...平方根观测值是在开始运行计算之前及早抛出非素数值的好方法。我被大量杀害,事实证明这是浪费大量时间。我还了解到该算法也可以大大减少处理大量数字的时间。en.wikipedia.org/wiki/Miller -Rabin_primality_test
阿德里安

6

因此要检查数字N是否为质数。我们只需要检查N是否可被数字<= SQROOT(N)整除。这是因为,如果我们将N分解为任意两个因子,则说X和Y。N = XY。X和Y的每个不能小于SQROOT(N),因为X Y <N X和Y的每个都不可以大于SQROOT(N),因为X * Y> N

因此,一个因数必须小于或等于SQROOT(N)(而另一个因数大于或等于SQROOT(N))。因此,要检查N是否为质数,我们只需要检查那些<= SQROOT(N)的数字。


3

假设我们有一个数字“ 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”。

由于上述原因,当我们测试一个数字是否为质数时,我们只会检查该数字的平方根。


1
b&c <= Math.sqrt(n)?; 应该是b || c(b或c),因为如果n = 6,b = 3,c = 2,则Math.sqrt(n)> c。
daGo

感谢哥们的纠正。进行更正。:)
Abu Naser Md Shoaib

2

给定任意数字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范围扩大一半。


1

令n为非素数。因此,它具有至少两个大于1的整数因子。令f为n的此类因子中的最小值。假设f> sqrt n。然后,n / f是整数LTE sqrt n,因此小于f。因此,f不能是n的最小因子。荒谬的还原;n的最小因子必​​须是LTE sqrt n。


1

任何复合数字都是质数的乘积。

n = p1 * p2,在哪里p2 > p1是素数。

如果n % p1 === 0ñ是一个复合数字。

如果n % p2 === 0那你猜怎么着n % p1 === 0着!

所以没有办法,n % p2 === 0n % p1 !== 0要同时做到。换句话说,如果合成数n可以除以 p2,p3 ... pi(其更大的因数),则它也必须除以最低的因数p1。事实证明,最低因素p1 <= Math.square(n)始终是正确的。


如果您好奇为什么它是真的,@ LoMaPh会在其答案中极大地说明了这一事实。我添加了答案,因为我真的很难想象和理解其他提供的答案。只是没有点击。
daGo

0

为了测试数字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进行测试就足够了。


注释和6岁的答案中的内容短得多,恕我直言,更容易理解,更多的是主题解释……
Thierry Lathuille
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.