【线性代数/计算复杂性理论】积和式的指数时间算法:Ryser算法

积和式是矩阵函数的一种,类似行列式但不含符号变化。Ryser算法利用容斥原理在指数时间复杂度内计算积和式,通过枚举列的组合并修正项来得到结果。文章介绍了积和式的定义,Ryser算法的思路及C++实现,以及算法的时间复杂度。

一、积和式的定义

积和式(permanent)是一种和行列式长得很像的矩阵函数。在介绍积和式之前,我们先看看行列式(determinant)的定义。

首先需要引入“排列”(permutation)的概念。对于集合 S = { 1 , 2 , ⋯   , n } S=\{1,2,\cdots,n\} S={ 1,2,,n},它的一个排列 σ \sigma σ就是对 S S S中元素的一个重排。 σ \sigma σ的第 i i i个元素记作 σ i \sigma_i σi。例如,对于 n = 5 n=5 n=5,我们令 σ = { 2 , 5 , 1 , 4 , 3 } \sigma=\{2,5,1,4,3\} σ={ 2,5,1,4,3},则 σ 3 = 1 \sigma_3=1 σ3=1 σ 5 = 3 \sigma_5=3 σ5=3

排列的逆序对就是 a a a b b b前面但 σ a > σ b \sigma_a>\sigma_b σa>σb的情况。例如 σ = { 2 , 1 , 3 , 5 , 4 } \sigma=\{2,1,3,5,4\} σ={ 2,1,3,5,4},有两个逆序对: ( σ 1 , σ 2 ) = ( 2 , 1 ) (\sigma_1,\sigma_2)=(2,1) (σ1,σ2)=(2,1) ( σ 4 , σ 5 ) = ( 5 , 4 ) (\sigma_4,\sigma_5)=(5,4) (σ4,σ5)=(5,4)。一个排列 σ \sigma σ中逆序对的个数记作 τ ( σ ) \tau(\sigma) τ(σ)。令 s g n ( σ ) = ( − 1 ) τ ( σ ) \mathrm{sgn}(\sigma)=(-1)^{\tau(\sigma)} sgn(σ)=(1)τ(σ)。对于一个排列 σ \sigma σ,如果你把其中的两个数互换,则 s g n ( σ ) \mathrm{sgn}(\sigma) sgn(σ)会变号。所有 n n n个元素的排列的集合记作 S n S_n Sn。例如, S 3 = { ( 1   2   3 ) , ( 1   3   2 ) , ( 2   1   3 ) , ( 2   3   1 ) , ( 3   1   2 ) , ( 3   2   1 ) } S_3=\{(1\ 2\ 3),(1\ 3\ 2),(2\ 1\ 3),(2\ 3\ 1),(3\ 1\ 2),(3\ 2\ 1)\} S3={(1 2 3),(1 3 2),(2 1 3),(2 3 1),(3 1 2),(3 2 1)}

给定一个 n × n n\times n n×n的矩阵 A = ( a i j ) n × n A=(a_{ij})_{n\times n} A=(aij)n×n,它的行列式为 det ⁡ ( A ) = ∑ σ ∈ S n ( s g n ( σ ) ∏ i = 1 n a i , σ i ) \det(A)=\sum\limits_{\sigma\in S_n}\left(\mathrm{sgn}(\sigma)\prod\limits_{i=1}^{n}a_{i,\sigma_{i}}\right) det(A)=σSn(sgn(σ)i=1nai,σi)例如,当 n = 3 n=3 n

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值