用c++实现对高阶行列式的求值

博主刚刚开始学习线性代数,无奈高阶行列式太难算了,便打算用电脑来计算这种重复工作。
方法如图
在这里插入图片描述
(博主debug一年后)下面给出了代码

#include<iostream>
using namespace std;
double deter[10][10];                      //存储行列式的值
int n, p[11], hashtable[11] = { 0 };       //全排列用到的数组和哈希数组
double caching = 1;                        //储存每一个多项式的值
double answer = 0;                         //最终答案
void generatep(int index=1);               //递归全排列&行列式计算过程
int reverse_ordinal(int* p, int n);        //求一个数列的逆序数
int main()
{
    cout << "请输入行列式的阶级数\n";
    cin >> n;                                  //输入阶级
    cout << "输入行列式\n";
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin>>deter[i][j];                  //输入行列式
    generatep();
    cout << answer;
    return 0;
}
void generatep(int index)    //递归全排列&行列式计算过程
{                                  //递归看不懂的建议先看看递归法求全排列
    if (index == n + 1)
    {
        for (int i = 1,j = 0; i <= n; i++,j++)
        {
            caching *= deter[j][p[i]-1];          //p储存了每一行要选择的元素的位置,在这里把a_i1到a_in乘在一起
        }
        answer += reverse_ordinal(p,n)*caching;    //把乘好的多项式相加,reverse_ordinal(p,n)通过逆序数判断正负
        caching = 1;
        return;
    }
   
    for (int x = 1; x <= n; x++)  
    {
        if (hashtable[x] == 0)
        {
            p[index] = x;
            hashtable[x] = 1;
            generatep(index + 1);
            hashtable[x] = 0;
        }
    }
}
int reverse_ordinal(int* p, int n)           //这里博主因为实力有限就用暴力法求逆序列了,热心的小伙伴自己可以去优化下
{
    int i, j;
    int amount = 0;
    for (i = 1; i <= n; i++)
        for (j = i; j <= n; j++)
        {
            if (p[i] > p[j])
                amount++;
        }
    if (amount % 2 == 0)
        return 1;
    else
        return -1;
}

看完后小伙伴们肯定收获了不少,点个赞再走吧!

发布了2 篇原创文章 · 获赞 3 · 访问量 126

猜你喜欢

转载自blog.csdn.net/rangke/article/details/104660207