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

时间:2011-04-27 22:01:59

标签: algorithm primes primality-test

为了测试一个数字是否为素数,为什么我们必须测试它是否只能被该数字的平方根整除?

15 个答案:

答案 0 :(得分:539)

如果数字n不是素数,则可以将其考虑为两个因素ab

n = a * b

如果ab都大于n的平方根,那么a * b将大于n。因此,这些因素中至少有一个必须小于或等于n的平方根,如果我们找不到小于或等于平方根的任何因子,n必须是素数

答案 1 :(得分:313)

我们说m = sqrt(n)然后m × m = n。现在,如果n不是素数,则n可以写为n = a × b,因此m × m = a × b。请注意,m是实数,而nab是自然数。

现在可能有3个案例:

  1. a> m⇒b<米
  2. a =m⇒b= m
  3. a< m⇒b>米
  4. 在所有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)。所以有ab这样的数字

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

通过将a<=bab相乘,得到:

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

因此:(请注意n=ab

a^2 <= n <= b^2

因此:(注意ab是正面的)

a <= sqrt(n) <= b

因此,如果一个数字(大于1)不是素数且我们测试的可达性达到数字的平方根,我们将找到其中一个因素。

答案 5 :(得分:7)

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

然后N可以分解为两个因子ab2 <= a, b < N,使得N = a*b。 显然,它们都不能同时大于sqrt(N)

让我们假设a更小而不失一般性。

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

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

因此,b = nN因此根据定义,(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)