如果我使用多行嵌套 for 循环,如何移动到 PARI/GP 中的下一个循环?

how to move to the next loop in PARI/GP if I use multi-line nested for loops?

我的问题是:如果我使用多行嵌套 for 循环,如何移动到 PARI/GP 中的下一个循环?例如:

如果我使用此代码:

for(K=1,10,for(i=1,5,if(isprime(2*i*prime(K)+1)==1,print(2*i"*"prime( K)))))

并且由于 2*(i=1)*prime(K=1)+1=5 是素数,我需要我的机器不要循环 i=2......i=5,我需要它移动到下一个 K,所以:

如何在 PARI/GP 上执行此操作?

如果我的问题不清楚或重复,我很抱歉。

你需要使用中断。但首先,让我们整理一下演示文稿,使其更具可读性:

func()=
{
  for(K=1,10,
    for(i=1,5,
      if(isprime(2*i*prime(K)+1)==1,
        print(2*i"*"prime(K))
      )
    )
  );
}
func()

您想跳出最内层的循环,像这样(只给出函数本身):

func()=
{
  for(K=1,10,
    for(i=1,5,
      if(isprime(2*i*prime(K)+1)==1,
        print(2*i"*"prime(K));
        break
      )
    )
  );
}

但是既然我们在这里,就没有必要添加 == 1if 已经在非零值上分支。

func()=
{
  for(K=1,10,
    for(i=1,5,
      if(isprime(2*i*prime(K)+1),
        print(2*i"*"prime(K));
        break
      )
    )
  );
}

我们还可以存储 prime(K) 的值,这样我们就不需要计算它两次。但更好的是,让我们直接在素数上使用循环,这样我们根本不需要 prime() 函数!

func(maxK=10)=
{
  my(K=0);
  forprime(p=2,prime(maxK),
    K++;
    for(i=1,5,
      if(isprime(2*i*p+1),
        print(2*i"*"p);
        break
      )
    )
  );
}

我在这里更改了函数,因此您可以使用 10 以外的不同最大值调用它,并且我保留了索引以备不时之需。但我认为更好的方法是限制你想直接进入素数的高度,而完全忘记素数索引:

func(maxP=29)=
{
  forprime(p=2,maxP,
    for(i=1,5,
      if(isprime(2*i*p+1),
        print(2*i"*"p);
        break
      )
    )
  );
}

在这两种情况下,我都添加了一个默认参数,因此调用 func() 将执行与您的原始函数相同的操作(除了它现在打破了您想要的方式)。