Here is the "same" answer, using a ring of polynomials. So the pythonic variable x
below is representing the indeterminate of a polynomial ring R. We have to introduce this polynomial, in my case the ring of coefficients is Q, the ring of rational numbers, but also other (exact) rings may be used.
So R=Q[x]. We ask sage to give us all roots of a sample polynomial f, these live in ˉQ, check which ones are in iQ among them, and print them. (If f has all roots in iQ, we show them all.)
Our sample polynomial is:
f=4x12+4x11+33x10+49x9+138x8+254x7+473x6+689x5+971x4+912x3+859x2+432x+252 .
The code declares R=Q[x], and f first,
R.<x> = PolynomialRing(QQ) # or simply QQ[]
f = ( 4*x^12 + 4*x^11 + 33*x^10 + 49*x^9 + 138*x^8 + 254*x^7
+ 473*x^6 + 689*x^5 + 971*x^4 + 912*x^3 + 859*x^2 + 432*x + 252 )
and asks for the roots with real part zero, and imaginary part in QQ
=Q:
for r in f.roots(ring=QQbar, multiplicities=False):
if r.real() == 0 and r.imag() in QQ:
print(f'Found root r = {r} with rational imaginary part {QQ(r/i)}')
Results:
Found root r = -2*I with rational imaginary part -2
Found root r = -1.5000000000000000?*I with rational imaginary part -3/2
Found root r = -1*I with rational imaginary part -1
Found root r = 1*I with rational imaginary part 1
Found root r = 1.5000000000000000?*I with rational imaginary part 3/2
Found root r = 2*I with rational imaginary part 2
In this approach, the step of passing from f to g is no longer needed.
But can be done. We could introduce Q(j), j=√−1, instead of Q as the base field for the coefficients. And while computing the roots we can ask directly for the roots in this ring.
For instance:
K.<j> = QuadraticField(-1) # so j is sqrt(-1)
RK.<X> = PolynomialRing(K) # or simply K[]
g = f(j*X)
Then:
sage: [ r for r in g.roots(multiplicities=False) if r in QQ ]
[2, 3/2, 1, -1, -3/2, -2]
sage: [ r for r in f.roots(ring=K, multiplicities=False) if r*j in QQ ]
[2*j, 3/2*j, j, -j, -3/2*j, -2*j]
Try
@the 1diot : do not use
CC
, which is a(pseudo-)ring of numerical approximations to complexes (and therefore "inexact"), butQQbar
, representation of agorithms allowing to compute an algebraic number to arbitrary precision, and therefore considered as an "exact" representation of algebraics. Contemplate :@achresz : you should transform your comment in an answer, that
the Idiot
can accept, in order to mark this question as answered for the benefit of futureask.sagemath.org
(per-)users...Since in the question f(x) and g(x) are not defined I can't check if my "answer" is correct.
@achrzesz : you can illustrate your answer with an example, without attempting to solve the 1diot's problem :
(more)