rational_polynomial_check.py

back to table · edit · history · where entries came from · files · download

1644 bytes, as of the version from 2026-10-28 22:35 (current). Recorded here, not run.

"""Exclude unrecorded rational root components for numberdb.org/T592.

Run: sage -python rational_polynomial_check.py (adjacent generate.py).
For A(x)+sqrt(2)B(x), any rational root is a root of gcd(A,B).
A zero on the unit circle with t=z+1/z has Re(z)=t/2. For a
rational Im(z)=y, eliminate t from q(t)=0 and t^2=4(1-y^2).
This avoids expensive conversion of each nested algebraic radical to QQ.
"""
import generate as g
from sage.rings.rational_field import QQ
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing

def candidates(poly):
    Q=PolynomialRing(QQ,'u')
    a=Q([c[0] for c in poly]);b=Q([c[1] for c in poly])
    return a.gcd(b).roots(ring=QQ,multiplicities=False)

def run():
    for m in range(2,7):
        for n in range(m,7):
            p=g.field_polynomial(m,n)
            while p(-1)==0: p=p.quo_rem(g.z+1)[0]
            h=p.degree()//2
            T=PolynomialRing(g.F,'u');u=T.gen();C=[T(2),u]
            for k in range(2,h+1): C.append(u*C[-1]-C[-2])
            q=T(p[h])+sum((p[h+k]*C[k] for k in range(1,h+1)),T(0))
            real_candidates=candidates(q)
            s=4*(1-u*u)
            even=sum((q[2*k]*s**k for k in range(h//2+1)),T(0))
            odd=sum((q[2*k+1]*s**k for k in range((h+1)//2)),T(0))
            imaginary_candidates=candidates(even*even-s*odd*odd)
            assert not real_candidates and not imaginary_candidates,(m,n,real_candidates,imaginary_candidates)
            print('PASS irrational nonreal-root components',m,n,flush=True)
    print('Only rational components: Re=-1, Im=0 of the three exact roots -1.',flush=True)

if __name__=='__main__':run()