2016-05-02 10 views
2

あるプロジェクトでは、sympyを使って他の関数をモジュロにして式を計算しています。これらの関数はすべてバイナリ係数を持ちます(x^2 + 2x = x^2$)。彼らのアプリケーションはGalois Fieldsにあります。sympyの関数のモジュラ逆

私の問題は、(例えば、x**-1用)の逆数とのsympy rem機能を使用する場合、単純であるというモジュラー逆を返すよりも数(したがって、この場合に答えがある1/x)の逆を返すということです。

以下のコメントのため、ここでさらに明確にします。私がやっているの単純化しすぎたバージョンです:

from sympy import * 
x = symbols('x') 
f = raw_input() #here f = '(x^3 + x)*(x + 1)^2 + (x^2 + x)/(x^3) + (x)^-1' 
expand(f) 
>>> x**5 + 2*x**4 + 2*x**3 + 2*x**2 + x + 2/x + x**(-2) 

#this is what I'm currently doing 
rem(expand('(x^3 + x)*(x + 1)^2 + (x^2 + x)/(x^3) + (x)^-1'), 'x^2') 
>>> x + 2/x + x**(-2) 
#not the answer I am looking for, as I want all the degrees to be positive 

この剰余関数は、MOD関数として機能していない(すなわちxの正の力としてのものを維持しない)、と私は見つけようとしていますそれを置き換える。私はinverse modsを検索する式を解析するのを避けたいだけで、関数をそれ自身で扱うようにしたい。私はパラメータがないかもしれないし、まったく異なる機能を見ているかもしれない。

PS:式を計算する能力が別の式を計算する一方で、sympyが私たちの目的には十分であるがコードを保存しないでテストしているので、当時。

+0

独自の関数を記述できますか?もしそうなら、[この質問](http://stackoverflow.com/questions/4798654/mo​​dular-multiplicative-inverse-function-in-python)をチェックしてください。 –

+1

また、[この方法](http://docs.sympy.org/0.6.7/modules/polynomials.html#sympy.polys.Poly.invert)はあなたが探しているものですか? –

+0

正確ではありません。私は何かを明確にするために私の質問を編集しますが、基本的には:表現が複雑かもしれないので、文字列全体を解析して逆をチェックしなければならないという問題を回避しようとしています。それ。これが不可能な場合は、私が明らかにあなたが提案したことをする必要がありますが、私はそれが可能であると考え、したがって質問します。 –

答えて

1

まず、文字列をsympifyのSymPy式にすぐに変換する方がよいでしょう。 SymPy関数に文字列を渡すのは悪い習慣です。

x + 1/xのような多項式を使用すると、SymPyはこれを多項式として扱います(x1/x)。

In [73]: Poly(x + 1/x) 
Out[73]: Poly(x + (1/x), x, 1/x, domain='ZZ') 

私はratsimpmodprimeと思っています。 domain=GF(2)も渡すことができるはずですが、動作しないようなバグがあるようです。