Fixed the approach with sas generated values. It finished in about one and half minutes total, so I am happy enough with it at this point: options fullstimer macrogen mlogic mprint spool; proc fcmp outlib=work.func.cipher; function isprime(num); n=0; j=3; do while(j<=int(sqrt(num)) and n=0); if mod(num,j)=0 then n+1; j+2; end; if n=0 then return(1); else return(0); endsub; run; %let cmplib=%sysfunc(getoption(cmplib)); options cmplib=(work.func &cmplib); data primes; pnum=1; prime=2; output; do prime=3 to 10**7 by 2; if isprime(prime) then do; output; pnum+1; call symput('max',prime); end; end; call symput('nobs',pnum); keep prime; run; %macro sumprimes(seq1,seq2,seq3,seq4,max,nobs); sasfile work.primes load; %do i=1 %to 4; data _s&&seq&i(sortedby=ptot); obsnum=1; cnt=1; iter=1; ptot=0; do until(obsnum+&&seq&i>&nobs or ptot>&max); set primes point=obsnum; ptot+prime; if cnt=&&seq&i then do; output; iter+1; cnt=1; obsnum=iter; ptot=0; end; else do; obsnum+1; cnt+1; end; end; stop; keep ptot; run; %end; sasfile work.primes close; data _null_; merge %do i=1 %to 4; _s&&seq&i(in=in&i) %end;; by ptot; if in1 and in2 and in3 and in4 and isprime(ptot) then put 'SOLUTION FOUND: ' ptot comma20.; run; %mend; %sumprimes(19,21,405,781,&max,&nobs) options cmplib=(&cmplib);
... View more