#20755: Bug in solve due to a bug in symbolic_expression_from_maxima_string
-----------------------------+---------------------------------
Reporter: bruno | Owner:
Type: PLEASE CHANGE | Status: new
Priority: major | Milestone: sage-7.3
Component: symbolics | Keywords: maxima, solve
Merged in: | Authors:
Reviewers: | Report Upstream: N/A
Work issues: | Branch:
Commit: | Dependencies:
Stopgaps: |
-----------------------------+---------------------------------
A bug in `sage.calculus.calculus.symbolic_expression_from_maxima_string`
implies bugs in `solve` and `roots` for symbolic expressions.
=== Symptoms ===
The method `solve` for symbolic expressions is buggy (the list of
multiplicities has size 2 instead of 4), as well as `roots` as a
(serious!) consequence:
{{{#!python
sage: w = x^4 - (1+3*i)*x^3 - (2-4*i)*x^2 + (6-2*i)*x - 4 - 4*i
sage: w.solve(x,multiplicities=True)
([x == -1/2*sqrt(2*I) + 3/2*I - 1/2, x == 1/2*sqrt(2*I) + 3/2*I - 1/2, x
== (-I + 1), x == (I + 1)],
[1, 1])
sage: w.roots() # should be 4 roots
[(-1/2*sqrt(2*I) + 3/2*I - 1/2, 1), (1/2*sqrt(2*I) + 3/2*I - 1/2, 1)]
}}}
=== Diagnosis ===
1. The behavior of `roots` is easily explained by the behavior of `solve`,
since `roots` assume that the length of the list of solutions is the same
as the length of the list of multiplicities. This should clearly be the
case so the bug is not in `roots`.
2. Given the parameter in the example, `solve` calls Maxima and parses the
result. The multiplicities are obtained by invoking
`P.get('multiplicities')`. This is the right invocation to Maxima, no bug
there.
3. To parse the solutions returned by Maxima, `solve` calls
`sage.symbolic.relation.string_to_list_of_solutions`, which itself calls
`sage.calculus.symbolic_expression_from_maxima_string`. The bug occurs in
this last function: Indeed, while there is no apparent reason for this,
invoking this function changes the variable `multiplicities` of Maxima.
Here is an example:
{{{#!python
sage: w = x^4 - (1+3*i)*x^3 - (2-4*i)*x^2 + (6-2*i)*x - 4 - 4*i
sage: m = (w == 0)._maxima_()
sage: P = m.parent()
sage: s = m.solve(x).str()
sage: s # the list of solutions returned by Maxima
'[_SAGE_VAR_x=-(sqrt(2*%i)-3*%i+1)/2,_SAGE_VAR_x=(sqrt(2*%i)+3*%i-1)/2,_SAGE_VAR_x=1-%i,_SAGE_VAR_x=%i+1]'
sage: P.get('multiplicities') # correct!
'[1,1,1,1]'
sage: l = sage.calculus.calculus.symbolic_expression_from_maxima_string(s)
sage: l
[x == -1/2*sqrt(2*I) + 3/2*I - 1/2,
x == 1/2*sqrt(2*I) + 3/2*I - 1/2,
x == (-I + 1),
x == (I + 1)]
sage: P.get('multiplicities') # WTF???
'[1,1]'
}}}
--
Ticket URL: <http://trac.sagemath.org/ticket/20755>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica,
and MATLAB
--
You received this message because you are subscribed to the Google Groups
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sage-trac.
For more options, visit https://groups.google.com/d/optout.