numpyのlinalg.matrix_powerをモジュロで使用して、要素が特定の値よりも大きくならないようにすることはできますか?モジュロを持つナンビ行列パワー/指数?
答えて
オーバーフローを防止するために、あなたが最初にあなたの入力番号のそれぞれの剰余を取る場合は、同じ結果を得るという事実を使用することができます。実際には:行列M
ため
(M**k) mod p = ([M mod p]**k) mod p,
。行列の加算と乗算はスカラー加算と乗算で表現することができますので、
(x+y) mod p = ([x mod p]+[y mod p]) mod p # All additions can be done on numbers *modulo p*
(x*y) mod p = ([x mod p]*[y mod p]) mod p # All multiplications can be done on numbers *modulo p*
同じアイデンティティ、同様の行列のために保持する:これは、整数x
とy
のための有効な次の二つの基本的なアイデンティティは、から来ています。これにより、小さな数値だけが指数化され(n mod pは一般にnよりもずっと小さくなります)、オーバーフローを起こす可能性は非常に低くなります。 NumPyでは、を得るには、
((arr % p)**k) % p
を取得するだけです。
まだ十分でない場合(n mod p
が小さいにもかかわらず[n mod p]**k
がオーバーフローするリスクがある場合)、累乗を複数の累乗に分割することができます。収量
(n**[a+b]) mod p = ([{n mod p}**a mod p] * [{n mod p}**b mod p]) mod p
と
(n**[a*b]) mod p = ([n mod p]**a mod p)**b mod p.
上記の基本的なアイデンティティがこのように、あなたはa+b+…
またはa*b*…
またはそれらの任意の組み合わせとしてパワーk
を破ることができます。上記のアイデンティティを使用すると、小さい数値の累乗だけを小数で実行できるため、整数のオーバーフローのリスクが大幅に低下します。 numpyのの実装を使用して
明白なアプローチで何が問題になっていますか?
など。
import numpy as np
x = np.arange(100).reshape(10,10)
y = np.linalg.matrix_power(x, 2) % 50
おそらくOPは大きな指数を使用しており、オーバーフローの問題が発生しています。例えば累乗と累乗を組み合わせたアルゴリズムは、暗号のものの大規模なintでよく使用されます – wim
良い点!私はそれを考えていませんでした。 –
:
https://github.com/numpy/numpy/blob/master/numpy/matrixlib/defmatrix.py#L98
私は剰余項を追加することによって、それを適応。 いつもには、オーバーフローが発生した場合、OverflowError
または他の種類の例外が発生しないというバグがあります。その時点から、解決策は間違っています。バグ報告hereがあります。
ここにコードがあります。慎重に使用:
from numpy.core.numeric import concatenate, isscalar, binary_repr, identity, asanyarray, dot
from numpy.core.numerictypes import issubdtype
def matrix_power(M, n, mod_val):
# Implementation shadows numpy's matrix_power, but with modulo included
M = asanyarray(M)
if len(M.shape) != 2 or M.shape[0] != M.shape[1]:
raise ValueError("input must be a square array")
if not issubdtype(type(n), int):
raise TypeError("exponent must be an integer")
from numpy.linalg import inv
if n==0:
M = M.copy()
M[:] = identity(M.shape[0])
return M
elif n<0:
M = inv(M)
n *= -1
result = M % mod_val
if n <= 3:
for _ in range(n-1):
result = dot(result, M) % mod_val
return result
# binary decompositon to reduce the number of matrix
# multiplications for n > 3
beta = binary_repr(n)
Z, q, t = M, 0, len(beta)
while beta[t-q-1] == '0':
Z = dot(Z, Z) % mod_val
q += 1
result = Z
for k in range(q+1, t):
Z = dot(Z, Z) % mod_val
if beta[t-k-1] == '1':
result = dot(result, Z) % mod_val
return result % mod_val
美しい!ありがとうございます<3 – Rishav
- 1. 行列演算のモジュロ誤差
- 2. matlabの疎な行列のパワー
- 3. 行列を稠密行列の列のパワーにPythonでnumpyを使用
- 4. 重複行を持つ行列の行数を決定する
- 5. 要素の数を持つ行数/列数を調べる
- 6. パワー(C++ - {templates})=パワー(C++)?
- 7. MATLAB - 独立変数を持つ行列関数?
- 8. perlで行列を指数化する
- 9. アセンブリ言語 - モジュロを行う方法?
- 10. iPhone:DSP /フーリエ変換/周波数領域を行うCPUパワー?
- 11. 1つのパラメータを持つonmouseleave関数を指定します。
- 12. 各行のデータを持つ列の数をカウントします。
- 13. R定義された行数と列数を持つ単純な整数行列を生成する
- 14. Javaモジュロ関数がゼロを返す
- 15. Pythonでの行列の指数化
- 16. フレックスデータグリッドの列数が異なる行を持つ
- 17. 各行の動的な列数を持つGridView
- 18. SQLite:シーケンシャル値を持つ複数行のUPDATE列
- 19. phpと複数の配列を持つarray_chunkを持つforeach
- 20. 行番号の列を持つFlex DataGrid
- 21. DataColumn.Expressionパワー
- 22. ヌル値を持つ複数の列/行のIDのレコードを1行に表示
- 23. data.table:行、行ごとに関数を持つ列のサブセットを変換する
- 24. 2つの列(SQL)に同じ値を持つ行を数えるには?
- 25. MySqlが列内の同じ値を持つ複数の行を見つける
- 26. OpenGLの2つのテクスチャのパワー
- 27. 関数とモジュロのJ構文
- 28. 浮動小数点モジュロ演算
- 29. ASP.NET動的な行数と列数を持つリストからテーブルを生成
- 30. 類似の列の値を持つ行の数を数えます。
モジュラスの意味を定義できますか? – Benjamin
モジュラス=剰余演算。 10 mod 3 = 1,24 mod 5 = 4などと同じです。 linalg.matrix_powerは高速ですが、要素が大きくなりすぎる前に要素にモジュラー演算を適用したいと考えています。 –
ああ、モジュロ:http://en.wikipedia。org/wiki/Modulo_operation – Benjamin