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 |
sequence px = path(x) |
||
for j=1 to length( |
for j=1 to length(px) do |
||
integer y = x+ |
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.) |
||
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) |
||
sequence pn = path(n) |
|||
printf(1,"%48s : %3g ^ %d = %s\n", {sprint(pn),x,n,treepow(x,n,pn)}) |
|||
end procedure |
end procedure |
||