tribonacci(n) = ([0,1,0; 0,0,1; 1,1,1]^n)[2,1]

totrib(n) = {
	for (i=0, oo,
		if (n<=tribonacci(3+i),
			my (v=0, f);
			forstep (j=i, 0, -1,
				if (n>=f=tribonacci(3+j),
					n-=f;
					v+=2^j;
				);
				if (n==0,
					return (v);
				);
			);
		);
	);
}

fromtrib(n) = {
	my (v=0, j);
	while (n,
		n-=2^j=valuation(n,2);
		v+=tribonacci(3+j);
	);
	return (v);
}

todualtrib(n) = {
    my (s=0, v=0);
    for (i=0, oo,
        if (s>=n,
            forstep (j=i-1, 0, -1,
                if (s-tribonacci(3+j)>=n,
                    s-=tribonacci(3+j);
                    v-=2^j;
                );
            );
            return (v);
        );
        s+=tribonacci(3+i);
        v+=2^i;
    );
}

bits(n) = {
	my (b=vector(hammingweight(n)));
	for (k=1, #b, n-=2^b[k]=valuation(n,2));
	return (b);
}

row(n) = {
	apply(b -> tribonacci(3+b), bits(totrib(n)))
}

{
	m=0;
	for (n=1, tribonacci(15),
		apply (v -> print (m++ " " v), row(n));
	);
}

quit