Sympy:在有限域中求解矩阵

Posted

技术标签:

【中文标题】Sympy:在有限域中求解矩阵【英文标题】:Sympy: Solving Matrices in a finite field 【发布时间】:2015-09-20 07:32:16 【问题描述】:

对于我的项目,我需要在给定矩阵 Y 和 K 的情况下求解矩阵 X。(XY=K) 每个矩阵的元素必须是模数为随机 256 位素数的整数。我第一次尝试解决这个问题时使用了 SymPy 的 mod_inv(n) 函数。这样做的问题是我的内存不足,矩阵大小约为 30。我的下一个想法是执行矩阵分解,因为这可能会减少内存的负担。但是,SymPy 似乎不包含可以找到模数矩阵的求解器。我可以使用任何解决方法或自制代码吗?

【问题讨论】:

【参考方案1】:

sympyMatrix 类支持模逆。这是一个模 5 的示例:

from sympy import Matrix, pprint

A = Matrix([
    [5,6],
    [7,9]
])

#Find inverse of A modulo 26
A_inv = A.inv_mod(5)
pprint(A_inv)

#Prints the inverse of A modulo 5:
#[3  3]
#[    ]
#[1  0]

用于查找行缩减梯形的rref 方法支持关键字iszerofunction,它指示矩阵中的哪些条目应被视为零。我相信预期用途是为了数值稳定性(将小数字视为零),尽管我不确定。我已经将它用于模块化减少。

这是一个模 5 的示例:

from sympy import Matrix, Rational, mod_inverse, pprint

B = Matrix([
        [2,2,3,2,2],
        [2,3,1,1,4],
        [0,0,0,1,0],
        [4,1,2,2,3]
])

#Find row-reduced echolon form of B modulo 5:
B_rref = B.rref(iszerofunc=lambda x: x % 5==0)

pprint(B_rref)

# Returns row-reduced echelon form of B modulo 5, along with pivot columns:
# ([1  0  7/2  0  -1], [0, 1, 3])
#  [                ]
#  [0  1  -2   0  2 ]
#  [                ]
#  [0  0   0   1  0 ]
#  [                ]
#  [0  0  -10  0  5 ]  

这是正确的,只是rref[0] 返回的矩阵仍然包含 5 和分数。通过取 mod 并将分数解释为模逆来处理这个问题:

def mod(x,modulus):
    numer, denom = x.as_numer_denom()
    return numer*mod_inverse(denom,modulus) % modulus

pprint(B_rref[0].applyfunc(lambda x: mod(x,5)))

#returns
#[1  0  1  0  4]
#[             ]
#[0  1  3  0  2]
#[             ]
#[0  0  0  1  0]
#[             ]
#[0  0  0  0  0]

【讨论】:

注意:此功能并不总是有效。一个例子是 Z_5 中的 Matrix([[4,3,1,3],[2,4,1,3]])。在这种情况下,使用 lambda x: x % 5 == 0 的常规 iszerofunc 调用会给出一个分母包括 5 的矩阵。由于在 Z_5 中没有 5 的逆矩阵,因此程序将退出。 @brunston 在 Sympy 1.6 中,这个例子现在可以工作了! (正如您在 Sympy 1.0 中描述的那样,它失败了)。我从来没有研究过为什么这个例子在 1.0 中失败了,所以我不能肯定地说所有例子现在都可以工作,但是很高兴这个方法现在看起来更可靠了。 (我也不确定这开始工作的版本。)

以上是关于Sympy:在有限域中求解矩阵的主要内容,如果未能解决你的问题,请参考以下文章

将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是啥

如何创建符号矩阵并用 sympy 批量替换?

在有限内存上对大型矩阵进行矩阵运算

Python sympy做代数运算解Cholesky求逆的L和L逆矩阵示例

Python sympy做代数运算解Cholesky求逆的L和L逆矩阵示例

矩阵方程。 AX=B B在啥情况下一定有解