-
-
Notifications
You must be signed in to change notification settings - Fork 686
Description
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:
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
-
The behavior of
rootsis easily explained by the behavior ofsolve, sincerootsassume 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 inroots. -
Given the parameter in the example,
solvecalls Maxima and parses the result. The multiplicities are obtained by invokingP.get('multiplicities'). This is the right invocation to Maxima, no bug there. -
To parse the solutions returned by Maxima,
solvecallssage.symbolic.relation.string_to_list_of_solutions, which itself callssage.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 variablemultiplicitiesof Maxima. Here is an example: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]'
Component: **symbolics**
Keywords: **maxima, solve**
Author: **Bruno Grenet**
Branch/Commit: **[`eb0ad68`](https://github.com/sagemath/sagetrac-mirror/commit/eb0ad68ae007807828945e13e58e9865c67adf77)**
Reviewer: **Vincent Delecroix**
_Issue created by migration from https://trac.sagemath.org/ticket/20755_