【问题标题】:Modular inverse of a function in sympysympy中函数的模逆
【发布时间】:2016-05-02 16:34:40
【问题描述】:

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

我的问题是,当使用带倒数的 sympy rem 函数时(例如 x**-1),只是返回数字的倒数(因此在这种情况下,答案是 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 的正幂),我正在尝试寻找它的替代品。我想避免通过表达式来搜索反向 mods,而只是让函数自己处理它。我可能遗漏了一个参数,或者只是查看了一个完全不同的函数。

PS:我知道 sympy 中存在计算一个表达式 mod 另一个表达式,同时将逆视为模逆的能力,因为我在测试 sympy 是否足以满足我们的目的但没有保存代码时这样做那么。

【问题讨论】:

  • 你能自己写函数吗?如果是这样,请查看this question
  • 另外,this method 是您要找的吗?
  • 不完全是。我将编辑我的问题,以便我清理一些东西,但基本上:我试图避免必须解析整个字符串以检查逆的麻烦,因为表达式可能很复杂,我想评估所有它。如果这是不可能的,我显然必须按照你的建议去做,但我认为这是可能的,因此提出了这个问题。
  • 另外,请注意,我意识到这个 mod (x^2) 的选择是一个糟糕的选择,我只是选择它以便示例不会太长

标签: python sympy


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多