检查数字是否为质数

作者: John Pratt
创建日期: 9 二月 2021
更新日期: 28 六月 2024
Anonim
如何快速筛选质数?费马素性检验和米勒-拉宾测试
视频: 如何快速筛选质数?费马素性检验和米勒-拉宾测试

内容

质数是只能被自己整除的数字,称为1-其他数字 化合物 数字。在测试数字是否为质数时,有几种选择。这些方法中的一些相对简单,但对于大量而言根本不实用。经常使用的其他测试实际上是基于一个的完整算法 可能性 有时会错误地将数字视为质数。继续阅读第1步,以了解如何处理素数。

方法1之4:尝试除法

到目前为止,尝试除法是测试数字的最简单方法。对于较小的数字,通常也是最快的方法。该检验基于质数的定义:如果质数只能被自身和1整除,则该质数为质数。

  1. 认为 ñ 是您要测试的号码。 将数字n除以所有可能的整数。对于较大的数字(例如n = 101),将其除以小于n的任何可能整数是非常不切实际的。幸运的是,有一些技巧可以减少要测试的因素的数量。
  2. 确定是否 ñ 甚至。 所有偶数都可以被2整除。因此,如果n为偶数,则可以说 n是一个复合数字(因此不是质数)。要快速确定数字是否为偶数,您只需要注意最后一位数字即可。如果最后一位是2、4、6、8或0,则该数字为偶数而不是素数。
    • 该规则的唯一例外是数字2本身,因为它本身可以被1整除,所以它也是素数。 2是唯一的偶数素数。
  3. 部分 ñ 介于2到n-1之间的任何数字。 由于质数除自身和1外没有其他因数,并且由于整数因数小于其乘积,因此检查小于n且大于2的整数的可除性将确定n是否为质数。我们从2开始,因为偶数(2的倍数)不能是质数。正如您将在下面看到的,这远不是一种有效的测试方法。
    • 例如,如果要使用此方法测试11是否为质数,则将11除以3、4、5、6、7、8、9和10,以寻找没有余数的整数答案。由于这些数字都不完全适合11,因此我们可以说11是一个 是首要的.
  4. 为了节省时间,最多只能测试sqrt(ñ),四舍五入。 通过检查2到n-1之间的所有数字来测试数字n会很快花费很多时间。例如,如果要使用此方法检查103是否为质数,则必须除以3、4、5、6、7 ...等,一直到102!幸运的是,没有必要像这样进行测试。实际上,仅需要测试2和n的平方根之间的因数。如果n的平方根不是数字,则将其四舍五入为最接近的整数,然后测试该数字。请参阅以下说明:
    • 让我们检查100的因数。 100 = 1×100、2×50、4×25、5×20、10×10、20×5、25×4、50×2和100×1。请注意,在10×10之后,因子相同如果是10×10,则只有翻转。通常,我们可以忽略n大于sqrt(n)的因子,因为它们只是小于sqrt(n)的因子的延续。
    • 让我们尝试一个例子。如果n = 37,则无需测试3到36之间的所有数字即可确定n是否为质数。相反,我们只需要查看2到sqrt(37)之间的数字(向上舍入)。
      • sqrt(37)= 6.08-我们将把这个数四舍五入到7。
      • 37不能被3、4、5、6和7完全整除,因此我们可以自信地说它是一个 质数 是。
  5. 为了节省更多时间,我们仅使用素数。 通过不包括那些不是素数的因子,除以更短的时间可以使测试过程更短。根据定义,每个复合数字都可以表示为两个或多个质数的乘积。因此,数n除以合成数是不必要的-等效于数除以质数。因此,我们可以进一步缩小可能因素的范围,使其仅包含小于sqrt(n)的素数。
    • 这意味着可以跳过所有偶数因子以及质数倍数的因子。
    • 例如,让我们尝试确定103是否为质数。 103的平方根是11(向上舍入)。 2和11之间的质数是3、5、7和11。4、6、8和10是偶数,而9是3(质数)的倍数,因此我们可以跳过它。通过这样做,我们将可能的因素列表减少到只有4个数字!
      • 103不能被3、5、7或11完全整除,所以我们现在知道103是一个 质数 是。

方法2之4:使用费马小定理

