Online File
Rick Aster: Professional SAS Programming Shortcuts: Contents
%LET TOTAL = 2000; * Limits the number of prime numbers generated ;
%LET DIM = 1000; * The size of the sieve arrays used ;
%LET TIME = 30; * Time limit in seconds ;
DATA _NULL_;
ARRAY P{&DIM} _TEMPORARY_; * Prime numbers;
ARRAY M{&DIM} _TEMPORARY_; * Multiples of prime numbers;
TIMEOUT = DATETIME() + &TIME; * Time limit;
FILE PRINT NOTITLES;
SQUARE = 4;
DO X = 2 TO CONSTANT('EXACTINT'); * Is X prime? ;
IF DATETIME() >= TIMEOUT THEN STOP; * Time limit reached ;
IF X = SQUARE THEN DO; * Extend sieve;
IMAX + 1;
IF IMAX >= &DIM THEN STOP; * Sieve size limit reached. ;
SQUARE = M{IMAX + 1};
CONTINUE;
END;
* Find least prime factor (LPF). ;
LPF = 0;
DO I = 1 TO IMAX UNTIL (LPF);
DO WHILE (M{I} < X); * Update sieve with new multiple. ;
M{I} + P{I};
END;
IF M{I} = X THEN LPF = P{I};
END;
IF LPF THEN CONTINUE; * Composite number found. ;
PUT X @; * Write prime number in output. ;
N + 1;
IF N >= &TOTAL THEN STOP; * Output maximum reached. ;
ELSE IF N <= &DIM THEN DO; * Add prime number to sieve. ;
P{N} = X;
M{N} = X*X;
END;
END;
STOP;
RUN;