# How to express boolean polynomials by special form

If I have boolean polynomials like

x_1 * x_2 + x_1*x_3* x_5 + x_3 + x_7*x_2


then given a variable x_1, how can I represent it as

x_1 * (x_2 + x_3*x_5) + (x_3 + x_7*x_2)


using Sage?

In general, I want to find a way to represent a form of a * x_1 + c, where a is the linear combination of multiples of x_1 and c is the rest polynomial.

edit retag close merge delete

Sort by » oldest newest most voted

There is a dedicated method for that for polynomials other than boolean in Sage.

Sadly it is not available for boolean polynomials, for a silly reason: they lack a dict method that would return a dictionary whose keys would be monomials and values would be coefficients.

I opened Sage Trac ticket 31198 for that.

The workaround is to write a small function to achieve that.

def as_poly(p, z):
r"""
Print p as a polynomial in z
"""
a = p / z
c = p - a*z
print(f'({a})*{z} + ({c})')


Usage:

sage: P = BooleanPolynomialRing(8, 'x')
sage: x = P.gens()
sage: p = x * x + x * x * x + x + x * x
sage: p
x1*x2 + x1*x3*x5 + x2*x7 + x3
sage: as_poly(p, x)
(x2 + x3*x5)*x1 + (x2*x7 + x3)

more