Как использовать Sympy для автоматического упрощения выражений над двузначным конечным полем? - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь построить многочлены над двузначным конечным полем {0, 1}, и я хочу, чтобы они автоматически упрощались с использованием некоторых тождеств, существующих в этом параметре.

Я пробовал следующее:

    from sympy import *
    from sympy.polys.domains.finitefield import FiniteField
    x, y, z, t = symbols('x y z t')

    k = Poly(x+y * z*z + (x + y) + y + 1, domain=FiniteField(2))

Это уже упрощается до:

Poly(y*z**2 + 1, x, y, z, modulus=2)

Однако z ** 2 фактически совпадает с z в поле, которое я хочу использовать. Кажется, он автоматически распознает, что y + y = 0. Как я могу реализовать другую идентичность, z * z = z (идемпотентность)?

1 Ответ

0 голосов
/ 21 июня 2019

То, что вы хотите, кажется, не реализовано для поли, но, возможно, вы можете смоделировать эффект:

In [54]: normalise = lambda p: Poly(ratsimpmodprime(p, [n**2-n for n in p.free_symbols]), modulus=2)                                                                                                               

In [55]: e = x+y * z*z + (x + y) + y + 1                                                                                                                                                                           

In [56]: normalise(e)                                                                                                                                                                                              
Out[56]: Poly(y*z + 1, x, y, z, modulus=2)
...