嚴格嚟講,最好time complexity係O(log n)個乘法,但乘法唔一定係O(1)。Fibonacci numbers可以用Binet's Formula嚟計。
https://artofproblemsolving.com/wiki/index.php?title=Binet%27s_Formula
(1+sqrt(5))/2 = 1.618033988749895 係黃金分割率 𝜙 。
(1-sqrt(5)/2) = -0.6180339887498949, 絕對值細過1。
當n足夠大時(1-sqrt(5)/2)^n變得小到可以不理,Fn 大約係:
Fn ≈ (𝜙 ^ n) / sqrt(5)
一般電腦64-bit以下加減乘除無需用big integer,可以O(1)做到。如果要唔overflow話:
(𝜙 ^ n) / sqrt(5) ≤ 2^64
𝜙 ^ n ≤ 2^64 * sqrt(5)
n ≤ log(2^64 * sqrt(5)) / log(𝜙)
n ≤ 93.85916172458816
即係話64-bit unsigned integer最盡係只可以表示第93個Fibonacci number。
93咁細根本唔洗用O(log n) 嘅matrix multiplication algorithms,用O(n) loop仲簡單,分分鐘仲快過用matrix。
當n > 93就要用big integer,加減乘除再唔係O(1)。