Ask Your Question

Revision history [back]

Instead of defining f as a sympolic expression and using solve, one can define f as a polynomial over the rationals, and get its roots over the algebraic numbers.

Define ring of polynomials in x over the rationals, then f:

sage: R.<x> = QQ[]
sage: f = x^3 + x^2 - 1/10

Roots of f in QQbar (they are real: no imaginary part is shown):

sage: rr = f.roots(QQbar, multiplicities=False)
sage: print(rr)
[-0.8669513175959773?, -0.4126055722546906?, 0.2795568898506678?]

Further check that all roots are real:

sage: [r.imag() == 0 for r in rr]
[True, True, True]

Get radical expressions (involving I even though all roots are real).

sage: [r.radical_expression() for r in rr]
[-1/2*(1/180*I*sqrt(13)*sqrt(3) + 7/540)^(1/3)*(-I*sqrt(3) + 1)
 - 1/18*(I*sqrt(3) + 1)/(1/180*I*sqrt(13)*sqrt(3) + 7/540)^(1/3) - 1/3,
 -1/2*(1/180*I*sqrt(13)*sqrt(3) + 7/540)^(1/3)*(I*sqrt(3) + 1)
 - 1/18*(-I*sqrt(3) + 1)/(1/180*I*sqrt(13)*sqrt(3) + 7/540)^(1/3) - 1/3,
 (1/180*I*sqrt(13)*sqrt(3) + 7/540)^(1/3)
 + 1/9/(1/180*I*sqrt(13)*sqrt(3) + 7/540)^(1/3) - 1/3]

See link provided by @Emmanuel_Charpentier for the mathematics of that.