矩阵快速幂求斐波那契第n项

矩阵快速幂求斐波那契第n项

学习博客-Dong看图解就可明白。
我是推到n+1项,多推一项,思路是学习博客城南的花
其实两个思路一样,一个是推到n项,幂指数用的n-1算的,结果应是结果数组第一行第一列,另一个是推到n+1项,幂指数用的n算的,结果数组第一行第二列。

/*矩阵快速幂之斐波那契第n项*/
#include
using namespace std;
struct Matrix//结构体 矩阵类型
{
	int m[3][3];//第0行第0列不算
}ans, res;
/*计算矩阵乘法的函数*/
Matrix Mul(Matrix A, Matrix B)
{
	Matrix temp;//定义一个临时的矩阵,存放A*B的结果
	for (int i = 1; i <= 2; i++)
	{
		for (int j = 1; j <= 2; j++)
		{
			temp.m[i][j] = 0;//初始化为0
		}
	}
	for (int i = 1; i <= 2; i++)//两个矩阵相乘
	{
		for (int j = 1; j <= 2; j++)
		{
			for (int k = 1; k <= 2; k++)
			{
				temp.m[i][j] += A.m[i][k] * B.m[k][j];
			}
		}
	}
	return temp;
}
/*快速幂求矩阵res的N次幂*/
Matrix Quick_power(int N)
{
	/*将矩阵ans初始化为单位矩阵*/
	/*即对角线赋值为1,其余为0*/
	/*任何矩阵乘以ans为本身*/
	for (int i = 1; i <= 2; i++)
	{
		for (int j = 1; j <= 2; j++)
		{
			if (i == j)ans.m[i][j] = 1;
			else ans.m[i][j] = 0;
		}
	}	
	while (N)//N幂指数
	{
		if (N & 1)
			ans = Mul(ans, res);	
		res = Mul(res, res);
		N >>= 1;//去掉末位
	}
	return ans;
}
int main()
{
	int N;//N幂指数,n阶数
	cin >> N;
	/*初始化矩阵res*/
	res.m[1][1] = 1; res.m[1][2] = 1;
	res.m[2][1] = 1; res.m[2][2] = 0;	
	/*cout << res.m[1][2] << endl;*/ //错误想想为什么?res不是存放结果项,ans才是!
	/*Matrix result= Quick_power(N);
	cout << result.m[1][2] << endl;*/
	Quick_power(N);
	cout << ans.m[1][2] << endl;
	return 0;
}

欢迎批评指正!

你可能感兴趣的:(快速幂)