2016-05-02 4 views
2

Для определенного проекта я использую sympy для вычисления выражений по модулю другой функции. Все эти функции имеют двоичные коэффициенты (так x^2 + 2x = x^2$). Их применение находится в Galois Fields.Модульный инвертор функции в sympy

Моя проблема заключается в том, что при использовании в 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 

Эта функция остальное не действует как мода функции (т.е. не держать вещи, как положительных степеней x), и я пытаюсь найти замените его. Я хочу, чтобы избежать разбора в выражении, ищущем обратные моды, и просто иметь дело с тем, что на нем. Мне может не хватать параметр или просто смотреть на совершенно другую функцию.

PS: Я знаю, что способность вычислять выражение по другому выражению, одновременно обрабатывая инверсии как модульные инверсии, существует в sympy, поскольку я это делал, проверяя, что sympy будет достаточно для наших целей, но не сохранил код Тогда.

+0

Можете ли вы написать свою собственную функцию? Если да, проверьте [этот вопрос] (http://stackoverflow.com/questions/4798654/modular-multiplicative-inverse-function-in-python). –

+1

Кроме того, [этот метод] (http://docs.sympy.org/0.6.7/modules/polynomials.html#sympy.polys.Poly.invert) что вы ищете? –

+0

Не совсем. Я отредактирую свой вопрос, чтобы прояснить что-то, но в основном: я стараюсь избегать проблем с синтаксическим анализом всей строки, чтобы проверить обратные, поскольку выражение может быть сложным, и я хочу оценить все Это. Если это невозможно, мне, очевидно, придется делать то, что вы предложили, но я думаю, что это возможно, следовательно, вопрос. –

ответ

1

Во-первых, лучше сразу преобразовать вашу строку в выражение SymPy с помощью sympify. Передача строк в функции SymPy - плохая практика.

При использовании полинома, такого как x + 1/x, SymPy рассматривает это как многочлен от x и 1/x.

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

Я считаю, ratsimpmodprime делает то, что вы хотите. Вы также должны пройти domain=GF(2), но, похоже, есть некоторые ошибки, которые мешают этому работать.

Смежные вопросы