-1

Cで大きな整数を処理する方法GMPは、大きな整数を処理できるようにするパッケージであることを私は知っています。

ただし、各要素の長さが1000ビットである500×500の行列を検討しています。誰かがCまたはPythonのどのパッケージで逆行列を計算できるか教えてもらえますか?

4

2 に答える 2

1

casevh が指摘したように、これはおおよその答えが必要か正確な答えが必要かによって大きく異なります。

このサイズの行列の正確な逆行列を計算するのに適している可能性がある C ライブラリには、FLINTPARI、およびIMLが含まれます。FLINT は、1000 ビットのエントリを持つランダムな n 行 n 列の整数行列を反転するのに、次のように時間がかかります。

n = 13: 1.6 秒

n = 62: 37 秒

n = 125: 858 秒

したがって、n = 500 には約 120 時間かかります。

于 2013-01-14T08:02:30.030 に答える
0

あなたの質問から、1000 ビットの精度で浮動小数点数を使用して逆数を計算しようとしているかどうか、または分数を使用するかどうかはわかりません。

前者の場合、 mpmathgmpyの組み合わせを試してみます。次の例では、100 ビットの精度でランダムな 3x3 行列を作成し、逆行列を計算します。

>>> from mpmath import *
>>> mp.prec = 100
>>> a = randmatrix(3)
>>> a**-1
matrix(
[['-2.9551532644739824344170194538', '-2.30592481828272627130234272', '4.618043964228917637573009707'],
 ['12.025269724235234315848646394', '3.3570351961866008157001332066', '-10.59068013761452569858474265'],
 ['-6.672524995207041946321450867', '-0.57061969261482431665347164675', '5.508560423258977568243759022']])
>>> a * a**-1
matrix(
[['1.0', '-3.8920288101260775500720697474e-34', '5.467369412738327810686299975e-34'],
 ['-2.0267823641769153744296258652e-33', '1.0', '-1.4939276515262026082238333732e-33'],
 ['-2.1979577599335336964264104571e-33', '-6.0264087812469052430270713117e-34', '1.0']])
>>> 

注: mpmath 0.17 は gmpy でのみ動作します。gmpy2 (次のメジャー リリース) を使用するには、mpmath のソース リポジトリを使用する必要があります。

正確な有理逆数が必要な場合は、sympyを試すことができます。分数のサイズが大きくなり、浮動小数点の逆数よりもはるかに遅くなることが懸念されます。sympy は舞台裏で mpmath と gmpy を使用します。

于 2013-01-12T04:04:31.810 に答える