微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何避免大元素计算矩阵行列式溢出

如何解决如何避免大元素计算矩阵行列式溢出

我将在 Python 中计算随机二维矩阵 (G) 的行列式。该矩阵的大小约为 30 x 30,其中每个元素都是使用 random.randrange(0,P)(例如 P= 2^160 - 47)从具有特征 P 的大型素数域中随机选择的。问题是,当我使用 scipy 和 numpy 的 det 命令时,它们返回 inf。找到行列式后,我想在素数域中找到答案,即 det(G)% P

有没有办法计算这个?提前致谢。

这是一个示例代码

import numpy as np
import random
from scipy.linalg import det
N= 30
p = 2**160 - 47
G = np.zeros((N,N))
    
for i in range(N):
   for j in range(N):
      G[i][j] = random.randrange(0,p)

ans = det(G)%p

解决方法

NumPy 不是解决此问题的正确工具。您需要一个可以处理任意大整数的库。一种选择是SymPy。 SymPy 甚至具有可以生成随机矩阵的函数 randMatrix。例如,

import random
from sympy import randMatrix


N = 30
p = 2**160 - 47

G = randMatrix(N,min=0,max=p-1)

ans = G.det() % p
print(ans)

典型的运行打印

381271413373650154061019607002336594108159531272

在调用 randMatrix 时,我使用了 max=p-1,因为 randMatrix 的文档字符串暗示函数 random.Random.randint 将用于生成矩阵中的随机条目,并且该函数在可能的随机值中包含 maxrandrange 不包括 max

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。