斐波那契数列(Fibonacci)及矩阵快速幂的延伸

本文详细介绍了使用快速幂算法解决斐波那契数列问题的方法,包括快速幂的迭代和递归模板,以及如何利用矩阵乘法和矩阵快速幂优化计算过程。快速幂算法能够有效减少计算次数,提高效率。
大家好,我是小黄呀。

题目

斐波那契数列(Fibonacci):第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。

快速幂解法

		int ans=1;
	
		a=a%c;
	
		while(b>0)
	
		{
	
			if(b%2==1)  ans=(ans*a)%c;
	
			b=b/2;
	
			a=(a*a)%c;
	
		}

  1. ab mod c=(a mod c)b mod c
  2. (ab) mod c=[(a mod c)×(b mod c)mod c ]
  3. ab mod c=a2(b/2) mod c
  4. 当b是奇数时,那么有 a^b = a * a^(b-1)
  5. 当b是偶数时,那么有 a^b = a^(b/2) * a^(b/2)
  6. 算法解释:
    1. 根据公式1,先对a取模;对a进行循环幂运算,每次将b除以2;
    2. b为偶数时,直接出2;当b为奇数时,因为整形int原因,b除以2为小数会将小数位舍去,此时指数降为b-1,因此将ans乘以a,即将b-1+1变为b,再继续循环。

快速幂迭代模板

		模板代码:快速幂(log b)
		
		int PowerMod(int a,int b,int c)
		
		{
		
			int ans=1;
		
			a=a%c;
		
			while(b>0)
		
			{
		
				if(b%2==1)  ans=(ans*a)%c;
		
				b=b/2;
		
				a=(a*a)%c;
		
			}
		
			return ans;
		
		}
		//将b%2==1 和 b=b/2 改为位运算如下
		
		typedef long long ll
		
		ll binaryPow(ll a, ll b, ll m){
		
			ll ans = 1;
		
			while(b > 0){
		
				if(b & 1){
		
					ans = ans * a % m;
		
				}
		
				a = a * a % m;
		
				b >>= 1; 
		
			} 
		
			return ans;
		
		}

快速幂递归模板

		typedef long long ll;
		
		ll binaryPow(ll a, ll b, ll m){
		
			if(b == 0)
		
				return 1;
		
			else if(b % 2 == 1)
		
				return a * binaryPow(a, b - 1, m) % m;
		
			else{
		
				ll num = binaryPow(a, b/2, m) % m;	//优化 
		
				return num * num % m;// 不直接写成return binaryPow(a, b/2, m) * binaryPow(a, b/2, m)
		
			}
		
			
		
		}

矩阵乘法与矩阵快速幂

  1. 矩阵乘法模板
  2. 矩阵快速幂代码
Matrix fast_pow(Matrix a, int x) {
		
			Matrix ans;
		
			ans.x = a.x;
		
			for(int i = 0; i < ans.x; i++)
		
				ans.a[i][i] = 1;
		
			while(x) {
		
				if(x&1) 
		
					ans = ans*a;
		
				a = a*a;
		
				x >>= 1;
		
			}
		
			return ans;
		
		}

关于斐波那契数列的矩阵快速幂解法

  1. 在这里插入图片描述在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_AoSnow_

创作不易,打赏打赏些8

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值