| 1 | initial version |
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[0])=True bool(xy1[0] != 0)=True
k=0 j=1 bool(xy1[1])=True bool(xy1[1] != 0)=True
k=1 j=0 bool(xy1[0])=False bool(xy1[0] != 0)=True
k=1 j=1 bool(xy1[1])=False bool(xy1[1] != 0)=True
So, for k=1 the condition xy1[0] != 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[0]), 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.
Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.