Ask Your Question

Revision history [back]

Thank you for your report, this is indeed a bug. Now tracked at

As a workaround,

  • one could convert a to a vector over the field of algebraic numbers; then the norm is given as an exact algebraic number:

    sage: a = vector([E(8), E(7)])
    sage: b = a.change_ring(QQbar)
    sage: bn = b.norm()
    sage: bn
    sage: bn.parent()
    Algebraic Real Field
  • one could convert a to a vector over a cyclotomic field (not the universal one); sadly the norm is then given as an inexact (floating-point) number:

    sage: a = vector([E(8), E(7)])
    sage: c = a.apply_map(lambda x: x.to_cyclotomic_field())
    sage: cn = c.norm()
    sage: cn
    sage: cn.parent()
    Real Field with 53 bits of precision
  • the square of the norm of the vector a can be obtained directly as a * a.conjugate(), but one then gets it as an element in the universal cyclotomic field, and a similar bug prevents from taking the square root of that directly:

    sage: a = vector([E(8), E(7)])
    sage: ann = a * a.conjugate()
    sage: ann
    sage: ann.parent()
    Universal Cyclotomic Field
    sage: an = sqrt(ann)
    Traceback (most recent call last)
    NotImplementedError: is_square() not implemented for elements of Universal Cyclotomic Field

    and one again has to go through a cyclotomic field other than the universal one, or the field of real algebraic numbers:

    sage: nna = AA(a*a.conjugate())
    sage: nna
    sage: nna.parent()
    Algebraic Real Field
    sage: na = sqrt(nna)
    sage: na
    sage: na.parent()
    Algebraic Real Field