线性筛分算法

时间:2019-07-12 22:42:11

标签: sieve pari

是否有一个简单的pari / gp程序,该程序可以筛选形式为k * n + c(其中n和c固定)的数字,直到某个素数p和k被限制在某个范围内(又名for(k = 1,10000,)?

伪代码:

n = (some number);
c = (some number);
T=[all k values];
forprime(p=2,100000000, for(i=1,#List if((T[i]*n+c)%p==0, (remove the number T[i] from the list)

换句话说,从整数T的列表开始 测试素数范围p中的第一个素数,并从列表T中删除整数k,以使k * n + c可被p整除。然后测试下一个素数,依此类推。这样做直到达到筛分的极限 返回或打印候选人列表。 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您提供的伪代码似乎是合理的。与其从列表中删除,不如直接复制它,可能会更容易且有效。使用函数select保留应保留而不是删除的那些元素。

一些实际代码:

sieve(n,c,plimit,L)={forprime(p=2, plimit, L=select(t->(t*n+c)%p, L); if(!#L, break)); L}
sieve(8, 3, 70000, [1..10000])

我还在循环中添加了一个检查,如果列表为空,则退出循环。在我尝试过的情况下,这似乎发生了。