# Problem with UniversalCyclotomicField?

Consider L=[[0, 1, 0], [1, 0, 1], [0, 1, 1]] and M=matrix(CyclotomicField(7),L), then:

sage: M.eigenvalues()
[-zeta7^4 - zeta7^3, zeta7^5 + zeta7^4 + zeta7^3 + zeta7^2 + 1, -zeta7^5 - zeta7^2]


Now by taking N=matrix(UniversalCyclotomicField(),L) I expected the following:

sage: N.eigenvalues()
[-E(7)^4 - E(7)^3, E(7)^5 + E(7)^4 + E(7)^3 + E(7)^2 + 1, -E(7)^5 - E(7)^2]


but I got the following error message:

sage: N.eigenvalues()
---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-49-ae504b86ebb7> in <module>()
----> 1 T.eigenvalues()

/opt/sagemath-9.0/local/lib/python3.7/site-packages/sage/matrix/matrix2.pyx in sage.matrix.matrix2.Matrix.eigenvalues (build/cythonized/sage/matrix/matrix2.c:44161)()
6000
6001         res = []
-> 6002         for f, e in self.charpoly().change_ring(K).factor():
6003             if f.degree() == 1:
6004                 res.extend([-f.constant_coefficient()]*e)

/opt/sagemath-9.0/local/lib/python3.7/site-packages/sage/rings/polynomial/polynomial_element.pyx in sage.rings.polynomial.polynomial_element.Polynomial.factor (build/cythonized/sage/rings/polynomial/polynomial_element.c:35771)()
4331         R = self._parent.base_ring()
4332         if hasattr(R, '_factor_univariate_polynomial'):
-> 4333             return R._factor_univariate_polynomial(self, **kwargs)
4334
4335         G = None

/opt/sagemath-9.0/local/lib/python3.7/site-packages/sage/rings/universal_cyclotomic_field.py in _factor_univariate_polynomial(self, f)
1682                 m = p.is_cyclotomic(certificate=True)
1683                 if not m:
-> 1684                     raise NotImplementedError('no known factorization for this polynomial')
1685                 for i in range(1, m):
1686                     if gcd(m, i) == 1:

NotImplementedError: no known factorization for this polynomial

edit retag close merge delete

Sort by » oldest newest most voted

Factorization of arbitrary polynomials over UCF = UniversalCyclotomicField() is NotImplemented; this is not hard to believe because it seems nontrivial.

If you know the eigenvalues of $N$ can be expressed using roots of unity, then the splitting field $K$ of the minimal polynomial of $N$ is contained in a cyclotomic field $\mathbb{Q}(\zeta_n)$ where we take $n$ to be as small as possible; this $n$ is called the conductor of the abelian extension $K/\mathbb{Q}$. You can find roots in $\mathbb{Q}(\zeta_n)$ and map them back to UCF:

sage: f = N.minpoly().change_ring(QQ)
sage: K.<a> = f.splitting_field()
sage: K.is_abelian()
True
sage: n = K.conductor()
7
sage: list(map(UCF, f.roots(CyclotomicField(n),multiplicities=False)))
[-E(7)^3 - E(7)^4, -E(7) - E(7)^6, -E(7)^2 - E(7)^5]


This might be suboptimal in general, but at least it works.

more