Nice primes: Difference between revisions

→‎{{header|PL/M}}: Optimise the sieve by using the SQRT routine from the PL/M solution to the Frobenius Numbers task
(Added Arturo implementation)
(→‎{{header|PL/M}}: Optimise the sieve by using the SQRT routine from the PL/M solution to the Frobenius Numbers task)
Line 1,003:
CALL PRINT$STRING( .N$STR( W ) );
END PRINT$NUMBER;
/* INTEGER SUARE ROOT: BASED ON THE ONE IN THE PL/M FOR FROBENIUS NUMBERS */
SQRT: PROCEDURE( N )ADDRESS;
DECLARE ( N, X0, X1 ) ADDRESS;
IF N <= 3 THEN X0 = 1;
ELSE DO;
DOX0 WHILE(= DIGIT$SUMSHR( >N, 91 );
DO WHILE( ( X1 := SHR( X0 + ( N / X0 ), 1 ) ) < X0 );
X0 = X1;
END;
END;
RETURN X0;
END SQRT;
DECLARE MIN$PRIME LITERALLY '501';
DECLARE MAX$PRIME LITERALLY '999';
Line 1,014 ⟶ 1,026:
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 SQRT( MAX$PRIME / 2);
IF PRIME( I ) THEN DO;
DO S = I * I TO LAST( PRIME ) BY I + I;PRIME( S ) = FALSE; END;
Line 1,027 ⟶ 1,039:
DECLARE DIGIT$SUM BYTE, V ADDRESS;
V = I;
DIGIT$SUMDO =WHILE( 99V > 9 );
DO WHILE( DIGIT$SUM > 9 );
DIGIT$SUM = 0;
DO WHILE( V > 0 );
Line 1,050 ⟶ 1,061:
END;
END;
EOF</lang>
</lang>
{{out}}
<pre>
3,045

edits