线性筛分算法
Linear sieving algorithm
是否有一个简单的 pari/gp 程序可以筛选 k*n+c 形式的数字(其中 n 和 c 固定)直到某个素数 p 并且 k 被限制在某个范围内(a.k.a.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 整除。然后测试下一个素数等等。这样做直到达到筛子的极限
return,或打印候选人名单。
感谢您的帮助!
你提供的伪代码似乎是合理的。与其从列表中删除,不如直接复制它更容易、更有效。使用函数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])
我还在循环中添加了一个检查以在列表变空时退出循环。在我尝试过的情况下,这似乎会发生。
是否有一个简单的 pari/gp 程序可以筛选 k*n+c 形式的数字(其中 n 和 c 固定)直到某个素数 p 并且 k 被限制在某个范围内(a.k.a.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 整除。然后测试下一个素数等等。这样做直到达到筛子的极限 return,或打印候选人名单。 感谢您的帮助!
你提供的伪代码似乎是合理的。与其从列表中删除,不如直接复制它更容易、更有效。使用函数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])
我还在循环中添加了一个检查以在列表变空时退出循环。在我尝试过的情况下,这似乎会发生。