grisНо я бы, пожалуй, не советовал так делать.
И я тоже, настоятельно.
Экономия трёх символов (
if(,) за вычетом
&&) потом обязательно выльется вам (или не вам!) в дополнительные трудности с пониманием и редактированием. Эмпирические правила оформления кода придумали не просто так. А на скорость выполнения кода такая экономия если и влияет, то совсем не сильно, тем более в не столь простых программах.
Вообще же PARI позволяет делать странные (но удобные) вещи, например мне буквально вчера понадобилась такая конструкция:
while(aa=precprime(a-1); bb=nextprime(b+1); aa+bb==dd , a=aa; b=bb)Т.е. вместо простого условия сначала делается предварительная работа, а условие проверяется лишь от последнего оператора (сравнения). Потому что результат предыдущих операторов в условии не нужен и подавляется символом ";". И такая замена одиночного оператора на целый список операторов допустима вообще везде, например можно в
print(p,a) сделать что-то вроде
print(b=p*2+a;c=b\3;d=2^(b+a%c);p+d,a) и напечатано будет два значения,
p+d и
a.
Это кстати очень похоже на объявление функции: там тоже куча предварительных действий, а в качестве результата возвращается значение последнего вычисленного оператора (если нет явного
return).
(Оффтоп)
но иногда хочется получить что-то побыстрее.
с консолью беда
вот я в окошке получил
(09:47) gp > forprimes( p=7,60,p%7==2&&print(p))
23
37
79
(09:47) gp >
Куда торопитесь? Тут сразу две опечатки: и "s" в forprimes лишняя (т.е. такой код вообще не заработает), и 79>60 не получите.
Кстати есть команда
forprimestep(p=7+2,60,7,print(p)), выдающая ровно тот же результат, правда вероятно медленнее.
Ради интереса проверил скорость разных вариантов (по первому и трём последним делать не стоит):
Код:
? n=0; forprime(p=7,10^9, p%7==2&&n++); n
time = 7,458 ms.
8474795
? n=0; forprime(p=7,10^9, if(p%7==2, n++)); n
time = 7,472 ms.
8474795
? n=0; forprimestep(p=7+2,10^9,7, n++); n
time = 13,870 ms.
8474795
? n=0; forstep(p=7+2,10^9,7, ispseudoprime(p)&&n++); n
time = 23,729 ms.
8474795
? n=0; forstep(p=7+2,10^9,7, n+=ispseudoprime(p)); n
time = 39,906 ms.
8474795
? sum(i=1,10^9\7, ispseudoprime(7*i+2))
time = 28,127 ms.
8474795
Как видно замена if на && вообще не влияет, а forprimestep вдвое медленнее.