Algorithm 利用6k+改进试验分割素性检验/-1规则

Algorithm 利用6k+改进试验分割素性检验/-1规则,algorithm,primes,primality-test,Algorithm,Primes,Primality Test,我正在学习试用区首要性测试的基础知识,并因此在代码中实现它。可以使用以下许多技巧来提高算法的性能: 1) 仅在平方根(n)以内运行试除法 2) 通过创建一个最大平方根(n)的筛子,然后仅对所创建筛子中的素数运行试除法,以内存换取时间 但是,如果发现n%6(n mod 6)的值为1或5(使用6k+/-1规则),我没有发现将结果返回为复合结果的想法。在我们的素数确定测试中使用这个规则不会提高它的性能吗?如果是,为什么没有在任何地方提到?若否,原因为何 谢谢。看来你属于初级水平以上的人(那些永远不会想

我正在学习试用区首要性测试的基础知识,并因此在代码中实现它。可以使用以下许多技巧来提高算法的性能:

1) 仅在平方根(n)以内运行试除法

2) 通过创建一个最大平方根(n)的筛子,然后仅对所创建筛子中的素数运行试除法,以内存换取时间

但是,如果发现
n%6
(n mod 6)的值为
1或5
(使用6k+/-1规则),我没有发现将结果返回为复合结果的想法。在我们的素数确定测试中使用这个规则不会提高它的性能吗?如果是,为什么没有在任何地方提到?若否,原因为何


谢谢。

看来你属于初级水平以上的人(那些永远不会想出主意的人)和追求卓越表现的人。因此,对于初学者来说,这个想法有点难以解释,对于非常高级的人来说,这个想法似乎微不足道

它可以将运行时间减少三分之一,或者让您同时测试50%以上的数字。如果除数不太大,你可以做更少的测试来节省更多的钱:假设你测试了一个十亿左右的数字。有一个循环,除数为d=6k-1,需要测试d和d+2=6k+1。所以你只测试d^2≤ p、 你不需要测试(d+2)^2≤ P最坏的情况是,你测试的除数比你需要的多。最好的情况是,您可以保存几千个(d+2)^2的测试≤ p


通过观察只有可能的素数≥ 30是30k+1,7,11,13,17,19,23,29,避免30k+5和30k+25

你似乎属于初级水平以上的人(那些永远不会想出主意的人)和追求卓越表现的人。因此,对于初学者来说,这个想法有点难以解释,对于非常高级的人来说,这个想法似乎微不足道

它可以将运行时间减少三分之一,或者让您同时测试50%以上的数字。如果除数不太大,你可以做更少的测试来节省更多的钱:假设你测试了一个十亿左右的数字。有一个循环,除数为d=6k-1,需要测试d和d+2=6k+1。所以你只测试d^2≤ p、 你不需要测试(d+2)^2≤ P最坏的情况是,你测试的除数比你需要的多。最好的情况是,您可以保存几千个(d+2)^2的测试≤ p


通过观察只有可能的素数≥ 30是30k+1,7,11,13,17,19,23,29,避免30k+5和30k+25

您对测试
n%6
的想法完全等同于测试
n%2
n%3
——因此,如果您将后者作为普通试验部门的一部分,则执行前者是多余的


(在考虑了2和3之后)一个与之密切相关的想法是只考虑形式为
6k+1
6k-1
,的试算因子,正如@gnasher729在其出色的回答中所解释的那样。

您测试
n%6
的想法完全等同于测试
n%2
n%3
——因此,如果您将后者作为普通试验部门的一部分,那么做前者是多余的


(在考虑了2和3之后)一个密切相关的想法是,只考虑形式为
6k+1
6k-1
,正如@gnasher729在他们出色的回答中所解释的那样。这个技巧的工作方式是:将M的乘积变成一堆小素数。然后,当测试一个数字N时,如果(N%M)为0或者有一个与M相同的因子,您可以立即说N是复合的

你用了6,2和3的乘积。在可能的模0,1,2,3,4,5中,只有1和5没有2或3的因子

关于6没有什么特别的,尽管你可以对任何模量做同样的处理,尽管你想让它成为一个小素数的乘积,以最大化复合模量的密度


请注意,在进行此检查后(如gnasher所示),您只需测试与M没有共同因子的试用除数。

此技巧的工作方式:将M的乘积表示为一组小素数。然后,当测试一个数字N时,如果(N%M)为0或者有一个与M相同的因子,您可以立即说N是复合的

你用了6,2和3的乘积。在可能的模0,1,2,3,4,5中,只有1和5没有2或3的因子

关于6没有什么特别的,尽管你可以对任何模量做同样的处理,尽管你想让它成为一个小素数的乘积,以最大化复合模量的密度


请注意,在进行此检查后(如gnasher所示),您只需要测试与M没有共同因子的试用除数。

这里调用的是通用方法。最简单的轮子是专门处理2个,然后只测试奇数:2个轮子。下一个最简单的是2,3轮,你在问题中提到过@gnasher729给出了上述2,3,5轮的编号

从5开始,交替添加2和4,可以生成2,3轮的数字

伪代码:

boolean isPrime(num)

  // Deal with factor 2.
  if (num MOD 2 = 0) then
    return (num = 2)
  endif

  // Deal with factor 3.      
  if (num MOD 3 = 0) then
    return (num = 3)
  endif

  // Factors >= 5.
  limit <-- 1 + sqrt(num)
  trialFactor <-- 5
  step <-- 2
  while (trialFactor < limit) do
    if (num MOD trialFactor = 0)
      // Number not prime
      return false
    endif
    trialFactor <-- trialFactor + step
    step <-- 6 - step
  endwhile

  // Number is prime here.
  return true

end
boolean isPrime(num)
//处理因素2。
如果(num MOD 2=0),则
返回(num=2)
恩迪夫
//处理因素3。
如果(num MOD 3=0),则
返回(num=3)
恩迪夫
//系数>=5。

极限这里调用的是一般方法。最简单的轮子是专门处理2个,然后只测试奇数:2个轮子。下一个最简单的是2,3轮,你在问题中提到过@gnasher729给出了上述2,3,5轮的编号

从5开始,交替添加2和4,可以生成2,3轮的数字

伪代码:

boolean isPrime(num)

  // Deal with factor 2.
  if (num MOD 2 = 0) then
    return (num = 2)
  endif

  // Deal with factor 3.      
  if (num MOD 3 = 0) then
    return (num = 3)
  endif

  // Factors >= 5.
  limit <-- 1 + sqrt(num)
  trialFactor <-- 5
  step <-- 2
  while (trialFactor < limit) do
    if (num MOD trialFactor = 0)
      // Number not prime
      return false
    endif
    trialFactor <-- trialFactor + step
    step <-- 6 - step
  endwhile

  // Number is prime here.
  return true

end
boolean isPrime(num)
//处理因素2。
如果(num MOD 2=0),则
返回