-1

我的问题是:如果我使用多行嵌套 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 上做到这一点?

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

4

1 回答 1

2

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

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
      )
    )
  );
}

但是,当我们在这里时,无需添加== 1; if已经在非零值上分支。

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()将与您的原始函数执行相同的操作(除了它现在破坏了您想要的方式)。

于 2020-03-26T14:49:17.757 回答