在 PARI GP 中计数时删除重复项

问题描述 投票:0回答:1

我在 PARI GP 上遇到问题:当我尝试计算某些值时,我有一些重复的值,例如使用以下代码:

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, 
if(((3^b*5^c*11^d*13^f*19^g*29^h*37^j*53^k*59^l*61^q*p) < 2^64), s=0; for(t=1, 100, 
if(ispseudoprime(((2*a-1)*2^(t)+3^b*5^c*11^d*13^f*19^g*29^h*37^j*53^k*59^l*61^q*p)), 
s++, if(s>27, 
print(s,",",3^b*5^c*11^d*13^f*19^g*29^h*37^j*53^k*59^l*61^q*p))))))))))))))))); s

印刷是:

28,1150342765
29,1150342765
29,1150342765
28,46059899786615
28,46059899786615
28,46059899786615
28,46059899786615
28,46059899786615
28,46059899786615
28,46059899786615
28,46059899786615
28,368149925
28,368149925
28,368149925
28,368149925
28,368149925
29,368149925
28,170449675
28,170449675
28,170449675
28,170449675

我只想要这个:

29,1150342765
28,46059899786615
28,170449675

我尝试改变s++和s=0;在代码中,但我没有打印任何内容,或者这些重复的内容。

可以只打印一次吗?

algorithm number-theory pari pari-gp
1个回答
0
投票

首先,可以通过使用

forvec
重构内部循环来改进你的代码。它将大大增加其可读性。

其次,您可以将结果保存在

Set
数据结构中以避免重复。您可以在下面找到重构后的代码:

param_space = {[
  [12170, 12170], \\ a
  [67, 100], \\ p
  [0, 3], \\ b
  [1, 3], \\ c
  [0, 2], \\ d
  [0, 2], \\ f
  [0, 2], \\ g
  [0, 2], \\ h
  [0, 2], \\ j
  [0, 2], \\ k
  [0, 2], \\ l
  [0, 2] \\ q
]};

results = Set()
forvec(params = param_space, {
  [a, p, b, c, d, f, g, h, j, k, l, q] = params;
  target = 3^b*5^c*11^d*13^f*19^g*29^h*37^j*53^k*59^l*61^q*p;
  if(target < 2^64,
    s = 0;
    for(t = 1, 100,
      if(ispseudoprime(((2*a-1)*2^(t)+target)),
         s++,
         if(s > 27,
           my(len = #results);
           results = setunion(results, [target]);
           if(#results > len, print(s, ",", target))
         )
      )
    )
  )
});
© www.soinside.com 2019 - 2024. All rights reserved.