First, you should notice that the factorization is done relative to the ring you considered. For example, since `sqrt(2)`

is not integer nor rational, you will see that `z^2-2`

s already factorized in `ZZ`

or `QQ`

:

```
sage: integerpoly.<z> = PolynomialRing(QQ)
sage: factor(z^2-2)
z^2 - 2
sage: rationalpoly.<z> = PolynomialRing(ZZ)
sage: factor(z^2-2)
z^2 - 2
```

Second, `RR`

is a representation of real numbers by floating point approximation, hence, the factorization will be done here:

```
sage: realpoly.<z> = PolynomialRing(RR)
sage: factor(z^2-2)
(z - 1.41421356237310) * (z + 1.41421356237310)
sage: sol = z - factor(z^2-2)[0][0]
sage: sol
1.41421356237310
sage: sol in RR
True
sage: sol^2
2.00000000000000
sage: sol^2 == 2
False
```

The last equality is False because there is some very small rounding issue that make `sol^2`

not exactly equalt to `2`

(but very close):

```
sage: RR(sol^2).exact_rational()
4503599627370497/2251799813685248
```

So, if you want to deal with exact values, you have to use exact rings. In your case, the appropriate one is the field of real algebraic numbers `AA`

:

```
sage: algebraicpoly.<z> = PolynomialRing(AA)
sage: factor(z^2-2)
(z - 1.414213562373095?) * (z + 1.414213562373095?)
sage: sol = z - factor(z^2-2)[0][0]
sage: sol^2 == 2
True
sage: AA(sol)
1.414213562373095?
```

Here `AA(sol)`

is a genuine (exact) algebraic number, the floating point approximation is only a way to show it on your screen, this is indicated by the `?`

at the end of the representation.

There are plans to use some Galois theory to represent some algebraic numbers with radicals (to see `sqrt(2)`

instead of `1.414213562373095?`

). But it is not done yet, see this trac ticket.