Primality by Wilson's theorem: Difference between revisions

Line 1,391:
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
Should work with many PL/I implementations.
<br>
The PL/I include file "pg.inc" can be found on the [[Polyglot:PL/I and PL/M]] page.
Note the use of text in column 81 onwards to hide the PL/I specifics from the PL/M compiler.<lang pli>
<lang pli>/* PRIMALITY BY WILSON'S THEOREM */
wilson_100H: procedure options (main);
 
declare eof binary;
/* CPPL/MI DEFINITIONS BDOS SYSTEM CALL AND CONSOLE OUTPUT ROUTINES, ETC. */ /*/
%include 'pg.inc';
/* PL/M DEFINITIONS: CP/M BDOS SYSTEM CALL AND CONSOLE I/O ROUTINES, ETC. */ /*
DECLARE BINARY LITERALLY 'ADDRESS', CHARACTER LITERALLY 'BYTE';
DECLARE PUT SADDR LITERALLY '/*.', BIT LITERALLY 'BYTE';
BDOSBDOSF: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END /* */;
DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END;
PRCHAR: PROCEDURE( C ); DECLARE C CHARACTER; PUT edit(c)(a(1)) /* */ /*
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END;
CALL BDOS( 2, C ) /* */;
PRCHAR: PROCEDURE( C ); DECLARE C CHARACTER; PUTCALL editBDOS(c)(a(1)) 2, C ); /* */ /*END;
END PRCHAR;
PRNUMBERPRNL: PROCEDURE( N ); DECLARE N BINARYPROCEDURE; CALL PRCHAR( 0DH ); CALL PRCHAR( 0AH ); /* */END;
PRNUMBER: PROCEDURE( N );
if n < 10 then put edit(n)(f(1)); /* */
DECLARE N ADDRESS;
else if n < 100 then put edit(n)(f(2)); /* */
DECLARE V ADDRESS, N$STR( 6 ) BYTE, W BYTE;
else if n < 1000 then put edit(n)(f(3)); /* */
N$STR( W := WLAST( -N$STR 1) ) = '0$' + ( V MOD 10 );
else put edit(n)(f(6)); /*
N$STR( W := W - 1 ) = '0' + ( ( V := N ) MOD 10 *//*);
DO WHILE( ( V DECLARE:= V ADDRESS,/ N$STR( 610 ) BYTE,> W0 BYTE);
N$STR( W := LAST(W N$STR- )1 ) = '$0' + ( V MOD 10 );
END;
N$STR( W := W - 1 ) = '0' + ( ( V := N ) MOD 10 );
CALL BDOS( 9, DO WHILE.N$STR( ( V := V / 10W ) > 0 );
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
END;
CALL BDOS( 9, .N$STR( W ) ) /* */;
END PRNUMBER;
MODF: PROCEDURE( A, B )ADDRESS;
DECLARE ( A, B )ADDRESS;
RETURN( A MOD B );
END PRCHARMODF;
/* END LANGUAGE DEFINITIONS */
 
/* TASK */
Line 1,426 ⟶ 1,433:
FMODP = 1;
DO I = 2 TO N - 1;
FMODP = modMODF( FMODP * I, N ,/*);
MOD /* */ N
);
END;
RETURN ( FMODP = N - 1 );
Line 1,439 ⟶ 1,444:
END;
END;
 
EOF = 1; /* the 8080 PL/M compiler ignores everything after EOF */
EOF: end wilson_100H ;</lang>
{{out}}
<pre>
3,048

edits