[ Back to the overview Matrix ]

Test case : Prime Numbers using Algol 68

Lines used: 30
BEGIN MODE MEMO = STRUCT (PROC (INT) BOOL f, INT limit, number, REF [] INT a);
      OP NEXT = (REF MEMO m) VOID:
	   ( INT i := limit OF m + 1;
	     WHILE NOT (f OF m)(i) DO i +:= 1 OD;
	     IF number OF m = UPB a OF m
	       THEN HEAP [2 * number OF m] INT b;
		    b [:number OF m] := a OF m;
		    a OF m := b
	     FI;
	     (a OF m)[number OF m +:= 1] := limit OF m := i );
      PROC nextafter = (INT i, REF MEMO m) INT:
	( WHILE limit OF m <= i DO NEXT m OD;
	  INT lo := 1, hi := number OF m, c;
	  WHILE hi > lo + 1
	     DO c := (hi + lo)%2; ((a OF m)[c] > i | hi | lo) := c OD;
	  (a OF m)[hi]);
      OP INIT = (PROC (INT) BOOL f) MEMO:
	((f, 0, 0, HEAP [1] INT := (0)));

      PROC isprime = (INT i) BOOL:
	 CASE i IN FALSE, TRUE # special cases for 1,2 #
	   OUT (i MOD 2 = 0 OR i < 0 | FALSE # dispose of even/neg numbers #
		 | FOR j FROM 3 BY 2 WHILE j*j <= i
		     DO ( i MOD j = 0 | GOTO out # Bleeagh! # ) OD;
		   TRUE EXIT
	     out:  FALSE)
	 ESAC;

      MEMO primes := INIT isprime;
      INT i := 0;
      TO 1000 DO print (i := nextafter (i, primes)) OD
END
Contributed by andrew.walker at nottingham.ac.uk