计算矩阵的第n个功率
Calculate nth power of a matrix
我正在尝试优化代码以计算矩阵的第n个功率。
我只打电话给multiplySquare
n
次,但这太慢了。问题是,它的构建良好,但是当我运行它时,我会在退出值1
中获得故障。我相信我的算法是对的,所以是什么原因造成的?
[edit]添加了递归终止条件,但我仍然有相同的错误。
[再次编辑]我再次重新编写了递归部分,现在似乎有效,但仅适用于n
的某些输入。我必须更多地玩它。任何帮助,将不胜感激。
void multiplySquare(long long A[2][2], long long B[2][2]){
long long result[2][2];
for (int i = 0; i < 2; i++){
for (int j = 0; j < 2; j++){
result[i][j] = 0;
for (int k = 0; k < 2; k++){
result[i][j] += A[i][k] * B[k][j];
}
}
}
for (int i=0; i<2; i++){
for (int j=0; j<2; j++){
A[i][j] = result[i][j];
}
}
}
void power(long long A[2][2], long long B[2][2], long long n){
if(n/2 != 0){
power(A, B, n/2);
}
if(n%2 != 0){
multiplySquare(A, B);
}
}
计算 N
的算法有效地 x
的电源是:
如果N
为零,请返回1
。
如果N
是1,请返回x
。
计算(N/2)
-电源。y = x^(N/2)
如果N
均匀,返回y*y
如果N
奇数,请返回x*y*y
如果将该逻辑转换为案例,则需要以下内容:
// Assuming that the result is returned in B.
void power(long long A[2][2], long long B[2][2], long long n)
{
if ( n == 0 )
{
makeIdentity(B);
return;
}
if ( n == 1 )
{
assign(A, B); // Make B same as A.
return;
}
power(A, B, n/2);
multiplySquare(B, B);
if(n % 2 != 0)
{
multiplySquare(B, A);
}
}
我正在尝试优化我的代码以计算矩阵的第n个功率。
由于您的目标是优化,因此认为对角线矩阵具有微不足道的第n个功率,即主角元素的n-th-th-th-th-th-th-th-th-th-th-in-power。
。因此,首先,您应该对角线矩阵。一种方法是找到您的初始矩阵,a的特征向量和特征值,并利用以下关系:
a = p d p -1
其中p是包含A,p -1 的(列(特征向量的矩阵 是它的逆,d是包含特征值的对角线矩阵。
然后:
上述方程式:
- 将一个升至第n个力量的地方很琐碎。
- 计算第n个功率。
- 返回原始位置。
看来您的摘要不是您的目标。我猜想你的意思是这样的:
void power(long long A[2][2], long long B[2][2], long long n){
if (n == 1) {
multiplySquare(A, B);
}
else if(n % 2 == 0) {
power(A, B, n / 2);
multiplySquare(A, A);
}
else {
power(A, B, (n - 1) / 2);
multiplySquare(A, A);
multiplySquare(A, B);
}
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何编写计算功率的循环
- 计算矩阵的第n个功率
- 计算"power of 2"数字使用的功率的最快方法?
- 在C++中,是否有内置的方法来计算编译时的功率
- 用mpz_powm计算功率mod
- C++中的OpenCV——图像L波段功率的计算
- 用c++的递归函数计算功率
- 计算和存储非常大的数字功率