Ask Your Question
1

Strange problem with Solve function

asked 2022-05-09 19:02:02 +0100

Rune gravatar image

I am running into a strange issue when trying to solve an equation, which seems pretty simple to solve. When I ask SAGE preform

x=var('x')
solve(1630*x^3 + 2991*x^2 + 1628*x + 1==0, x)

Everything goes fine, and it gives me the roots of the equation. However, when I ask it to do the same for a larger equation, I get this:

x=var('x')
solve(1953125*x^5 + 6793750*x^4 + 5942255*x^3 + 8749866*x^2 + 5857878*x + 1==0, x)

and the result is:

[0 == 1953125*x^5 + 6793750*x^4 + 5942255*x^3 + 8749866*x^2 + 5857878*x + 1]

And I do not understand why. I even checked using WolframAlpha, and the issue is not that this equation has no roots. Indeed, WolframAlpha was able to solve this equation with no issues.

What is the issue here? What am I missing?

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
1

answered 2022-05-09 19:37:43 +0100

dan_fulea gravatar image

Solving an equation of third degree works, since we have an exact formula. When asking for the roots of a polynomial of degree $>4$ there is no guarantee for the existence of "nice" roots. Sage generally wants to perform exact mathematics, so it delivers exact answers, as far as it can do it. In the above case...

sage: solve(1953125*x^5 + 6793750*x^4 + 5942255*x^3 + 8749866*x^2 + 5857878*x + 1==0, x)
[0 == 1953125*x^5 + 6793750*x^4 + 5942255*x^3 + 8749866*x^2 + 5857878*x + 1]

sage prefers to return an echo. Why? Since it cannot do better (in an exact manner). Well, W-Alpha is also not delivering exact results. It just gives some approximations. It is of course easy to get the approximations in sage, but we have to actively ask for numeric output. For instance:

sage: var('x');
sage: solve(1953125*x^5 + 6793750*x^4 + 5942255*x^3 + 8749866*x^2 + 5857878*x + 1==0, x, to_poly_solve=True)
[x == -2.830429732868757,
 x == -0.7979018821351435,
 x == (-1.70710339378983e-07),
 x == (0.07496593632772452 - 1.149961450358518*I),
 x == (0.07496593632772452 + 1.149961450358518*I)]

Some more options are available when asking explicitly for the roots of an algebraic expression, of a polynomial:

sage: R.<x> = PolynomialRing(QQ)
sage: f = 1953125*x^5 + 6793750*x^4 + 5942255*x^3 + 8749866*x^2 + 5857878*x + 1
sage: f.roots(ring=QQbar, multiplicities=False)
[-2.830429808252441?,
 -0.7979018936926834?,
 -1.707103246241551?e-7,
 0.0749659363277245? - 1.149961450358519?*I,
 0.0749659363277245? + 1.149961450358519?*I]

The above values are exact. Working with them means working with explicit exact elements in a number field. Each value is determined by an approximation and a minimal polynomial with (exact) integral coefficients.

Well, if numerical values are wanted...

sage: f.roots(ring=CC, multiplicities=False)
[-2.83042980825244,
 -0.797901893692683,
 -1.70710324624155e-7,
 0.0749659363277245 - 1.14996145035852*I,
 0.0749659363277245 + 1.14996145035852*I]

We can of course get more decimals...

sage: myC = ComplexField(200)
sage: f.roots(ring=myC, multiplicities=False)
[-2.8304298082524409357816792805082283665446973943656659043473,
 -0.79790189369268339504134957237465853264581932023615973080958,
 -1.7071032462415503949697879975157140476095973540086477715140e-7,
 0.074965936327724477489034174930843325380960737780780518010806 - 1.1499614503585182832508403555910655399898690410165816928866*I,
 0.074965936327724477489034174930843325380960737780780518010806 + 1.1499614503585182832508403555910655399898690410165816928866*I]

Note that sage comes also with a(n easy) way of seeing if the roots can be given by radicals. We ask for the Galois group of the involved polynomial. Is it solvable?

sage: R.<x> = PolynomialRing(QQ)
sage: f = 1953125*x^5 + 6793750*x^4 + 5942255*x^3 + 8749866*x^2 + 5857878*x + 1
sage: G = f.galois_group()
sage: G
Transitive group number 5 of degree 5
sage: G.structure_description()
'S5'
sage: G.order()
120
sage: G.is_solvable()
False

No, not solvable, so there is no chance to get the solutions by radicals.


Observation: Even in the case when we can obtain solutions written by radicals, e.g. for

sage: var('x');
sage: solve(x^5 -10*x^3 + 5*x^2 + 10*x +1 == 0, x)
[0 == x^5 - 10*x^3 + 5*x^2 + 10*x + 1]

sage: R.<x> = PolynomialRing(QQ)
sage: f = x^5 -10*x^3 + 5*x^2 + 10*x +1
sage: G = f.galois_group()
sage: G.is_solvable()
True

we cannot expect that sage "knows what we want", and gives us a way to digest the roots by using radicals.

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2022-05-09 19:02:02 +0100

Seen: 387 times

Last updated: May 09 '22