как перейти к следующему l oop в PARI / GP, если я использую многострочный вложенный цикл? - PullRequest
0 голосов

мой вопрос: как перейти к следующему l oop в PARI / GP, если я использую многострочную вложенность для циклов? например:

если я использую этот код:

для (K = 1,10, для (i = 1,5, если (isprime (2 * i * prime (K) +) 1) == 1, выведите (2 * i "*" простое число (K)))))

и, поскольку 2 * (i = 1) * простое число (K = 1) + 1 = 5 простое число Мне нужна моя машина, чтобы не l oop для i = 2 ...... i = 5, мне нужно, чтобы она перешла к следующему K, поэтому:

как это сделать на PARI / GP?

и мне жаль, если мой вопрос не ясен или не продублирован.

1 Ответ

0 голосов
/ 26 марта 2020

Вам нужно использовать перерыв. Но сначала давайте очистим презентацию, чтобы она была более читабельной:

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

Вы хотите вырваться из внутреннего l oop, вот так (просто предоставив саму функцию):

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

Мы также можем хранить значение простого числа (K), поэтому нам не нужно вычислять его дважды. Но еще лучше, давайте использовать al oop непосредственно над простыми числами, чтобы нам вообще не нужна функция 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, и я сохранил индекс на случай, если вы захотите его по какой-то причине. Но я думаю, что лучшим подходом было бы дать оценку того, как высоко вы хотите go в простых числах, и полностью забыть о простых индексах:

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

В обоих случаях я добавил значение по умолчанию аргумент, вызывающий func(), будет делать то же самое, что и ваша исходная функция (за исключением того, что теперь он ломается так, как вы хотите).

...