GPSPRIMES|
 begin
 comment library A1, A4, A5, A15;

 comment after Knuth and Merner, CACM June 1961;

 integer  procedure GPS(j, n, z, v);  integer j, n, z, v;
    begin
    for j := 1  step 1  until n  do z := v;
    GPS := 1
    end;

 integer  procedure rem(n, d);  value n, d;  integer n, d;
    rem := n - d × (n ÷ d);

 boolean  procedure is special(n, r);  value n, r;  integer n, r;
    is special := rem(n, 10) = r  and n ÷ 10  ± 1;

 integer j, a, m, p, z;

open(10);

 for m := 1  step 1  until 30 ×
   GPS
      (
       j,
        if j = 0  then -1  else j,
       p,
        if j = 1  then  1
                   else
                       if GPS
                              (
                               a,
                               j,
                               z,
                                if a = 1  then 1
                                           else ( if rem(j, a) = 0  and a < j  then 0  else z)
                              ) = z
                       then  ( if p < m  then p + 1  else j × GPS(a, 1, j, -1))
                       else  p
      )
 do
    begin
   writetext(10, [The [s_]]);
   write(10, format([nddd_]), m);
    if is special(m) in having units digit:(1)  then writetext(10, [st *])  else
    if is special(m) in having units digit:(2)  then writetext(10, [nd *])  else
    if is special(m) in having units digit:(3)  then writetext(10, [rd *])  else
                                                       writetext(10, [th * ]);
   writetext(10, [prime * is * ]);
   write(10, format([ndddc_]), p);
    end;

close(10)

end
|