Python计算n阶行列式的值

本文将使用Python编写程序计算n阶行列式的值,不借助第三方库;

n阶行列式的定义

一个n阶行列式可以简单定义为:

Python求n阶行列式的值

其中 p1 p2 p3 ... pn 为自然数 1,2,...,n 的一个排列;t 为这个排列的逆序数;

计算n阶行列式

程序可计算1~n阶行列式:

def permute(nums):
    #生成n个元素的全排列
    length = len(nums)

    permutations = []

    def _permute(index=0):

        if index == length:
            permutations.append(nums[0:length])
        
        for i in range(index,length):
            nums[i],nums[index] = nums[index],nums[i]
            _permute(index+1)
            nums[i],nums[index] = nums[index],nums[i]
            
    _permute()

    return permutations


def inversion_number(nums):
    #计算排列的逆序数
    count = 0
    for i in range(len(nums)):

        for j in range(i):

            if nums[j] > nums[i]:

                count += 1

    return count

def calculate(det):
    #计算n阶行列式的值

    if not det:#没有元素
        return 0

    if len(det) == 1:#一阶行列式直接返回值
        return det[0]
    
    #生成 1,..., n的全排列
    permutations = permute([i for i in range(1,len(det)+1)])

    result = 0

    for p in permutations:
        #t为逆序数
        t = inversion_number(p)
        product = (-1)**t
        i = 0
        for pn in p:
            product *= det[i][pn-1] #连乘
            i+=1

        result += product #连加

    return result


A = []
A.append([1]) #1阶行列式
A.append(
    [
        [1,2],
        [3,4]
    ]) #2阶行列式

A.append(
    [
        [1,2,3],
        [4,5,6],
        [7,8,9]
    ]) #3阶行列式

for det in A:
    print("Input:")
    for i in det:
        print(i)
    print("value:",calculate(det),"\n")

运行效果

Input:
1
value: 1

Input:
[1, 2]
[3, 4]
value: -2

Input:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
value: 0

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/p/the-nth-order-determinant-in-python.html

分类: 计算机技术
推荐阅读:
MySQL ADDTIME() 函数 ADDTIME()函数将一个时间增加到另一个时间上,并返回结果;
TypeError: unsupported format string passed to test.__format__ 在Python中,如果对未定义__format__()方法的对象使用format()函数,就会造成TypeError: unsupported format string passed to test.__format__错误;
Golang中如何表示无穷大 在Golang中,可以使用math包中的Inf函数来表示无穷大;具体来说,使用math包中的Inf(1)表示正无穷大,Inf(-1)表示负无穷大。
Rust使用莱布尼茨公式计算圆周率 莱布尼茨公式是一种用于计算圆周率的无限级数。该公式的形式如下:pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ... 通过对无限级数进行逐项求和,可以逐步逼近圆周率的值。在 Rust 中,可以使用循环和累加器来计算莱布尼茨级数的前N项和。
Golang中的布尔(bool)类型 go语言中的布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。
Linux一条命令删除文件中的重复项 在Linux系统中,如果你想给一个包含重复项(以行为一个单位)的文件去重,那么你只需要一条命令即可实现;