PARI/GP计数去重问题:如何实现结果仅单次输出?
解决PARI/GP中重复输出计数-数值对的问题
问题根源
原代码存在两个导致重复输出的核心问题:
- 在
t循环过程中,每次s超过27就立即打印,同一个数值n会随着s的递增被多次输出(比如s=28打一次,s=29再打一次) - 嵌套循环可能生成重复的
n值,导致同一计数-数值对被重复打印
修改后的代码
// 初始化集合存储已输出的数值,避免重复 seen = Set(); for(a=12170,12170, for(p=67, 100, for(b=0,3, for(c=1,3, for(d=0,2, for(f=0,2, for(g=0,2, for(h=0,2, for(j=0,2, for(k=0,2, for(l=0,2, for(q=0,2, n = 3^b*5^c*11^d*13^f*19^g*29^h*37^j*53^k*59^l*61^q*p; if(n < 2^64, s=0; // 完成所有t的计数 for(t=1,100, if(ispseudoprime((2*a-1)*2^t + n), s++); ); // 仅在计数完成后,且该数值未输出过才打印 if(s>27 && !setsearch(seen, n), print(s,",",n); setinsert(seen, n); ); ); ); ); ); ); ); ); ); ); ); ); ); );
关键修改说明
- 提取重复计算的数值
n:将原本多次计算的乘积赋值给变量n,既提升运行效率也避免潜在计算误差 - 延迟打印时机:等
t循环完成所有计数后,再判断s>27的条件,确保每个n只输出最终的计数结果 - 添加去重集合:用
Set类型的seen记录已输出的n,通过setsearch检查是否已存在,彻底避免重复输出同一数值对
内容的提问来源于stack exchange,提问作者Aurel-BG
相关产品推荐
相关产品推荐

