Klarner-Rado sequence: Difference between revisions

Added PL/M
(Added VB.NET)
(Added PL/M)
Line 216:
</pre>
Unfortunately JavaScript can't quite cope/runs out of memory with a 100 million element sieve, so it only goes to the 10^5th under p2js.
 
=={{header|PL/M}}==
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
<br>
As PL/M only handles unsigned 8 and 16 bit integers, this only finds the first 1000 elements. This is based on the Algol 68 sample, but as with the VB.NET sample, uses a "bit vector" (here an array of bytes) - as suggested by the Julia sample.
<lang pli>100H: /* EIND ELEMENTS OF THE KLARNER-RADO SEQUENCE */
/* - IF N IS AN ELEMENT, SO ARE 2N+1 AND 3N+!, 1 IS AN ELEMENT */
 
/* 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$COUNT LITERALLY '1$000';
 
DECLARE BIT ( 8 )BYTE INITIAL( 128, 1, 2, 4, 8, 16, 32, 64 );
 
DECLARE ( N21, N31, P2, P3, KR$COUNT, I, I$3 ) ADDRESS;
DECLARE KR ( 1251 )BYTE; DO I = 0 TO LAST( KR ); KR( I ) = 0; END;
KR( 0 ) = BIT( 1 );
 
KR$COUNT = 0; N21 = 3; N31 = 4; P2, P3 = 1;
I = 0;
DO WHILE( KR$COUNT < MAX$COUNT );
I = I + 1;
I$3 = SHR( I, 3 );
IF I = N21 THEN DO; /* I IS 2N+1 WHERE N = P2 */
IF ( KR( SHR( P2, 3 ) ) AND BIT( P2 AND 7 ) ) <> 0 THEN DO;
KR( I$3 ) = KR( I$3 ) OR BIT( I AND 7 );
END;
P2 = P2 + 1;
N21 = N21 + 2;
END;
IF I = N31 THEN DO; /* I IS 3N+1 WHERE N = P3 */
IF ( KR( SHR( P3, 3 ) ) AND BIT( P3 AND 7 ) ) <> 0 THEN DO;
KR( I$3 ) = KR( I$3 ) OR BIT( I AND 7 );
END;
P3 = P3 + 1;
N31 = N31 + 3;
END;
IF ( KR( I$3 ) AND BIT( I AND 7 ) ) <> 0 THEN DO;
KR$COUNT = KR$COUNT + 1;
IF KR$COUNT <= 100 THEN DO;
CALL PR$CHAR( ' ' );
IF I < 10 THEN CALL PR$CHAR( ' ' );
IF I < 100 THEN CALL PR$CHAR( ' ' );
CALL PR$NUMBER( I );
IF KR$COUNT MOD 20 = 0 THEN CALL PR$NL;
END;
ELSE IF KR$COUNT = MAX$COUNT THEN DO;
CALL PR$STRING( .'ELEMENT $' );
CALL PR$NUMBER( MAX$COUNT );
CALL PR$STRING( .' IS: $' );
CALL PR$NUMBER( I );
END;
END;
END;
 
EOF</lang>
{{out}}
<pre>
1 3 4 7 9 10 13 15 19 21 22 27 28 31 39 40 43 45 46 55
57 58 63 64 67 79 81 82 85 87 91 93 94 111 115 117 118 121 127 129
130 135 136 139 159 163 165 166 171 172 175 183 187 189 190 193 202 223 231 235
237 238 243 244 247 255 256 259 261 262 271 273 274 279 280 283 319 327 331 333
334 343 345 346 351 352 355 364 367 375 379 381 382 387 388 391 405 406 409 418
ELEMENT 1000 IS: 8487
</pre>
 
=={{header|Python}}==
3,036

edits