Totient function: Difference between revisions
Content added Content deleted
Not a robot (talk | contribs) m (→={{header|Miranda}}+: typo) |
Not a robot (talk | contribs) (Add PL/M) |
||
Line 4,127: | Line 4,127: | ||
Number of primes up to 100000 = 9592 |
Number of primes up to 100000 = 9592 |
||
</pre> |
</pre> |
||
=={{header|PL/M}}== |
|||
{{trans|C}} |
|||
<syntaxhighlight lang="plm">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</syntaxhighlight> |
|||
{{out}} |
|||
<pre>PHI(1) = 1 |
|||
PHI(2) = 1; PRIME |
|||
PHI(3) = 2; PRIME |
|||
PHI(4) = 2 |
|||
PHI(5) = 4; PRIME |
|||
PHI(6) = 2 |
|||
PHI(7) = 6; PRIME |
|||
PHI(8) = 4 |
|||
PHI(9) = 6 |
|||
PHI(10) = 4 |
|||
PHI(11) = 10; PRIME |
|||
PHI(12) = 4 |
|||
PHI(13) = 12; PRIME |
|||
PHI(14) = 6 |
|||
PHI(15) = 8 |
|||
PHI(16) = 8 |
|||
PHI(17) = 16; PRIME |
|||
PHI(18) = 6 |
|||
PHI(19) = 18; PRIME |
|||
PHI(20) = 8 |
|||
PHI(21) = 12 |
|||
PHI(22) = 10 |
|||
PHI(23) = 22; PRIME |
|||
PHI(24) = 8 |
|||
PHI(25) = 20 |
|||
THERE ARE 9 PRIMES UP TO 25 |
|||
THERE ARE 25 PRIMES UP TO 100 |
|||
THERE ARE 168 PRIMES UP TO 1000 |
|||
THERE ARE 1229 PRIMES UP TO 10000</pre> |
|||
=={{header|PicoLisp}}== |
=={{header|PicoLisp}}== |