Anonymous user
Mersenne primes: Difference between revisions
m
→{{header|REXX}}: changed some comments, simplified the first DO loop.
m (→{{header|REXX}}: changed a glyph in a comment.) |
m (→{{header|REXX}}: changed some comments, simplified the first DO loop.) |
||
Line 615:
=={{header|REXX}}==
This REXX version (using a 32-bit Regina REXX interpreter) will find those Mersenne primes which are less than
<br>8 million decimal digits (which would be '''
<lang rexx>/*REXX program uses exponent─and─mod operator to test possible Mersenne numbers. */
do j=1;
if \isPrime(
r= testMer(
if r==0 then say right('M'
else say right('M'
end /*j*/
exit /*stick a fork in it, we're all done. */
Line 631:
end /*j*/ /* └─◄ Is j>√ x ? Then return 1*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
iSqrt: procedure; parse arg x;
do while #>1; #=
end /*while*/ /*iSqrt ≡ integer square root.*/
return r /*───── ─ ── ─ ─ */
/*──────────────────────────────────────────────────────────────────────────────────────*/
testMer: procedure; parse arg x; p
$$=
if pos('E',p)\==0 then do; parse var p "E" _; numeric digits _+2; p=2**x; end
!.=1; !.1=0; !.7=0 /*array used for a quicker test. */
R=iSqrt(p) /*obtain integer square root of P*/
do k=2 by 2; q=
m=q // 8 /*obtain the remainder when ÷ 8. */
if !.m then iterate /*M must be either one or seven.*/
parse var q '' -1 _; if _==5 then iterate /*last digit a five
if q// 3==0 then iterate /*
if q// 7==0 then iterate /*
if q//11==0 then iterate /*
/* ____ */
if q>R then return 0 /*Is q>√2**x ? A Mersenne prime*/
sq=
do until $==''; sq=
parse var $ _ 2 $ /*obtain 1st digit and the rest. */
if _ then sq=
end /*until*/
if sq==1 then return q /*Not a prime? Return a factor.*/
|