速いフィボナッチをjsで短く書く

別館からの転載。

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が入れ替わる回数」分だけ関数が呼ばれることになる。おそらくこれが最小1

1

残念ながらjsなので取得したフィボナッチ数もdoubleですぐだめになってしまう。