Java斐波那契数列快速幂算法

最近恶补算法,从简单的排序,快排,堆排,归并,双链表,堆栈,到递归,动态规划,窗口最大值,单调栈,感觉收获很多,也算是算法入门级别了吧最近看了看斐波那契数列的快速幂算法,感觉有点小启发,总结一下
斐波那契数列:1,1,2,3,5,8…
规律就是
f(n) = f(n-1)+f(n-2)
f(n-1) = f(n-2)+f(n-3)
f(n-2) = f(n-3)+f(n-4)

f(3) = f(2)+f(1)
f(2) = f(1)+f(0)
因为涉及到快速幂,矩阵,所以自行补充一下矩阵的乘法知识
这里直接推倒
f(n) = f(n-1)+f(n-2)
f(n-1)=f(n-1)
组合等式左边行列式|f(n),f(n-1)|=|f(n-1),f(n-2)||11,10|
|f(n-1),f(n-2)|=|f(n-2,f(n-3)||11,10|
。。。
|f(2),f(1)|=|f(1),f(0)||11,10|
|11,10|相当于一个常量,后面直接用a代替
所以|f(n),f(n-1)|=|f(1),f(0)||a|的(n-2)次方
那么f(n)=f(1)*x+f(0)y
x,y是a的(n-2)次方计算后的a[0][0]位置的值,a[1][0]位置的值
上面介绍了斐波那契数列转矩阵的算法
下面是快速幂
快速幂的原理就是求一个数怎么样能增长的最快
也就是说,f(n)=?能做到n增长最快,高中数学题,肯定是n的n次方,那么我们假设f(n)=19,回到上面的结果19,n怎么才能快速到19,19转成2进制,int p=19(二进制表示10011),我们可以求a^(1+2+16), 我们让
初始化一个矩阵
int[][] res = new int[2][2];
for (int i = 0; i < 2; i++) {
res[i][i] = 1;
}
for (; p != 0; p >>= 1) {//向右移动一位
if ((p & 1) != 0) {
res = muliMatrix(res, t);//矩阵乘法
}
t = muliMatrix(t, t);
}
// 两个矩阵乘完之后的结果返回
public static int[][] muliMatrix(int[][] m1, int[][] m2) {
int[][] res = new int[m1.length][m2[0].length];
for (int i = 0; i < m1.length; i++) {
for (int j = 0; j < m2[0].length; j++) {
for (int k = 0; k < m2.length; k++) {
res[i][j] += m1[i][k] * m2[k][j];
}
}
}
return res;
}
这样
n=0,a=a
n=1,a=a^2
n=2,a=a^4
n=3,a=a^8
n=4,a=a^16
当10011遇到1我们就让x
a,最多5次就可以求出幂值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值