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