#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.

Reply via email to