2020-10-21

it2023-12-16  106

还记得莫比乌斯环吗?把一维里的环放在三维里,环上的人只能在原地转圈。

现在我要借助二维的矩阵,让 ‘‘求Fibonacci数列的第 n (n < 2^63) 项模10000 0000的值’’ 加速。

记 F2 = (f2, f1) = (1, 1),这是一行两列的矩阵,里面是Fib数列的第二项和第一项。

记 P = (1, 1) (1, 0),这里上下两个括号是一个大括号,这是二行二列的矩阵。

F3 = F2P = (2, 1) = (f3, f2) F4 = F3P = (3, 2) = (f4, f3) F5 = F4*P = (5, 3) = (f5, f4) … …

Fn = F2*P^(n-2),而, 矩阵乘法有结合性,即可以把右边的乘式中若干个 P 先乘,再与F2乘,再与剩下的若干个P运算… …

你想到了什么?倍幂法。

x = n - 2 while (x) { if (x & 1) F = F * P P = P*P x >>= 1 }

即使n=2^63,这个循环也只重复63次。

高一个维度,快的不是一点点。

坏了,忘记 MOD 啦。[Grimace] 参考 https://baike.sogou.com/m/n/snapshot?link=NnX_yK0RLreO_MaeY_jONCHebANDeRwObOkuUCDek-_pRkkuPIw1eIItUIkJPFIkEY_I-FZJZkkI7k&originRef=http%3A%2F%2Fwww.matrix67.com%2Fblog%2Farchives%2F276&title=%E5%8D%81%E4%B8%AA%E5%88%A9%E7%94%A8%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95%E8%A7%A3%E5%86%B3%E7%9A%84%E7%BB%8F%E5%85%B8%E9%A

最新回复(0)