Primality by Wilson's theorem: Difference between revisions

Added Polyglot:PL/I and PL/M
(Add CLU)
(Added Polyglot:PL/I and PL/M)
Line 1,328:
 
=={{header|PL/M}}==
Works{{works with the original |8080 PL/M compilerCompiler}} andunder CP/M (or an emulator)}}
<lang pli>100H: /* FIND PRIMES USING WILSON'S THEOREM: */
/* P IS PRIME IF ( ( P - 1 )! + 1 ) MOD P = 0 */
Line 1,378:
 
EOF</lang>
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
</pre>
 
See also [[#Polyglot:PL/I and PL/M]]
 
=={{header|Polyglot:PL/I and PL/M}}==
The following Primality by Wilson's theorem solution will run under both PL/M and PL/I.
{{works with|8080 PL/M Compiler}} under CP/M (or an emulator)
Should work with many PL/I implementations.
<lang pli>/* PRIMALITY BY WILSON'S THEOREM */
wilson_100H: procedure options (main);
declare eof binary;
/* CP/M BDOS SYSTEM CALL AND CONSOLE OUTPUT ROUTINES, ETC. */ /*
DECLARE BINARY LITERALLY 'ADDRESS', CHARACTER LITERALLY 'BYTE';
DECLARE PUT LITERALLY '/*', RETURNS LITERALLY ' ';
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END /* */;
PRCHAR: PROCEDURE( C ); DECLARE C CHARACTER; PUT edit(c)(a(1)) /* */ /*
CALL BDOS( 2, C ) /* */;
END PRCHAR;
PRNUMBER: PROCEDURE( N ); DECLARE N BINARY; /* */
if n < 10 then put edit(n)(f(1)); /* */
else if n < 100 then put edit(n)(f(2)); /* */
else if n < 1000 then put edit(n)(f(3)); /* */
else put edit(n)(f(6)); /*
*//*
DECLARE V ADDRESS, N$STR( 6 ) BYTE, W BYTE;
N$STR( W := LAST( N$STR ) ) = '$';
N$STR( W := W - 1 ) = '0' + ( ( V := N ) MOD 10 );
DO WHILE( ( V := V / 10 ) > 0 );
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
END;
CALL BDOS( 9, .N$STR( W ) ) /* */;
END PRNUMBER;
MODF: PROCEDURE( A, B )RETURNS (binary)/*
BINARY /* */; DECLARE ( A, B ) BINARY; RETURN (mod(a,b))/*
( A MOD B ) /* */;
END MODF;
 
/* TASK */
DECLARE N BINARY;
 
ISWILSONPRIME: PROCEDURE( N )RETURNS (bit(1))/*
BYTE /* */;
DECLARE N BINARY;
DECLARE ( FMODP, I ) BINARY;
FMODP = 1;
DO I = 2 TO N - 1;
FMODP = MODF( FMODP * I, N );
END;
RETURN ( FMODP = N - 1 );
END ISWILSONPRIME ;
DO N = 1 TO 100;
IF ISWILSONPRIME( N ) THEN DO;
CALL PRCHAR( ' ' );
CALL PRNUMBER( N );
END;
END;
EOF = 1; /* the 8080 PL/M compiler ignores everything after EOF */
end wilson_100H ;</lang>
{{out}}
<pre>
3,022

edits