On Mar 19, 2010, at 7:23 PM, Ondrej Certik wrote:
Hi,
I am having problems understanding how "I" (complex unit) in Sage:
sage: type(I)
<type 'sage.symbolic.expression.Expression'>
somehow becomes a NumberFieldElement_quadratic and that fails to
convert to the sympy's I:
ond...@raven:~/repos/sympy(pu)$ MPMATH_NOSAGE=yes sage -python
bin/test sympy/test_external/test_sage.py --pdb
============================= test process starts
==============================
executable: /home/ondrej/ext/sage-4.3.3-linux-64bit-ubuntu_9.10-
x86_64-Linux/local/bin/python
(2.6.4-final-0)
sympy/test_external/test_sage.py[13] .XXX <type
'sage
.rings
.number_field
.number_field_element_quadratic.NumberFieldElement_quadratic'>
I
E> /home/ondrej/repos/sympy/sympy/core/sympify.py(185)_sympify()
-> raise SympifyError("%r is NOT a valid SymPy expression" % (a,))
(Pdb) a
a = I
(Pdb) type(a)
<type
'sage
.rings
.number_field
.number_field_element_quadratic.NumberFieldElement_quadratic'>
Here is the full traceback:
________________ sympy/test_external/test_sage.py:test_complex
_________________
File "/home/ondrej/repos/sympy/sympy/test_external/test_sage.py",
line 61, in test_complex
check_expression("I*y", "y")
File "/home/ondrej/repos/sympy/sympy/test_external/test_sage.py",
line 47, in check_expression
assert sympy.S(e_sage) == e_sympy
File "/home/ondrej/repos/sympy/sympy/core/sympify.py", line 86, in
sympify
v = meth()
File "expression.pyx", line 932, in
sage.symbolic.expression.Expression._sympy_
(sage/symbolic/expression.cpp:5466)
File "/home/ondrej/ext/sage-4.3.3-linux-64bit-ubuntu_9.10-x86_64-
Linux/local/lib/python2.6/site-packages/sage/symbolic/
expression_conversions.py",
line 214, in __call__
return self.arithmetic(ex, operator)
File "/home/ondrej/ext/sage-4.3.3-linux-64bit-ubuntu_9.10-x86_64-
Linux/local/lib/python2.6/site-packages/sage/symbolic/
expression_conversions.py",
line 587, in arithmetic
return sympy.Mul(*ops)
File "/home/ondrej/repos/sympy/sympy/core/cache.py", line 85, in
wrapper
func_cache_it_cache[k] = r = func(*args, **kw_args)
File "/home/ondrej/repos/sympy/sympy/core/operations.py", line 35,
in __new__
c_part, nc_part, order_symbols = cls.flatten(map(_sympify, args))
File "/home/ondrej/repos/sympy/sympy/core/sympify.py", line 185, in
_sympify
raise SympifyError("%r is NOT a valid SymPy expression" % (a,))
SympifyError: SympifyError: I is NOT a valid SymPy expression
The relevant code is in sage/symbolic/expression_conversions.py around
the line 587:
def arithmetic(self, ex, operator):
"""
EXAMPLES::
sage: from sage.symbolic.expression_conversions import
SympyConverter
sage: s = SympyConverter()
sage: f = x + 2
sage: s.arithmetic(f, f.operator())
2 + x
"""
import sympy
operator = arithmetic_operators[operator]
ops = [self(a) for a in ex.operands()]
if operator == "+":
return sympy.Add(*ops)
elif operator == "*":
return sympy.Mul(*ops)
where the "self(a)" thing converts an expression from Sage to sympy,
and thus "ops" in the line:
return sympy.Mul(*ops)
are sympy symbols and thus everything works. Inluding "I" alone, as
these tests in sympy pass just fine:
check_expression("I", "")
check_expression("23+I*4", "x")
This test fails however:
check_expression("I*y", "y")
what happens is that "ops" contains
[y, I]
where "y" is a sympy symbol (ok), but I is of a type
NumberFieldElement_quadratic and sympy then fails to convert it to a
sympy expression in Mul.
What I understood is that Sage tries to optimize this expressions
somehow using NumberFieldElement_quadratic, but I wasn't able to
reproduce it:
sage: var("y")
y
sage: type(I*y)
<type 'sage.symbolic.expression.Expression'>
Does anyone understand this code in Sage? What is happening there?
The literal constant "I" is an element of a quadratic number field in
Sage.
sage: i.pyobject().parent()
Number Field in I with defining polynomial x^2 + 1
Should I implement _sympy_ methods in NumberFieldElement_quadratic, or
what is the way to fix this?
Yes, that would make the most sense. Probably recognizing this one
case would be good enough.
- Robert
--
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org
To unsubscribe from this group, send email to sage-devel+unsubscribegooglegroups.com or
reply to this email with the words "REMOVE ME" as the subject.