別館からの転載。
let f=(n,_,a,b)=>(_=n=>n++?([a,b]=_(n%8?n%2?n>>1:n-2:n),n%8?n%2?[a*(a+2*b),a*a+b*b]:[a+b,a]:[b,a-b]):[0,1])(n)[0];
この前の2倍公式を使い、偶数なら2倍公式を適用、下位3ビットが1なら1を足したもの、そうでなければ1を引いたものから計算する。こうすることで「桁数+ビットを最初から見ていったとき0と1が入れ替わる回数」分だけ関数が呼ばれることになる。おそらくこれが最小。