对于我的项目,我需要求矩阵X给定矩阵Y和K.(XY = K)每个矩阵的元素必须是以随机256位素数为模的整数。我首次尝试解决此问题时使用了SymPy的mod_inv(n)
函数。这个问题是我用大约30的矩阵耗尽了内存。我的下一个想法是执行矩阵分解,因为它可能对内存不太重。但是,SymPy似乎不包含可以找到模数的矩阵的求解器。我可以使用任何变通办法或自制代码吗?
答案 0 :(得分:6)
sympy
的{{1}}类支持模块化反转。这是模5的示例:
Matrix
用于查找行缩减梯形表单的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
,该关键字指示矩阵中的哪些条目应被视为零。我相信预期的用途是数值稳定性(将小数字视为零),但我也用它来模块化减少。
以下是模5的示例:
iszerofunction
这是正确的,除了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 ]
返回的矩阵仍然有5个和分数。通过将mod和解释分数作为模块化反转来处理这个问题:
rref[0]