(* Compute a table of the first n prime numbers.
  Print m numbers per line. *)

MODULE primes;

FROM InOut IMPORT WriteLn, WriteCard;

CONST N = 500;
     M = 23;  (* M ~ sqrt(N) *)
     LL = 10; (* # of primes placed on a line *)

VAR i,k,x: CARDINAL;
   inc,lim,square,L: CARDINAL;
   prime: BOOLEAN;
   P,V: ARRAY [0..M] OF CARDINAL;

BEGIN
 L := 0; x := 1; inc := 4;
 lim := 1; square := 9;
 FOR i := 3 TO N DO
   (* find next prime number p[i] *)
   REPEAT
     x := x+inc;
     inc := 6-inc;
     IF square <= x THEN
       INC(lim); V[lim] := square;
       square := P[lim+1] * P[lim+1]
     END;
     k := 2; prime := TRUE;
     WHILE prime & (k < lim) DO
       INC(k);
       IF V[k] < x THEN V[k] := V[k] + 2*P[k] END;
       prime := x # V[k]
     END
   UNTIL prime;
   IF i <= M THEN P[i] := x END;
   WriteCard(x,6); INC(L);
   IF L = LL THEN WriteLn; L := 0 END
 END
END primes.