hermann on Tue, 10 Feb 2026 08:58:22 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Is short-circuit evaluation possible with parfor() ?


On 2026-02-10 07:23, Ruud H.G. van Tol wrote:
On 2026-02-10 00:45, hermann@stamm-wilbrandt.de wrote:
Two months ago I got my first sequence approved on oeis.org:
"Numbers k such that no numbers of the form 1 + (product of k distinct primes of first k+1 primes) are prime."
https://oeis.org/A391020

The Pari code I provided uses forsubset (although not needed) which cannot be parallelized, and vecprod of primes instead of Pari primorial operator.

Now I have a parallel isok2() version which works superfast:

hermann@x3950-X6:~$ gp -q
? default(nbthreads)
192
? isok2(n) = {s=0;p=prime(n+1)#;export(s,p);parfor(i=2,n+1,ispseudoprime(1+p/prime(i)),r,s+=r);s==0};
? isok2(1993)
1
? ##
  ***   last result: cpu time 1h, 24min, 36,945 ms, real time 28,186 ms.
? isok2(1994)
0
? ##
  ***   last result: cpu time 1h, 25min, 5,259 ms, real time 28,404 ms.
?

So for numbers of A391020 the complete loop has to be executed in order to conform no prime exists. But for 1994 which does not belong to A391020 computation should be aborted on first prime detection. Is short-circuit evaluation like available for boolean expressions in eg. C++ possible for parfor() somehow?

See also the docs of parfor:
It  is  allowed  for expr2 to exit the loop using break/next/return.


isok3(n)= {
  my( s=0, p=prime(n+1)# );
  parfor
  ( i=2
  , n+1
  , ispseudoprime(1+p/prime(i))
  , r
  , (s+=r) && break
  );
  !s;
}

Thanks, but break did not help:

hermann@x3950-X6:~$ gp -q
? isok2(n)={s=0;p=prime(n+1)#;export(s,p);parfor(i=2,n+1,ispseudoprime(1+p/prime(i)),r,if(r,s=1;break));s==0};
? isok2(1994)
0
? ##
  ***   last result: cpu time 1h, 21min, 39,829 ms, real time 26,349 ms.
? isok2(1993)
1
? ##
  ***   last result: cpu time 1h, 24min, 46,507 ms, real time 28,423 ms.
?


So I looked in the doc and there it states that return should abort, but I cannot measure that:

? isok2(n)={p=prime(n+1)#;export(p);parfor(i=2,n+1,ispseudoprime(1+p/prime(i)),r,if(r,return(0)));1};
? isok2(1994)
0
? ##
  ***   last result: cpu time 1h, 21min, 49,788 ms, real time 27,072 ms.
?


I do the same  if(r,return(...)) as in the doc, what am I missing?


Regards,

Hermann.