# Computations with complex algebraic numbers?

I am trying to perform some Newton-type computations: z-p(z)/p'(z) where p(z) is a polynomial over the field of algebraic numbers.

For example, this shows the sort of thing I'm trying to do:

p = (z^2+1)*(z^2+4)
q = p/(z-I)
pd = diff(p,z)
qd = diff(q,z)
sol = solve(qd=0,solution_dict='true')
a0 = sol[0][z]
b0 = a0-p.subs(z=a0)/pd.subs(z=a0)


However, this doesn't work because the expression z-I is not recognized as a factor of p. So I might try defining p as a polynomial over the field QQbar:

R.<z> = PolynomialRing(QQbar)
p = (z^2+1)*(z^2+4)
q = p.quo_rem(z-I)[0]
pd = p.differentiate(z)
qd = q.differentiate(z)


The trouble now is that I can only seem to solve qd over CC: that is, in numerical form. Both the commands

qd.roots()
qd.factor()


produce numerical roots; I can't use solve on qd to obtain closed-form expressions for the roots. I've also tried the first method above prefaced with z=QQbar['z'].0 but to no avail.

Is there some way of doing this entire computation over QQbar, that is, with exact complex numbers instead of numerical approximations?

edit retag close merge delete

Sort by » oldest newest most voted

The impression that computations are numerical rather than in QQbar is mistaken.

Indeed, the trailing ?s in the following indicate elements in QQbar:

sage: R.<z> = PolynomialRing(QQbar)
sage: p = (z^2+1)*(z^2+4)
sage: q = p.quo_rem(z-I)[0]
sage: pd = p.differentiate(z)
sage: qd = q.differentiate(z)
sage: qd.roots()
[(-1.535183758487997?*I, 1), (0.8685170918213298?*I, 1)]
sage: qd.factor()
(3) * (z - 0.8685170918213298?*I) * (z + 1.535183758487997?*I)


Thus, you are working in QQbar and the following works, for instance:

sage: a = qd.roots()[0][0]
sage: a
-1.535183758487997?*I
sage: a.parent()
Algebraic Field
-1/3*sqrt(-2*sqrt(13) - 14)

more