1640年,法国数学家皮埃尔·德·费马特(Pierre de Fermat)首次提出了一个定理(现在以他的名字命名),该定理对于确定数字是否为质数非常有帮助。从技术上讲,Fermat的检验旨在验证数字是复合的,而不是质数。这是因为该测试可以“绝对确定”地表明数字是合成的,但是只有“概率”表明数字是质数。费马小定理在试图除法不切实际的情况下,并且存在可用的数字列表作为该定理的例外情况时非常有用。


  1. 认为 ñ 该数字用于测试。 您可以使用此测试确定给定数字n是否为质数。但是,如上所述,该定理有时会错误地将某些化合物表征为素数。重要的是要考虑到这一点并检查您的答案,下面将对此进行说明。
  2. 选择一个整数 一种 在2和之间 ñ-1(含)。 您选择的确切整数并不重要。由于a的参数包括2和n-1,因此您也可以使用它们。
    • 例如:是否为100素数。假设我们采取 3 作为测试值-在2到n-1之间,因此就足够了。
  3. 计算 一种 (mod ñ). 计算该表达式需要一些数学系统的知识,即 模块化数学。在模块化数学中,数字在达到某个值时会返回零,也称为 模数。您可以将其视为一个时钟:最终,时钟指针将在12点后返回1点,而不是13点。模量记为(mod ñ)。因此,在此步骤中,您将计算模数为n的a。
    • 另一种方法是计算a,然后将其除以n,然后将余数用作答案。具有大数功能的专门计算器在对大数进行除法时非常有用,因为它们可以立即计算除法的余数。
    • 在我们的示例中使用这样的计算器,我们可以看到3/100的余数为1。因此,3(mod 100)为 1.
  4. 如果我们手动计算,则使用指数作为短格式。 如果您没有带模数功能的计算器,请使用带指数的符号来简化确定余数的过程。见下文:
    • 在我们的示例中,我们计算模数为100的3。3是一个非常非常大的数字-515,377,520,732,011,331,036,461,129,765,621,272,702,107,522,001-太大了以至于很难使用。与其将48位答案用于3,不如将其写为指数,因此 (((((((3)*3))))*3))。请记住,取指数的指数具有乘以指数((x)= x)的作用。
      • 现在我们可以确定其余的了。首先在内部括号内求解(((((((3) * 3)))) * 3)),然后逐步解决,将每一步除以100。找到其余的内容后,我们会将其用于下一步而不是实际的答案。见下文:
        • (((((((9) * 3)))) * 3))-9/100没有余数,所以我们可以继续。
        • ((((((27)))) * 3))-27/100没有余数,因此我们可以继续。
        • (((((729)) * 3))-729/100 = 7 R29。其余为29。我们继续下一步,而不是729。
        • ((((29=841)) * 3))-841/100 = 8 R41。我们在下一步中再次使用余数41。
        • (((41 = 1681) * 3))-1681/100 = 16 R81。我们在下一步中使用余数81。
        • ((81*3 = 243))-243/100 = 2 R43。我们将在下一步中使用余数43。
        • (43 = 1849)-1849/100 = 18 R49。我们将在下一步中使用余数49。
        • 49 = 2401 -2401/100 = 24 R 1.我们的最后余数是1。换句话说,3(mod 100)=1。请注意,这与我们在上一步中计算的答案相同!
  5. 找出是否 一种 (mod ñ) = 一种 (mod ñ). 如果不是,则n为化合物。如果为真,则n 可能,(但不确定) 一个质数。用一个不同的值重复测试可以使结果更加确定,但是很少有满足费马定理的复合数 全部 a。的值被称为Carmichael数-这些数中的最小数为561。
    • 在我们的示例中,3(mod 100)= 1和3(mod 100)= 3.1≠3,因此我们可以说100是一个复合数字。
  6. 使用Carmichael号码确定您的结果。 在继续进行操作之前,先知道哪些数字符合Carmichael系列可为您省去许多有关数字是否为质数的麻烦。通常,Carmichael数是各个素数的乘积,对于所有素数,它都认为,如果p是n的除数,则p-1也是n-1的除数。卡迈克尔数的在线列表对于使用费马小定理确定数字是否为质数非常有用。

方法3之4:使用Miller-Rabin检验

Miller-Rabin检验的工作方式与Fermat的小定理相同,但对非标准数(例如Carmichael数)的处理更好。


  1. 认为 ñ 是我们要测试素数的奇数。 就像上面指出的方法一样,n是我们要确定素数的变量。
  2. 压力 ñ-1的形式为2× d 在哪 d 很奇怪 如果n为奇数,则为质数。因此n-1必须是偶数。由于n-1是偶数,因此可以将其写为2的奇数次幂。因此,4 = 2×1; 80 = 2×5;等等。
    • 假设我们要确定n = 321是否为质数。 321-1 = 320,我们可以表示为 2 × 5.
      • 在这种情况下,n = 321是合适的数字。为n = 371确定n-1可能需要较大的d值,从而使整个过程在以后的阶段更加困难。 371-1 = 370 = 2× 185
  3. 选择任何号码 一种 在2和之间 ñ-1. 您选择的确切数字无关紧要-它必须小于n且大于1。
    • 在我们的n = 321的示例中,我们选择a = 100.
  4. 计算 一种 (mod ñ). 如果 一种 = 1或-1(mod ñ),然后通过 ñ Miller-Rabin检验是 大概 一个质数。与费马小定理一样,该检验不能绝对确定地确定数字的素数,但需要进行其他检验。
    • 在我们的示例中,n = 321,a(mod n)= 100(mod 321)。 100 = 10,000,000,000(mod 321)= 313。我们使用特殊的计算器,或者使用前面所述的带指数的速记方法,来找到100/321的余数。
      • 由于我们没有获得1或-1,因此我们不能确定地说n是素数。但是,我们还有更多要做的事情-请继续阅读。
  5. 由于结果不等于1或-1,请计算 一种, 一种, ...依此类推,直到 一种d. 计算提高到d次方(最多2次)的幂。如果这两个均等于1或-1(mod ñ),然后通过 ñ Miller-Rabin测试并且可能是最主要的。如果您确定n已通过测试,请检查您的答案(请参阅下面的步骤)。如果n个未通过这些测试中的任何一个,则为一个 组成的 数字。
    • 提醒一下,在我们的示例中,a的值为100,s的值为6,d的值为5。我们继续如下所示进行测试:
      • 100 = 1 × 10.
        • 1×10(mod 321)= 64.64 ≠’ 1或-1。保持冷静。
      • 100 = 1 × 10.
        • 1×10(mod 321)= 244.244 1或-1。
      • 至此,我们可以停止了。 s-1 = 6-1 =5。我们现在已经达到4d = 2,并且在5d以下没有2 d的幂。由于我们的计算都没有一个回答1或-1,因此我们可以说n = 321 1 组成的 号是。
  6. 如果 ñ 通过了Miller-Rabin检验,对的其他值重复 一种. 如果发现n的值可能是质数,请使用其他随机值a再次尝试以确认测试结果。如果n实际上是质数,则对于a的任何值都是正确的。如果n是一个复数,它将对a的值的四分之三失败。这比Fermat的小定理更具确定性复数(Carmichael数)通过了a的任何值的测试。

方法4之4:使用中文余数定理

  1. 选择两个数字。 其中一个数字不是素数,第二个数字是正在测试素数的数字。
    • “测试编号1” = 35
    • 测试编号2 = 97
  2. 选择两个分别大于零和小于TestNumber1和TestNumber2的数据点。 它们不能彼此相等。
    • 数据1 = 1
    • 数据2 = 2
  3. 计算测试编号1和测试编号2的MMI(数学乘法逆)
    • 计算MMI
      • MMI1 =测试编号2 ^ -1 Mod测试编号1
      • MMI2 =测试编号1 ^ -1 Mod测试编号2
    • 仅对于质数(非质数会产生结果,但这不是MMI):
      • MMI1 =(测试编号2 ^(测试编号1-2))%测试编号1
      • MMI2 =(测试编号1 ^(测试编号-2))%测试编号2
    • 所以:
      • MMI1 =(97 ^ 33)%35
      • MMI2 =(35 ^ 95)%97
  4. 为每个MMI创建一个二进制表,直到Mod2的Log2
    • 对于MMI1
      • F(1)=测试编号2%测试编号1 = 97%35 = 27
      • F(2)= F(1) * F(1)%测试编号1 = 27 * 27%35 = 29
      • F(4)= F(2) * F(2)%测试编号1 = 29 * 29%35 = 1
      • F(8)= F(4) * F(4)%测试编号1 = 1 * 1%35 = 1
      • F(16)= F(8) * F(8)%测试编号1 = 1 * 1%35 = 1
      • F(32)= F(16) * F(16)%测试编号1 = 1 * 1%35 = 1
    • 计算TestNumber1-2的二进制对数
      • 35 -2 = 33(10001)以2为底
      • MMI1 = F(33)= F(32) * F(1)mod 35
      • MMI1 = F(33)= 1 * 27 Mod 35
      • MMI1 = 27
    • 对于MMI2
      • F(1)=测试编号1%测试编号2 = 35%97 = 35
      • F(2)= F(1) * F(1)%测试编号2 = 35 * 35 mod 97 = 61
      • F(4)= F(2) * F(2)%测试编号2 = 61 * 61 mod 97 = 35
      • F(8)= F(4) * F(4)%测试编号2 = 35 * 35 mod 97 = 61
      • F(16)= F(8) * F(8)%测试编号2 = 61 * 61 mod 97 = 35
      • F(32)= F(16) * F(16)%测试编号2 = 35 * 35 mod 97 = 61
      • F(64)= F(32) * F(32)%测试编号2 = 61 * 61 mod 97 = 35
      • F(128)= F(64) * F(64)%测试编号2 = 35 * 35 mod 97 = 61
    • 计算TestNumber2-2的二进制对数
      • 97-2 = 95 =(1011111)以2为底
      • MMI2 =(((((((F(64) * F(16)%97) * F(8)%97) * F(4)%97)* * F(2)%97) * F (1)%97)
      • MMI2 =(((((((35 * 35)%97) * 61)%97)* 35%97)* 61%97)* 35%97)
      • MMI2 = 61
  5. 计算(Data1 * TestNumber2 * MMI1 + Data2 * TestNumber1 * MMI2)%(TestNumber1 * TestNumber)
    • 答案=(1 * 97 * 27 + 2 * 35 * 61)%(97 * 35)
    • 答案=(2619 + 4270)%3395
    • 答案= 99
  6. 检查“ TestNumber1”不是prime1
    • 计算(答案-数据1)%测试编号1
    • 99 -1 % 35 = 28
    • 由于28大于0,所以35不是素数
  7. 检查TestNumber2是否为素数
    • 计算(答案-数据2)%测试编号2
    • 99 - 2 % 97 = 0
    • 由于0等于0,因此97是潜在质数
  8. 重复步骤1至7至少两次。
    • 如果步骤7等于0:
      • 如果TestNumber1不是素数,请使用其他“ TestNumber1”。
      • 使用另一个TestNumber1,其中TestNumber1实际上是素数。在这种情况下,步骤6和7等于0。
      • 为data1和data2使用不同的数据点。
    • 如果步骤7始终等于0,则数字2为质数的可能性非常高。
    • 当第一个数字不是素数,而第二个是非素数“ Test Number1”的素数时,在某些情况下,已知步骤1至7是不正确的。它适用于所有两个都是素数的情况。
    • 重复执行步骤1至7的原因是,在某些情况下,即使TestNumber1不是素数,而TestNumber2不是素数,步骤7中的任何一个数仍为零。这些情况很少见。通过将TestNumber1更改为另一个非素数,如果TestNumber2不是素数,则在步骤7中,TestNumber2将不再等于零。除了“ TestNumber1”是TestNumber2的因数之外,素数始终为零。第7步。

尖端

  • 1000以下的168个素数是:2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73, 79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199, 211、223、227、229、233、239、241、251、257、263、269、271、277、281、283、293、307、311、313、317、331、337、347、349、353, 359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503, 509、521、523、541、547、557、563、569、571、577、587、593、599、601、607、613、617、619、631、641、643、643、647、653、659、661, 673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839, 853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,991,997
  • 当尝试除法比更复杂的方法慢时,对于较小的数仍然有效。即使测试较大的数字,在切换到更高级的方法之前,先检查较小的数字也是很常见的。

生活必需品

  • 纸,笔,铅笔和/或计算器用于锻炼