# Revision history [back]

Yes, sometimes one has to oblige the machine to simplify! Consider the following code:

var('c')
mat = matrix( [[1,0], [0,c]] )
xy0 = vector( [c,1] )
r0  = -mat*xy0
p0  = r0

for k in range(2):
la  = r0*p0/(p0*mat*p0)
xy1 = xy0 + la*p0

# xy1 = xy1.simplify_full()   # <<<<<<<<< inserted this command
for j in range(2):
print ( "k=%(k)s j=%(j)s bool(xy1[%(j)s])=%(bool1)s bool(xy1[%(j)s] != 0)=%(bool2)s"
% {'k': k, 'j': j, 'bool1': bool(xy1[j]), 'bool2': bool(xy1[j] != 0)} )
if xy1[j]:    # changed!
xy1[j] = xy1[j].factor()

r1  = r0 - la*mat*p0
p1  = r1 + r1*r1/(r0.dot_product(r0))*p0
p1  = p1.simplify_full()
p0  = p1
r0  = r1
xy0 = xy1
print


Results:

k=0 j=0 bool(xy1)=True bool(xy1 != 0)=True
k=0 j=1 bool(xy1)=True bool(xy1 != 0)=True

k=1 j=0 bool(xy1)=False bool(xy1 != 0)=True
k=1 j=1 bool(xy1)=False bool(xy1 != 0)=True


So, for k=1 the condition xy1 != 0 is above True, since "at the first glance" the code is not completely evaluated. But using xy1[j] instead in the if-condition makes sage convert it to a boolean, and this conversion computes bool(xy1), which is False. (The error comes in the if-block than immediately from factoring the zero.)

Moral: Write the code in a "solid way", understand and test the if-conditions for the given purpose. Sage was at some places educated to do the "quick thing", since always applying the full simplification may not be what we want.