Count in factors: Difference between revisions

m
→‎{{header|REXX}}: optimized the function, simplified some code, added/changed whitespace and comments.
m (→‎using integer SQRT: used better highlighting for the REXX section header.)
m (→‎{{header|REXX}}: optimized the function, simplified some code, added/changed whitespace and comments.)
Line 3,227:
@.=left('', 8); @.0="{unity} "; @.1='[prime] ' /*some tags and handy-dandy literals.*/
parse arg low high . /*get optional arguments from the C.L. */
if low=='' then do; low= 1; high= 40; end /*No LOW & HIGH? Then use the default.*/
if high=='' then high= low; tell= (high>0) /*No HIGH? " " " " */
wtell=length (high>0); high=abs(high) /*getif maximum widthHIGH for prettyis output.positive, then show #'s.*/
numerichigh= digits maxabs(9, w+1high) /*maybe bumpuse the precisionabsolute ofvalue numbersfor HIGH. */
#w=0 length(high) /*theget numbermaximum ofwidth primesfor foundpretty (so far)output. */
numeric digits max(9, w do+ n=abs(low1) to high; f= factr(n) /*process a single number or /*maybe abump rangethe precision of numbers. */
#= 0 p=words(translate(f,,'x')) - (n==1) /*P: is /*the number of primeprimes factors.found (so far). */
if p==1do then #n=#+1abs(low) to high; f= factr(n) /*process a single number or a /*bump the primes counter (exclude N=1)range.*/
if tellp= words( then say righttranslate(nf, w) ,'=x') ) @.p- space(f, 0(n==1) /*showP: if primeis andthe number of prime factors. */
if p==1 then #= # + 1 /*bump the primes counter (exclude N=1)*/
end /*n*/
if tell then say right(n, w) '=' @.p f /*display if a prime, plus its factors.*/
end /*n*/
say
say right(#, w) ' primes found.' /*display the number of primes found. */
Line 3,242 ⟶ 3,244:
/*──────────────────────────────────────────────────────────────────────────────────────*/
factr: procedure; parse arg z 1 n,$; if z<2 then return z /*if Z too small, return Z*/
do while z// 2==0; $= $ 'x 2x2' ; z= z % 2; end end /*maybe add factor of 2 */
do while z// 3==0; $= $ 'x 3x3' ; z= z % 3; end end /* " " " " 3 */
do while z// 5==0; $= $ 'x 5x5' ; z= z % 5; end end /* " " " " 5 */
do while z// 7==0; $= $ 'x 7x7' ; z= z % 7; end end /* " " " " 7 */
 
do j=11 by 6 while j<=z /*insure that J isn't divisible by 3.*/
parse var j '' -1 _ /*get the last decimal digit of J. */
if _\==5 then do while z//j==0; $=$ 'x' j; z= z%j; end /*maybe reduce Z.*/
if _ ==3 then iterate /*Next # ÷ by /*if5? next numberSkip. ___ will be ÷ by 5, skip.*/
if j*j>n then leave /*are we higher than the √ N ? */
y= j + 2 end /*while*/ /*obtain [↑]the next findodd integer SQRT(z)divisor. */
y=j+2
do while z//y==0; $=$ 'x' y; z= z%y; end /*maybe reduce Z.*/
end /*j*/
 
if z==1 then z= if z==1 then return strip($ , , 'x') /*if residual is unity, then nullify it*/
return strip( strip($ 'x' z), , "x") return strip($'x'z, , 'x') /*elide a possible leading (extra) "x".*/</lang>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
Line 3,322 ⟶ 3,324:
@.=left('', 8); @.0="{unity} "; @.1='[prime] ' /*some tags and handy-dandy literals.*/
parse arg low high . /*get optional arguments from the C.L. */
if low=='' then do; low= 1; high= 40; end /*No LOW & HIGH? Then use the default.*/
if high=='' then high= low; tell= (high>0) /*No HIGH? " " " " */
hightell= abs(high>0); w= length(high) /*getif maximum widthHIGH for prettyis output.positive, then show #'s.*/
numerichigh= digits maxabs(9, w+1high) /*maybe bumpuse the precisionabsolute ofvalue numbersfor HIGH. */
w= length(high) /*get maximum width for pretty output. */
numeric digits max(9, w + 1) /*maybe bump the precision of numbers. */
#= 0 /*the number of primes found (so far). */
do n=abs(low) to high; f= factr(n) /*process a single number or a range.*/
p= words( translate(f, , 'x') ) - (n==1) /*P: is the number of prime factors. */
if p==1 then #= # + 1 /*bump the primes counter (exclude N=1)*/
if tell then say right(n, w) '= ' @.p space( f, 0) /*showdisplay if a prime, plus andits factors.*/
end /*n*/
say
say right(#, w) ' primes found.' /*display the number of primes found. */
Line 3,337 ⟶ 3,341:
/*──────────────────────────────────────────────────────────────────────────────────────*/
factr: procedure; parse arg z 1 n,$; if z<2 then return z /*if Z too small, return Z*/
do while z// 2==0; $= $ 'x 2x2' ; z= z %2 2; end /*maybe add factor of 2 */
do while z// 3==0; $= $ 'x 3x3' ; z= z %3 3; end /* " " " " 3 */
do while z// 5==0; $= $ 'x 5x5' ; z= z %5 5; end /* " " " " 5 */
do while z// 7==0; $= $ 'x 7x7' ; z= z %7 7; end /* " " " " 7 */
do while z//11==0; $= $ 'x 11x11' ; z= z % 11; end /* " " " " 11 */
do while z//13==0; $= $ 'x 13x13' ; z= z % 13; end /* " " " " 13 */
do while z//17==0; $= $ 'x 17x17' ; z= z % 17; end /* " " " " 17 */
do while z//19==0; $= $ 'x 19x19' ; z= z % 19; end /* " " " " 19 */
do while z//23==0; $= $ 'x 23x23' ; z= z % 23; end /* " " " " 23 */
do while z//29==0; $= $ 'x 29x29' ; z= z % 29; end /* " " " " 29 */
do while z//31==0; $= $ 'x 31x31' ; z= z % 31; end /* " " " " 31 */
do while z//37==0; $= $ 'x 37x37' ; z= z % 37; end /* " " " " 37 */
r= 0 /*R: will be integer SQRT of Z.*/
 
if z>40 then do; t= z; q= 1; do while q<=t; q= q * 4; end /*while*/
r= 0 do while q>1; q= q%4; _= t-r-q; r= r%2; if _>=0 then do; t=_; /*R: will be integer SQRT of Z.*/r=r+q
do while q>1; q= q%4; _= t-r-q; r= r%2; if _>=0 then do; t=_; r=r+q end
end /*while*/ /* [↑] find integer SQRT(z). end*/
end /*while*/ /* [↑] find integer SQRT(z). */
 
do j=41 by 6 to r while j<=z /*insure J isn't divisible by 3*/
parse var j '' -1 _ /*get last decimal digit of J.*/
if _\==5 then do while z//j==0; $=$ 'x' j; z= z % j; end
if _ ==3 then iterate end /*while*/ /*Next [↑]number reduce Z÷ by J5 ? Skip.*/
if _ =y=3 j then+ iterate2 /*Next number ÷ by 5 ? Skip /*use the next (odd) divisor. */
y= j + 2 do while z//y==0; $=$'x'y; z= z%y; /*use the next (odd) divisor. */end
end /*j*/ do while z//y==0; $=$ 'x' y;/* [↑] reduce Z z=by z %Y y? */
end /*while*/ /*if [↑] reduce Z by Y ? z>40*/
end /*j*/
end /*if z>40*/
 
if z==1 then z= return strip($ , , 'x') /*if residual is unity, then nullify it.*/
return strip(strip( $ 'x' z), , "'x"') /*elide a possible leading (extra) "x" .*/</lang>
{{out|output|text=&nbsp; is identical to the 1<sup>st</sup> REXX version.}}<br><br>