Knuth's power tree: Difference between revisions

Content added Content deleted
m (tweak for addition-chain exponentiation)
Line 981: Line 981:
for i=1 to length(lvl) do
for i=1 to length(lvl) do
integer x = lvl[i]
integer x = lvl[i]
sequence py = path(x)
sequence px = path(x)
for j=1 to length(py) do
for j=1 to length(px) do
integer y = x+py[j]
integer y = x+px[j]
if getd_index(y,p)!=NULL then exit end if
if getd_index(y,p)!=NULL then exit end if
setd(y,x,p)
setd(y,x,p)
Line 996: Line 996:
include bigatom.e
include bigatom.e
function treepow(object x, integer n)
function treepow(object x, integer n, sequence pn = {})
-- x can be atom or bigatom
-- x can be atom or bigatom
-- (asides: sequence r uses out-by-1 indexing, ie r[1] is for 0.
-- (asides: sequence r uses out-by-1 indexing, ie r[1] is for 0.
-- pipa/pa/res perform useful type-checking, ie prevent
-- pipa/pa/res perform useful type-checking, ie prevent
-- this from trying to use something not yet calculated.)
-- this from trying to use something not yet calculated.)
sequence pn = path(n)
if pn={} then pn=path(n) end if
sequence r = {BA_ONE,ba_new(x)}&repeat(0,max(0,n-1))
sequence r = {BA_ONE,ba_new(x)}&repeat(0,max(0,n-1))
integer p = 0
integer p = 0
Line 1,016: Line 1,016:


procedure showpow(atom x, integer n)
procedure showpow(atom x, integer n)
printf(1,"%48s : %3g ^ %d = %s\n", {sprint(path(n)),x,n,treepow(x,n)})
sequence pn = path(n)
printf(1,"%48s : %3g ^ %d = %s\n", {sprint(pn),x,n,treepow(x,n,pn)})
end procedure
end procedure