Jump to content

Truncatable primes: Difference between revisions

→‎{{header|REXX}}: added comments & whitespace, support for specifying the upper limit, optimized prime number generator. -- ~~~~
(→‎{{header|REXX}}: added comments & whitespace, support for specifying the upper limit, optimized prime number generator. -- ~~~~)
Line 1,582:
=={{header|REXX}}==
A little extraExtra code was added to the prime number generator toas speedthis itwas upthe 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.*/
parse arg high .; if high=='' then high=1000000 /*assume 1 million.*/
!.=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.*/
!.2=1; !.3=1; !.45=1; !.7=1; !.11=1; !.13=1; !.17=1 /*low prime flags.*/
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 1000000high /*only find allodd primesPrimes <from 1,000,000here. */
if j//3 ==0 then iterate /*divisible by three? */
if right(j,1)==5 then iterate /*right-most digit a five? */
if j//7 ==0 then iterate /*divisible by seven? */
if j//11 ==0 then iterate /*divisible by eleven? */
if j//13 ==0 then iterate /*divisible by thirteen? /*the above 4 lines saves time. */
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.*/
end /*k*/
n=n+1 /*bump number of primes found. */
p.n=j; s.n=j*j /*assign to sparse array; prime². */
!.j=1 /*indicate that J is a prime.*/
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 untilfor 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 #.*/
if \!._ then iterate L /*Truncated # ¬prime? Skip it.*/
Line 1,612 ⟶ 1,613:
lp=p.L
end /*L*/
/*───────────────────────────────────────find largest right truncatable P*/
 
do R=n by -1 untilfor 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 #.*/
if \!._ then iterate R /*Truncated # ¬prime? Skip it.*/
Line 1,619 ⟶ 1,620:
rp=p.R
end /*R*/
/*───────────────────────────────────────show largest left/right trunc P*/
 
say 'The last prime is' p.n " (there are " n 'primes under≤' one million 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 under≤' one millionhigh " is '" lp
say 'The largest right-truncatable prime under≤' one millionhigh " is '" rp
/*stick a fork in it, we're done.*/</lang>
'''output'''
Cookies help us deliver our services. By using our services, you agree to our use of cookies.