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

cache = [todualzeck0(1)]

todualzeck(n) = {
	while (#cache < n,
		cache = concat(cache, apply (todualzeck0, [#cache+1..2*#cache]));
	);
	cache[n];
}

missing(n) = {
	2^#binary(n)-1-n;
}

s = 0
unseen = 1
seen(v) = bittest(s, v)
see(v) = s = bitor(s, 2^v); while (seen(unseen), unseen++)

other(n) = {
	my (mn = missing(todualzeck(n)));
	for (v = unseen, oo,
		if (!seen(v) && bitand(missing(todualzeck(v)), mn)==0,
			see(v);
			return (v);
		);
	);
}

{
	print ("0 0");
	for (n = 1, fibonacci(23)-2,
		print (n " " other(n));
	);
}

quit