Erdős-primes: Difference between revisions
Content added Content deleted
(→{{header|ALGOL 68}}: Added the Stretch goal) |
(Added PL/M) |
||
Line 1,182: | Line 1,182: | ||
2411 |
2411 |
||
2437 |
2437 |
||
</pre> |
|||
=={{header|PL/M}}== |
|||
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator) |
|||
Basic task only as PL/M integers are 8/16 bit unsigned. |
|||
<syntaxhighlight lang="plm"> |
|||
100H: /* FIND ERDOS PRIMES: PRIMES P WHERE P-K! IS COMPOSITE FOR ALL 1<=K!<P */ |
|||
/* CP/M SYSTEM CALL AND I/O ROUTINES */ |
|||
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END; |
|||
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END; |
|||
PR$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END; |
|||
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END; |
|||
PR$NUMBER: PROCEDURE( N ); /* PRINTS A NUMBER IN THE MINIMUN FIELD WIDTH */ |
|||
DECLARE N ADDRESS; |
|||
DECLARE V ADDRESS, N$STR ( 6 )BYTE, W BYTE; |
|||
V = N; |
|||
W = LAST( N$STR ); |
|||
N$STR( W ) = '$'; |
|||
N$STR( W := W - 1 ) = '0' + ( V MOD 10 ); |
|||
DO WHILE( ( V := V / 10 ) > 0 ); |
|||
N$STR( W := W - 1 ) = '0' + ( V MOD 10 ); |
|||
END; |
|||
CALL PR$STRING( .N$STR( W ) ); |
|||
END PR$NUMBER; |
|||
/* TASK */ |
|||
DECLARE MAX$NUMBER LITERALLY '2500' |
|||
, FALSE LITERALLY '0' |
|||
, TRUE LITERALLY '0FFH' |
|||
; |
|||
DECLARE PRIME ( MAX$NUMBER )BYTE; /* SIEVE THE PRIMES TO MAX$NUMBER - 1 */ |
|||
DECLARE I ADDRESS; |
|||
PRIME( 0 ), PRIME( 1 ) = FALSE; |
|||
PRIME( 2 ) = TRUE; |
|||
DO I = 3 TO LAST( PRIME ) BY 2; PRIME( I ) = TRUE; END; |
|||
DO I = 4 TO LAST( PRIME ) BY 2; PRIME( I ) = FALSE; END; |
|||
DO I = 3 TO LAST( PRIME ) BY 2; |
|||
IF PRIME( I ) THEN DO; |
|||
DECLARE S ADDRESS; |
|||
DO S = I + I TO LAST( PRIME ) BY I; |
|||
PRIME( S ) = FALSE; |
|||
END; |
|||
END; |
|||
END; |
|||
/* TABLE OF FACTORIALS */ |
|||
DECLARE FACTORIAL ( 8 )ADDRESS INITIAL( 1, 1, 2, 6, 24, 120, 720, 5040 ); |
|||
/* RETURNS TRUE IF P IS AN ERDOS PRIME, FALSE OTHERWISE */ |
|||
IS$ERDOS$PRIME: PROCEDURE( P )BYTE; |
|||
DECLARE P ADDRESS; |
|||
DECLARE RESULT BYTE; |
|||
RESULT = PRIME( P ); |
|||
IF RESULT THEN DO; |
|||
DECLARE K BYTE; |
|||
K = 1; |
|||
DO WHILE FACTORIAL( K ) < P AND RESULT; |
|||
RESULT = NOT PRIME( P - FACTORIAL( K ) ); |
|||
K = K + 1; |
|||
END; |
|||
END; |
|||
RETURN RESULT; |
|||
END IS$ERDOS$PRIME ; |
|||
/* FIND THE ERDOS PRIMES */ |
|||
DECLARE ( P, COUNT ) ADDRESS; |
|||
COUNT = 0; |
|||
IF IS$ERDOS$PRIME( 2 ) THEN DO; |
|||
COUNT = COUNT + 1; |
|||
CALL PR$STRING( .' 2$' ); |
|||
END; |
|||
P = 1; |
|||
DO WHILE COUNT < 25; |
|||
P = P + 2; |
|||
IF IS$ERDOSPRIME( P ) THEN DO; |
|||
COUNT = COUNT + 1; |
|||
CALL PR$CHAR( ' ' ); |
|||
CALL PR$NUMBER( P ); |
|||
IF COUNT MOD 5 = 0 THEN CALL PR$NL; |
|||
END; |
|||
END; |
|||
EOF |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
2 101 211 367 409 |
|||
419 461 557 673 709 |
|||
769 937 967 1009 1201 |
|||
1259 1709 1831 1889 2141 |
|||
2221 2309 2351 2411 2437 |
|||
</pre> |
</pre> |
||