How to resolve the algorithm Primes: n*2^m+1 step by step in the PL/M programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Primes: n*2^m+1 step by step in the PL/M programming language

Table of Contents

Problem Statement

A050921 - Smallest prime of form n*2^m+1

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Primes: n*2^m+1 step by step in the PL/M programming language

Source code in the pl/m programming language

100H: /* FIND PRIMES OF THE FORM N * 2**M + 1                                */

   DECLARE FALSE LITERALLY '0';
   DECLARE TRUE  LITERALLY '0FFH';

   /* 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;
   /* END SYSTEM CALL AND I/O ROUTINES                                       */

   /* SIEVE THE PRIMES TO 8000                                               */
   DECLARE PRIME ( 8001 )BYTE;
   DO;
      DECLARE ( I, S ) 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 ) / 2 BY 2;
         IF PRIME( I ) THEN DO;
            DO S = I * I TO LAST( PRIME ) BY I + I; PRIME( S ) = FALSE; END;
         END;
      END;
   END;

   DECLARE MAX$M LITERALLY '14'; /* MAXIMUM M WE WILL CONSIDER               */

   /* FIND THE PRIMES                                                        */

   DECLARE ( N, M, P, TWO$TO$M ) ADDRESS;
   DECLARE NOT$FOUND             BYTE;

   DO N = 1 TO 45;
      M         = 0;
      TWO$TO$M  = 1;
      P         = 0;
      NOT$FOUND = 1;
      DO WHILE M <= MAX$M
           AND ( NOT$FOUND := NOT PRIME( P := ( N * TWO$TO$M ) + 1 ) );
         TWO$TO$M = TWO$TO$M + TWO$TO$M;
         M        = M + 1;
      END;
      CALL PR$CHAR( '(' );
      IF N < 10 THEN CALL PR$CHAR( ' ' );
      CALL PR$NUMBER( N );
      IF NOT$FOUND THEN DO;
         CALL PR$STRING( .' NOT FOUND$' );
         END;
      ELSE DO;
         CALL PR$CHAR( ' ' );
         CALL PR$NUMBER( M );
         CALL PR$CHAR( ':' );
         CALL PR$CHAR( ' ' );
         IF P <   10 THEN CALL PR$CHAR( ' ' );
         IF P <  100 THEN CALL PR$CHAR( ' ' );
         IF P < 1000 THEN CALL PR$CHAR( ' ' );
         CALL PR$NUMBER( P );
         CALL PR$CHAR( ' ' );
         CALL PR$CHAR( ' ' );
      END;
      CALL PR$CHAR( ')' );
      IF N MOD 5 = 0 THEN CALL PR$NL;
   END;

EOF

  

You may also check:How to resolve the algorithm A+B step by step in the Nit programming language
You may also check:How to resolve the algorithm Terminal control/Cursor positioning step by step in the Retro programming language
You may also check:How to resolve the algorithm Bitwise operations step by step in the Vala programming language
You may also check:How to resolve the algorithm Greatest common divisor step by step in the MiniScript programming language
You may also check:How to resolve the algorithm HTTP step by step in the Haskell programming language