67 lines
1.6 KiB
Plaintext
67 lines
1.6 KiB
Plaintext
100H:
|
|
BDOS: PROCEDURE (F,A); DECLARE F BYTE, A ADDRESS; GO TO 5; END BDOS;
|
|
EXIT: PROCEDURE; GO TO 0; END EXIT;
|
|
PRINT: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT;
|
|
|
|
PRINT$NUM: PROCEDURE (N);
|
|
DECLARE (N, P) ADDRESS, CH BASED P BYTE;
|
|
DECLARE S (6) BYTE INITIAL ('.....$');
|
|
P = .S(5);
|
|
DIGIT:
|
|
P = P-1;
|
|
CH = '0' + N MOD 10;
|
|
IF (N := N/10) > 0 THEN GO TO DIGIT;
|
|
CALL PRINT(P);
|
|
END PRINT$NUM;
|
|
|
|
TOTIENT: PROCEDURE (N) ADDRESS;
|
|
DECLARE (TOT, N, I) ADDRESS;
|
|
TOT = N;
|
|
I = 2;
|
|
DO WHILE I*I <= N;
|
|
IF N MOD I = 0 THEN DO;
|
|
DO WHILE (N := N / I) MOD I = 0; END;
|
|
TOT = TOT - TOT / I;
|
|
END;
|
|
IF I=2 THEN I=1;
|
|
I = I+2;
|
|
END;
|
|
IF N > 1 THEN TOT = TOT - TOT / N;
|
|
RETURN TOT;
|
|
END TOTIENT;
|
|
|
|
SHOW$PRIME$COUNT: PROCEDURE (N, COUNT);
|
|
DECLARE (N, COUNT) ADDRESS;
|
|
CALL PRINT(.'THERE ARE $');
|
|
CALL PRINT$NUM(COUNT);
|
|
CALL PRINT(.' PRIMES UP TO $');
|
|
CALL PRINT$NUM(N);
|
|
CALL PRINT(.(13,10,'$'));
|
|
END SHOW$PRIME$COUNT;
|
|
|
|
DECLARE (N, TOT) ADDRESS;
|
|
DECLARE PRIME$COUNT ADDRESS INITIAL (0);
|
|
|
|
DO N = 1 TO 25;
|
|
CALL PRINT(.'PHI($');
|
|
CALL PRINT$NUM(N);
|
|
CALL PRINT(.') = $');
|
|
CALL PRINT$NUM(TOT := TOTIENT(N));
|
|
IF TOT = N-1 THEN DO;
|
|
CALL PRINT(.'; PRIME$');
|
|
PRIME$COUNT = PRIME$COUNT + 1;
|
|
END;
|
|
CALL PRINT(.(13,10,'$'));
|
|
END;
|
|
|
|
CALL SHOW$PRIME$COUNT(25, PRIME$COUNT);
|
|
DO N = 26 TO 10000;
|
|
IF TOTIENT(N) = N-1 THEN
|
|
PRIME$COUNT = PRIME$COUNT + 1;
|
|
IF N=100 OR N=1000 OR N=10000 THEN
|
|
CALL SHOW$PRIME$COUNT(N, PRIME$COUNT);
|
|
END;
|
|
|
|
CALL EXIT;
|
|
EOF
|