sympy中函数的模块化逆转

时间:2016-05-02 16:34:41

标签: python sympy

对于某个项目,我使用sympy来计算以另一个函数为模的表达式。这些函数都具有二进制系数(所以x^2 + 2x = x^2$)。他们的应用是在Galois Fields。

我的问题是,当使用带有反转的sympy rem函数(例如x**-1)时,只返回数字的倒数(所以在这种情况下答案是{{1}而不是返回模块化逆。

由于以下评论,这里有一些进一步的澄清。我正在做的过于简单的版本是:

1/x

这个余数函数不作为mod函数(即不将事物保持为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 的正幂),并且我试图找到它的替代品。我想避免通过搜索反向mods的表达式进行解析,只是让函数处理它自己的那个。我可能会错过一个参数,或者只是看一个完全不同的函数。

PS:我知道计算表达式修改另一个表达式的能力,同时将反转处理为模块化反转,因为我在测试时这样做是为了我们的目的但是没有保存那时的代码。

1 个答案:

答案 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),但似乎有一些错误阻止了它的工作。