51 lines
2.1 KiB
Groff
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
|