【TinyInventions-01】Python 不需要下载任何第三方包计算行列式

测试环境:

Python 3.12.4

PyCharm Community Edition 2024.1.4

依赖的 Python 内置模块函数:

random.randint

准备工作:

1.定义阶乘;

阶乘定义有很多种方法,如果你想使用其他方法,可参考这篇文章:

Python计算阶乘(5种方法)_用python编写阶乘函数-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_52651466/article/details/120231273

代码示例:
    def factorial(arg: int) -> int | None:
        if arg < 0:
            return None
        elif arg == 0 or arg == 1:
            return 1
        elif arg > 1:
            return arg*factorial(arg-1)

2.定义逆序数。

    def inverse_ordinal_number(arg: list[int]) -> int:
        inversions = 0
        for i in range(len(arg)):
            for j in range(i+1, len(arg)):
                if arg[i] > arg[j]:
                    inversions += 1
        return inversions

计算行列式:

重构:

为使代码整齐,我将以上两个函数放在类 Determinant 中,主方法为 determinant:
类代码:
class Determinant:
    from random import randint
    @classmethod
    def inverse_ordinal_number(cls, arg: list[int]) -> int:
        inversions = 0
        for i in range(len(arg)):
            for j in range(i+1, len(arg)):
                if arg[i] > arg[j]:
                    inversions += 1
        return inversions

    @classmethod
    def factorial(cls, arg: int) -> int | None:
        if arg < 0:
            return None
        elif arg == 0 or arg == 1:
            return 1
        elif arg > 1:
            return arg*cls.factorial(arg-1)

    def determinant(self, order: int, array: list[list[float]]):
        addth = 0
        result = 0
        random_list_list: list[list[int]] = []
        while addth < self.factorial(order):
            re = 1
            random_list: list[int] = []
            while len(random_list) < order:
                ran = self.randint(0,order-1)
                if ran not in random_list:
                    random_list.append(ran)
            if random_list not in random_list_list:
                addth += 1
                random_list_list.append(random_list)
                for i in range(0, order):
                    re*=array[i][random_list[i]]
                re*=(-1)**self.inverse_ordinal_number(random_list)
                result += re
        return result
调用示例:
print(Determinant().determinant(4, [[4,5,6,3],
                                    [7,8,9,3],
                                    [1,2.9,10,3],
                                    [1,2,5,8]]))

备注:

*其中第一个参数为行列式的阶数,第二个参数为行列式数组,使用时需注意使第一个参数值,第二个参数的长度值和第二个参数元素的长度值保持一致。
**受计算精度影响,计算结果在小数点第 N 位可能会出现误差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值