Ask Your Question
1

Sage not detecting integers in Boolean Polynomial Ring?

asked 2019-01-04 05:54:41 +0100

Stockfish3709 gravatar image

updated 2023-01-09 23:59:49 +0100

tmonteil gravatar image

Hi all,

I'm trying to do a detecting system for terms in the equations used in a polynomial. I'm using Boolean Polynomials here.

Here's is my code. This prints all the terms of the equations.

P.<x,y,z> = BooleanPolynomialRing(3, order = 'lex')
equations = [x+y+z-1, y*z, x+z]
for i in range(len(equations)):
    for j in equations[i]:
        print j

Output: 
x
y
z
1
y*z
x
z

As you can see, 1 appears in the output. However, when I implement this logic onto it, the output is empty.

for i in range(len(equations)):
    for j in equations[i]:
        if j == 1:
            print 'true'

It's not like the logic doesn't work, if I change '1' to 'x', my logic works.

for i in range(len(equations)):
    for j in equations[i]:
        if j == x:
            print 'true'

Output:
true
true

What am I doing wrong here?

edit retag flag offensive close merge delete

Comments

Note: instead of

for i in range(len(equations)):
    for j in equations[i]:
        if j == 1:
            print 'true'

you could use

for eq in equations:
    for j in eq:
        if j == P.one():
            print('true')
slelievre gravatar imageslelievre ( 2019-01-05 11:53:24 +0100 )edit

1 Answer

Sort by ยป oldest newest most voted
2

answered 2019-01-04 10:21:23 +0100

rburing gravatar image

updated 2019-01-04 15:04:20 +0100

The problem can be seen as follows:

sage: list(P(1))
[1]
sage: list(P(1))[0]
1
sage: list(P(1))[0] == 1
False
sage: type(list(P(1))[0])
<type 'sage.rings.polynomial.pbori.BooleanMonomial'>

When you convert a BooleanPolynomial to a list (which you do implicitly by iterating with in), the elements are of type BooleanMonomial, which apparently do not have comparison with the integer 1 implemented (which is probably not intentional but an oversight; I will report it).

A workaround is: when you want to compare with a constant such as 1, first convert it into the right ring (or other parent object):

sage: list(P(1))[0] == P(1)
True

So the workaround is to compare to P(1) instead of 1.

Edit: I submitted this as trac ticket #27019.

edit flag offensive delete link more

Comments

2

Even better: use P.one() instead of P(1).

slelievre gravatar imageslelievre ( 2019-01-05 11:50:44 +0100 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2019-01-04 05:54:41 +0100

Seen: 456 times

Last updated: Aug 26 '19