Decomposition of Algebraic Number into Sum or Product of Smaller Degree

algebraic-number-theoryalgorithmsgalois-theorynumber theorypolynomials

An algebraic number can be identified by its minimal polynomial together with isolating intervals with rational bounds for its real and imaginary parts. The degree of an algebraic number is the degree of its minimal polynomial. There are known algorithms that allow to easily compute sum and product of algebraic numbers in this representation, raise them to a rational power, extract real and imaginary parts, compare them, or evaluate them numerically to an arbitrary precision.

Is there an efficient algorithm that given an algebraic number $\alpha$ in this representation can decide if $\alpha$ can be represented as a sum or product of algebraic numbers of smaller degree?

Best Answer

As in https://mathoverflow.net/a/26859/10423, if your number $x$ ($p(x)=0$) is a sum of two algebraic numbers $y, z$, and $[\mathbb{Q}(y): \mathbb{Q}]$ and $[\mathbb{Q}(z): \mathbb{Q}]$ are relatively prime, we would have $$ \mathbb{Q}(x) = \mathbb{Q}(y, z). $$ To use this, we might look for subfields $\mathbb{Q}(y) \subset \mathbb{Q}(x) $ generated by particularly simple elements $y$ ($q(y)=0$). Then $x$ would satisfy a polynomial equation $r(x)=0$ of degree $\deg(x)/deg(y)$ whose coefficients are themselves polynomials in $y$.

This can be done in sage. Define the number field generated by your number in the comment:

t = var('t')
K.<x> = NumberField(t^6-12*t^5+54*t^4-116*t^3+132*t^2-120*t+92)

then loop through all subfields $\mathbb{Q}(y)$ generated by sage's K.optimized_subfields:

xValue = K.polynomial().real_roots()[0]
abstol, reltol = 1e-8, 1e-8
for K0 in K.optimized_subfields(0, name="y"):
    print "K0.<%s>:" % K0[0].gen(), K0[0].polynomial()
    L.<y,z> = K.relativize(K0[1])
    Lp.<w> = K0[0]["w"]
    # print "L: ", L
    Lrp = L.relative_polynomial();
    print "Lrp(x):", Lrp
    print "Lrp(w+z):", Lrp(w+z)
    if all([c.is_integer() for c in Lrp(w+z).coefficients()]):
        print "+++FOUND IT+++"
    print "Weight:", sum(c.global_height() for c in L.relative_polynomial().coefficients())
    # print "Heights:", (x.global_height(), y.global_height(), z.global_height())
    for emb in L.embeddings(ComplexField(200)):
        if abs(emb(y) - xValue) > abstol + reltol * abs(xValue): continue
        print "Embedding: %s: %s" % (z, emb(z))

This code considers, in turn, each subfield generated by $y$, and prints out the polynomials $q(y)\in\mathbb{Q}[y]$ and polynomial $r(x)\in\mathbb{Q}(y)[x]$, checking whether $r(x)$ can be written as a polynomial in $x-y=z$ with integer coefficients.

There are 12 subfields, snipping part of the output, some of the $y$'s are quite simple:

K0.<y3>: t^2 - 2
Lrp(x): x^3 + (-3*y3 - 6)*x^2 + (12*y3 + 18)*x - 14*y3 - 22
Lrp(w+z): w^3 - 6*w^2 + 12*w - 10
+++FOUND IT+++
Weight: 5.49783963670066
Embedding: y3:
-1.4142135623730950488016887242096980785696718753769480731767

$$ x = -\sqrt{2} + \mathrm{Root}_w(w^3-6w^2+12w-10) $$

K0.<y12>: t^6 - 2
Lrp(x): x - y12^3 - y12^2 - 2
Lrp(w+z): w - y12^3 - y12^2 + y12 - 2
Weight: 0.753631429508173
Embedding: y12:
-1.1224620483093729814335330496791795162324111106139867534404

$$ x = -2-y^2-y^3, \qquad y = -2^{1/6} $$

One might also check for all simple linear expressions $x = z + \lambda y$ by expanding $r(z+\lambda y)$ and checking whether all coefficients of $x^{\geq0}y^{>0}$ can be set to $0$ by a particular choice of $\lambda\in\mathbb{Z}$.

In my testing, I used the root near $-72.5006$ of

333030430968457063019646779392 - 23571307899875281888190922752 * x + 11325756868205077014516072448 * x^2 + 2880637967760945947804168192 * x^3 + 782990884159596744735457280 * x^4 + 40070228472035777844367360 * x^5 + 10282486223601703758015488 * x^6 + 192715657601424647782400 * x^7 + 21281445409747778775040 * x^8 - 2726796545369319832704 * x^9 - 83259682551880061952 * x^10 + 4445241731011609472 * x^11 + 1435507363311897496 * x^12 + 355547636535862912 * x^13 + 37061676308129376 * x^14 + 2332115507866947 * x^15 + 238642514161488 * x^16 + 13466590646101 * x^17 + 1032053823392 * x^18 + 55985523438 * x^19 + 2712768664 * x^20 + 109992986 * x^21 + 2837824 * x^22 + 41695 * x^23 + 320 * x^24 * x^25

which is

$$ 7 \mathrm{Root}_{x\approx-1.214}(8 + 3 x^3 + x^5) + 8 \mathrm{Root}_{x\approx-8.000}(2 + 8 x^4 + x^5). $$

So it works for $\deg(x)=25$, but in general it probably takes exponential time or worse, not polynomial. On the plus (?) side it generalizes the problem from looking for sums (not products, though) to looking for polynomial relations with algebraic coefficients.

Related Question