Truncatable primes: Difference between revisions

Content added Content deleted
(→‎{{header|REXX}}: added comments & whitespace, support for specifying the upper limit, optimized prime number generator. -- ~~~~)
Line 1,582: Line 1,582:
=={{header|REXX}}==
=={{header|REXX}}==
A little extra code was added to the prime number generator to speed it up.
Extra code was added to the prime number generator as this was the part of the REXX program that consumed the vast majority of the time.
<lang REXX>/*REXX pgm finds largest left- and right-truncatable primes < 1 million.*/
<lang REXX>/*REXX pgm finds largest left- and right-truncatable primes < 1 million.*/
parse arg high .; if high=='' then high=1000000 /*assume 1 million.*/
!.=0 /*placeholders for primes. */
!.=0; Lp=0; Rp=0 /*placeholders for primes, Lp, Rp*/
p.1=2; p.2=3; p.3=5; p.4=7; p.5=11; p.6=13; p.7=17 /*some low primes.*/
p.1=2; p.2=3; p.3=5; p.4=7; p.5=11; p.6=13; p.7=17 /*some low primes.*/
!.2=1; !.3=1; !.4=1; !.7=1; !.11=1; !.13=1; !.17=1 /*low prime flags.*/
!.2=1; !.3=1; !.5=1; !.7=1; !.11=1; !.13=1; !.17=1 /*low prime flags.*/
n=7 /*number of primes so far. */
n=7; s.7=17**2 /*number of primes so far. */
/*───────────────────────────────────────generate primes ≤ high. */
do j=p.n+2 by 2 to 1000000 /*find all primes < 1,000,000. */
call time 'Reset'
do j=p.n+2 by 2 to high /*only find odd Primes from here.*/
if j//3 ==0 then iterate /*divisible by three? */
if j//3 ==0 then iterate /*divisible by three? */
if right(j,1)==5 then iterate /*right-most digit a five? */
if right(j,1)==5 then iterate /*right-most digit a five? */
if j//7 ==0 then iterate /*divisible by seven? */
if j//7 ==0 then iterate /*divisible by seven? */
if j//11 ==0 then iterate /*divisible by eleven? */
if j//11 ==0 then iterate /*divisible by eleven? */
/*the above 4 lines saves time. */
if j//13 ==0 then iterate /*divisible by thirteen? */
do k=6 while p.k**2<=j /*divide by known odd primes. */
/*[↑] above five lines saves time*/
do k=7 while s.k<=j /*divide by known odd primes. */
if j//p.k==0 then iterate j /*Is divisible by X? Not prime.*/
if j//p.k==0 then iterate j /*Is divisible by X? Not prime.*/
end /*k*/
end /*k*/
n=n+1 /*bump number of primes found. */
n=n+1 /*bump number of primes found. */
p.n=j /*assign to sparse array. */
p.n=j; s.n=j*j /*assign to sparse array; prime².*/
!.j=1 /*indicate that J is a prime.*/
!.j=1 /*indicate that J is a prime.*/
end /*j*/
end /*j*/
say 'generation of primes took' format(time('E'),,2) "seconds."

/*───────────────────────────────────────find largest left truncatable P*/
say 'The last prime is' p.n " (there are "n 'primes under one million).'
do L=n by -1 for n while lp==0; if pos(0,p.L)\==0 then iterate
say copies('─',70) /*show a separator line. */
lp=0; rp=0

do L=n by -1 until lp\==0; if pos(0,p.L)\==0 then iterate
do k=1 for length(p.L)-1; _=right(p.L,k) /*truncate a #.*/
do k=1 for length(p.L)-1; _=right(p.L,k) /*truncate a #.*/
if \!._ then iterate L /*Truncated # ¬prime? Skip it.*/
if \!._ then iterate L /*Truncated # ¬prime? Skip it.*/
Line 1,612: Line 1,613:
lp=p.L
lp=p.L
end /*L*/
end /*L*/
/*───────────────────────────────────────find largest right truncatable P*/

do R=n by -1 until rp\==0; if pos(0,p.R)\==0 then iterate
do R=n by -1 for n while rp==0; if pos(0,p.R)\==0 then iterate
do k=1 for length(p.R)-1; _=left(p.R,k) /*truncate a #.*/
do k=1 for length(p.R)-1; _=left(p.R,k) /*truncate a #.*/
if \!._ then iterate R /*Truncated # ¬prime? Skip it.*/
if \!._ then iterate R /*Truncated # ¬prime? Skip it.*/
Line 1,619: Line 1,620:
rp=p.R
rp=p.R
end /*R*/
end /*R*/
/*───────────────────────────────────────show largest left/right trunc P*/

say 'The last prime is' p.n " (there are" n 'primes ≤' high")."
say 'The largest left-truncatable prime under one million is ' lp
say copies('─',70) /*show a separator line. */
say 'The largest right-truncatable prime under one million is ' rp
say 'The largest left-truncatable prime ≤' high " is " lp
say 'The largest right-truncatable prime ≤' high " is " rp
/*stick a fork in it, we're done.*/</lang>
/*stick a fork in it, we're done.*/</lang>
'''output'''
'''output'''