Anonymous user
Knuth's power tree: Difference between revisions
m
→{{header|REXX}}: changed/added comments and whitespace, changed indentations, made other cosmetic changes.
m (changed a comment in the task's definition section.) |
m (→{{header|REXX}}: changed/added comments and whitespace, changed indentations, made other cosmetic changes.) |
||
Line 563:
=={{header|REXX}}==
This REXX version supports results up to 1,000 decimal digits (which can be expanded with the '''numeric digits nnn''' REXX statement
<lang rexx>/*REXX program produces & shows a power tree for P, and calculates & shows X^P*/▼
parse arg nums /*get set stuff: sets of three numbers.*/▼
if nums='' then nums='2 -4 17 3 191 191 1.1 81' /*Not specified? Use defaults*/▼
/*X lowPow highPow ··· repeat*/▼
do until nums=''▼
parse var nums x pL pH nums; x=x/1 /*get X, lowP, highP; and normalize X. */▼
if pH='' then pH=pL /*No highPower? Then assume lowPower. */▼
Also, negative powers are supported.
▲<lang rexx>/*REXX program produces &
numeric digits
parse arg XP
▲if
/*────── X LP HP X LP HP X LP ◄── X, low power, high power ··· repeat*/
▲ if pH='' then pH=pL /*No highPower? Then assume lowPower. */
do i=1 for words($); @.i=word($,i) /*build a fast Knuth's power tree array*/
if p==0 then do;
!.=.;
if n//2==0 then z=prv**2 /*Even power? Then square the number.*/▼
else z=z*!.diff /* Odd " " mult. by pow diff.*/▼
!.n=z /*remember for other multiplications. */▼
prv=z /*remember for squaring the numbers. */▼
▲ end /*k*/
call show /*display the expression and its value.*/▼
end /*e*/▼
exit /*stick a fork in it, we're all done. */▼
powerTree: arg y 1 oy; $= /*Z is the result; $ is the power tree.*/▼
#.=0; @.=0; #.0=1 /*define default & initial array values*/▼
/* [↓] add blank "flag" thingy──►list.*/▼
do while \(y//2); $=$ ' ' /*reduce "front" even power #s to odd #*/▼
if y\==oy then $=y $ /*(only) ignore the first power number*/▼
y=y%2 /*integer divide the power (it's even).*/▼
!.n=z
prv=z
end
▲ call show /*display the expression and its value.*/
s=@.s▼
end
end /*until
▲exit /*stick a fork in it, we're all done. */
n=#.n▼
/*──────────────────────────────────────────────────────────────────────────────────────*/
end /*while n¬==0*/▼
▲powerTree: arg y 1 oy; $= /*Z is the result; $ is the power tree.*/
if y=0 | y=1 then return y
▲ if
show: if e<0 then z=format(1/z,,40)/1; _=right(e,w) /*use reciprocal ? */▼
if y>1 then do while @.y==0; n=#.0; m=0
do while n\==0; q=0; s=n
do while s\==0; _=n+s
if @._==0 then do; if q==0 then m_=_; #._=q; @._=n; q=_
▲ s=@.s
if q\==0 then do; #.m=q; m=m_; end
▲ n=#.n
do while z\==0; $=z $; z=@.z; end /*build power list*/
return space($) /*del extra blanks*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
say left('power tree for ' _ " is: " $,60) '═══' x"^"_ ' is: ' z; return</lang>
'''output''' when using the default inputs:
<pre>
|