# Problem understanding coercions.

Let :

sage:  w = x^4 - (1+3*i)*x^3 - (2-4*i)*x^2 + (6-2*i)*x - 4 - 4*i

We can try to get its roots by (at least) two means : 1) Solution of a quartic :

sage: S1=[t.rhs() for t in solve(w,x)];S1
[-1/2*sqrt(2*I) + 3/2*I - 1/2, 1/2*sqrt(2*I) + 3/2*I - 1/2, -I + 1, I + 1]
sage: bool(sqrt(2*I)==1+I)
True
sage: S1R=[t.subs({sqrt(2*I):1+I}) for t in S1];S1R
[I - 1, 2*I, -I + 1, I + 1]

2) Roots of a polynom

sage: S2=[SR(t[0]) for t in w.roots(ring=QQbar)];S2
[-1 + 1*I, 2*I, 1 - 1*I, 1 + 1*I]

I am convinced tjat those two solutions are equal. But I fail to convince Sage :

sage: map(lambda t,u:t-u, S1R, S2)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-be2e4183b522> in <module>()
----> 1 map(lambda t,u:t-u, S1R, S2)

<ipython-input-7-be2e4183b522> in <lambda>(t, u)
----> 1 map(lambda t,u:t-u, S1R, S2)

/usr/local/sage-7.0/src/sage/structure/element.pyx in sage.structure.element.RingElement.__sub__ (/usr/local/sage-7.0/src/build/cythonized/sage/structure/element.c:15995)()
1665         cdef long n
1666         if have_same_parent_c(left, right):
-> 1667             return (<ModuleElement>left)._sub_(<ModuleElement>right)
1668         if PyInt_CheckExact(right):
1669             n = PyInt_AS_LONG(right)

/usr/local/sage-7.0/src/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._sub_ (/usr/local/sage-7.0/src/build/cythonized/sage/symbolic/expression.cpp:20844)()
2950                            relational_operator(_right._gobj))
2951         else:
-> 2952             x = gsub(left._gobj, _right._gobj)
2953         return new_Expression_from_GEx(left._parent, x)
2954

1649         elif PyInt_CheckExact(left):
-> 1651         return coercion_model.bin_op(left, right, add)
1652
1653     cdef RingElement _add_long(self, long n):

/usr/local/sage-7.0/src/sage/structure/coerce.pyx in sage.structure.coerce.CoercionModel_cache_maps.bin_op (/usr/local/sage-7.0/src/build/cythonized/sage/structure/coerce.c:9736)()
1067         # We should really include the underlying error.
1068         # This causes so much headache.
-> 1069         raise TypeError(arith_error_message(x,y,op))
1070
1071     cpdef canonical_coercion(self, x, y):

TypeError: unsupported operand parent(s) for '+': 'Number Field in I with defining polynomial x^2 + 1' and 'Algebraic Field'

However, both lists are composed of some things seemongly belonging to SR :

sage: map(lambda t:type(t), S1R)
[<type 'sage.symbolic.expression.Expression'>,
<type 'sage.symbolic.expression.Expression'>,
<type 'sage.symbolic.expression.Expression'>,
<type 'sage.symbolic.expression.Expression'>]
sage: map(lambda t:type(t), S2)
[<type 'sage.symbolic.expression.Expression'>,
<type 'sage.symbolic.expression.Expression'>,
<type 'sage.symbolic.expression.Expression'>,
<type 'sage.symbolic.expression.Expression'>]

Worse, if I try to directly test for inequality, Sage CRASHES :

sage: S1R==S2
terminate called after throwing an instance of 'std::runtime_error'
what():
------------------------------------------------------------------------
/usr ...
edit retag close merge delete