ack/lang/a68s/test/prime.8
1988-10-05 13:29:42 +00:00

51 lines
2.1 KiB
Groff

00900 .PR POINT .PR
01000 .BEGIN #PRINT FIRST THOUSAND PRIME NUMBERS#
01010 .INT THOUSAND = 320;
01020 .INT THIRTY = 30; #ACCORDING TO NUMBER THEORY, THE 30TH PRIME > SQRT(THE 1000TH PRIME)#
01030 .LOC [1:THOUSAND] .INT P; # TABLE TO CONTAIN PRIMES #
01040 .BEGIN # FILL TABLE P; P[K] WILL BE THE K'TH PRIME #
01050 P[1] := 2; # THE ONLY EVEN PRIME #
01060 .LOC .INT J := 1; # ODD NUMBER, TO BE INCREMENTED AND TESTED FOR PRIMENESS #
01070 .LOC .INT ORD := 1;
01080 #.INVARIANT P[ORD]**2 > J #
01090 .LOC .INT SQUARE := 4;
01100 #.INVARIANT SQUARE = P[ORD]**2 #
01110 .LOC [1:THIRTY] .INT MULT;
01120 #.INVARIANT MULT[N] IS A MULTIPLE OF P[N] FOR 1<=N<ORD #
01130 .FOR K .FROM 2 .TO THOUSAND
01140 .DO .LOC .BOOL JPRIME;
01150 .WHILE
01160 J:=J+2; .WHILE SQUARE<=J .DO MULT[ORD]:=SQUARE; ORD+:=1; SQUARE:=P[ORD]**2 .OD;
01170 #.ASSERT MULT[ORD] <= J #
01180 JPRIME := .TRUE;
01190 .FOR N .FROM 2 .TO ORD-1 .WHILE JPRIME
01200 .DO # MAKE JPRIME=(P[N] IS NOT A FACTOR OF J) #
01210 .REF .INT MULTN = MULT[N];
01220 .WHILE MULTN<J
01230 .DO MULTN+:=P[N] .OD;
01240 #.ASSERT J <= MULT[N] < J+P[N] #
01250 JPRIME := J/=MULTN
01270 .OD;
01280 .NOT JPRIME
01290 .DO .SKIP .OD;
01300 P[K] := J
01310 .OD
01320 .END;
01330 .BEGIN # PRINT TABLE P ON 5 PAGES, EACH CONTAINING 4 COLUMNS WITH 50 CONSECUTIVE PRIMES #
01340 PRINT(("TABLE OF FIRST ", THOUSAND, " PRIMES", NEWLINE));
01350 .INT COLUMNS = 4, LINES = 50;
01360 .FOR PAGE
01370 .WHILE .INT K = (PAGE-1)*COLUMNS*LINES+1; K<=THOUSAND
01380 .DO # PRINT 1 PAGE #
01390 PRINT (("PAGE ", PAGE, NEWLINE));
01400 .FOR L .FROM K .TO K+LINES-1 .WHILE L<=THOUSAND
01410 .DO # PRINT 1 LINE #
01420 .FOR M .FROM L .BY LINES .TO L+LINES*(COLUMNS-1) .WHILE M<=THOUSAND
01430 .DO PRINT(P[M]) .OD;
01440 PRINT(NEWLINE)
01450 .OD;
01460 PRINT(NEWPAGE)
01470 .OD
01480 .END
01490 .END