Structure maps for number fields - Algebraic Numbers and Number Fields

Skip to content
Back to top
View this page
Edit this page

# Structure maps for number fields

This module provides isomorphisms between relative and absolute presentations, to and from vector spaces, name changing maps, etc.

EXAMPLES:

Sage

    sage: x = polygen(ZZ, 'x')
    sage: L.<cuberoot2, zeta3> = CyclotomicField(3).extension(x^3 - 2)
    sage: K = L.absolute_field('a')
    sage: from_K, to_K = K.structure()
    sage: from_K
    Isomorphism map:
      From: Number Field in a with defining polynomial
            x^6 - 3*x^5 + 6*x^4 - 11*x^3 + 12*x^2 + 3*x + 1
      To:   Number Field in cuberoot2 with defining polynomial
            x^3 - 2 over its base field
    sage: to_K
    Isomorphism map:
      From: Number Field in cuberoot2 with defining polynomial
            x^3 - 2 over its base field
      To:   Number Field in a with defining polynomial
            x^6 - 3*x^5 + 6*x^4 - 11*x^3 + 12*x^2 + 3*x + 1

Python

    >>> from sage.all import *
    >>> x = polygen(ZZ, 'x')
    >>> L = CyclotomicField(Integer(3)).extension(x**Integer(3) - Integer(2), names=('cuberoot2', 'zeta3',)); (cuberoot2, zeta3,) = L._first_ngens(2)
    >>> K = L.absolute_field('a')
    >>> from_K, to_K = K.structure()
    >>> from_K
    Isomorphism map:
      From: Number Field in a with defining polynomial
            x^6 - 3*x^5 + 6*x^4 - 11*x^3 + 12*x^2 + 3*x + 1
      To:   Number Field in cuberoot2 with defining polynomial
            x^3 - 2 over its base field
    >>> to_K
    Isomorphism map:
      From: Number Field in cuberoot2 with defining polynomial
            x^3 - 2 over its base field
      To:   Number Field in a with defining polynomial
            x^6 - 3*x^5 + 6*x^4 - 11*x^3 + 12*x^2 + 3*x + 1

class sage.rings.number_field.maps.MapAbsoluteToRelativeNumberField(A, R)

  Bases: `NumberFieldIsomorphism`

  See `MapRelativeToAbsoluteNumberField` for examples.

class sage.rings.number_field.maps.MapNumberFieldToVectorSpace(K, V)

  Bases: `Map`

  A class for the isomorphism from an absolute number field to its underlying \(\QQ\)-vector space.

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: L.<a> = NumberField(x^3 - x + 1)
      sage: V, fr, to = L.vector_space()
      sage: type(to)
      <class 'sage.rings.number_field.maps.MapNumberFieldToVectorSpace'>

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> L = NumberField(x**Integer(3) - x + Integer(1), names=('a',)); (a,) = L._first_ngens(1)
      >>> V, fr, to = L.vector_space()
      >>> type(to)
      <class 'sage.rings.number_field.maps.MapNumberFieldToVectorSpace'>

class sage.rings.number_field.maps.MapRelativeNumberFieldToRelativeVectorSpace(K, V)

  Bases: `NumberFieldIsomorphism`

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: K.<a, b> = NumberField([x^3 - x + 1, x^2 + 23])
      sage: V, fr, to = K.relative_vector_space()
      sage: type(to)
      <class 'sage.rings.number_field.maps.MapRelativeNumberFieldToRelativeVectorSpace'>

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> K = NumberField([x**Integer(3) - x + Integer(1), x**Integer(2) + Integer(23)], names=('a', 'b',)); (a, b,) = K._first_ngens(2)
      >>> V, fr, to = K.relative_vector_space()
      >>> type(to)
      <class 'sage.rings.number_field.maps.MapRelativeNumberFieldToRelativeVectorSpace'>

class sage.rings.number_field.maps.MapRelativeNumberFieldToVectorSpace(L, V, to_K, to_V)

  Bases: `NumberFieldIsomorphism`

  The isomorphism from a relative number field to its underlying \(\QQ\)-vector space. Compare `MapRelativeNumberFieldToRelativeVectorSpace`.

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: K.<a> = NumberField(x^8 + 100*x^6 + x^2 + 5)
      sage: L = K.relativize(K.subfields(4)[0][1], 'b'); L
      Number Field in b with defining polynomial x^2 + a0 over its base field
      sage: L_to_K, K_to_L = L.structure()

      sage: V, fr, to = L.absolute_vector_space()
      sage: V
      Vector space of dimension 8 over Rational Field
      sage: fr
      Isomorphism map:
        From: Vector space of dimension 8 over Rational Field
        To:   Number Field in b with defining polynomial x^2 + a0 over its base field
      sage: to
      Isomorphism map:
        From: Number Field in b with defining polynomial x^2 + a0 over its base field
        To:   Vector space of dimension 8 over Rational Field
      sage: type(fr), type(to)
      (<class 'sage.rings.number_field.maps.MapVectorSpaceToRelativeNumberField'>,
       <class 'sage.rings.number_field.maps.MapRelativeNumberFieldToVectorSpace'>)

      sage: v = V([1, 1, 1, 1, 0, 1, 1, 1])
      sage: fr(v), to(fr(v)) == v
      ((-a0^3 + a0^2 - a0 + 1)*b - a0^3 - a0 + 1, True)
      sage: to(L.gen()), fr(to(L.gen())) == L.gen()
      ((0, 1, 0, 0, 0, 0, 0, 0), True)

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> K = NumberField(x**Integer(8) + Integer(100)*x**Integer(6) + x**Integer(2) + Integer(5), names=('a',)); (a,) = K._first_ngens(1)
      >>> L = K.relativize(K.subfields(Integer(4))[Integer(0)][Integer(1)], 'b'); L
      Number Field in b with defining polynomial x^2 + a0 over its base field
      >>> L_to_K, K_to_L = L.structure()

      >>> V, fr, to = L.absolute_vector_space()
      >>> V
      Vector space of dimension 8 over Rational Field
      >>> fr
      Isomorphism map:
        From: Vector space of dimension 8 over Rational Field
        To:   Number Field in b with defining polynomial x^2 + a0 over its base field
      >>> to
      Isomorphism map:
        From: Number Field in b with defining polynomial x^2 + a0 over its base field
        To:   Vector space of dimension 8 over Rational Field
      >>> type(fr), type(to)
      (<class 'sage.rings.number_field.maps.MapVectorSpaceToRelativeNumberField'>,
       <class 'sage.rings.number_field.maps.MapRelativeNumberFieldToVectorSpace'>)

      >>> v = V([Integer(1), Integer(1), Integer(1), Integer(1), Integer(0), Integer(1), Integer(1), Integer(1)])
      >>> fr(v), to(fr(v)) == v
      ((-a0^3 + a0^2 - a0 + 1)*b - a0^3 - a0 + 1, True)
      >>> to(L.gen()), fr(to(L.gen())) == L.gen()
      ((0, 1, 0, 0, 0, 0, 0, 0), True)

class sage.rings.number_field.maps.MapRelativeToAbsoluteNumberField(R, A)

  Bases: `NumberFieldIsomorphism`

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: K.<a> = NumberField(x^6 + 4*x^2 + 200)
      sage: L = K.relativize(K.subfields(3)[0][1], 'b'); L
      Number Field in b with defining polynomial x^2 + a0 over its base field
      sage: fr, to = L.structure()
      sage: fr
      Relative number field morphism:
        From: Number Field in b with defining polynomial x^2 + a0 over its base field
        To:   Number Field in a with defining polynomial x^6 + 4*x^2 + 200
        Defn: b |--> a
              a0 |--> -a^2
      sage: to
      Ring morphism:
        From: Number Field in a with defining polynomial x^6 + 4*x^2 + 200
        To:   Number Field in b with defining polynomial x^2 + a0 over its base field
        Defn: a |--> b
      sage: type(fr), type(to)
      (<class 'sage.rings.number_field.homset.RelativeNumberFieldHomset_with_category.element_class'>,
       <class 'sage.rings.number_field.homset.NumberFieldHomset_with_category.element_class'>)

      sage: M.<c> = L.absolute_field(); M
      Number Field in c with defining polynomial x^6 + 4*x^2 + 200
      sage: fr, to = M.structure()
      sage: fr
      Isomorphism map:
        From: Number Field in c with defining polynomial x^6 + 4*x^2 + 200
        To:   Number Field in b with defining polynomial x^2 + a0 over its base field
      sage: to
      Isomorphism map:
        From: Number Field in b with defining polynomial x^2 + a0 over its base field
        To:   Number Field in c with defining polynomial x^6 + 4*x^2 + 200
      sage: type(fr), type(to)
      (<class 'sage.rings.number_field.maps.MapAbsoluteToRelativeNumberField'>,
       <class 'sage.rings.number_field.maps.MapRelativeToAbsoluteNumberField'>)
      sage: fr(M.gen()), to(fr(M.gen())) == M.gen()
      (b, True)
      sage: to(L.gen()), fr(to(L.gen())) == L.gen()
      (c, True)
      sage: (to * fr)(M.gen()) == M.gen(), (fr * to)(L.gen()) == L.gen()
      (True, True)

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> K = NumberField(x**Integer(6) + Integer(4)*x**Integer(2) + Integer(200), names=('a',)); (a,) = K._first_ngens(1)
      >>> L = K.relativize(K.subfields(Integer(3))[Integer(0)][Integer(1)], 'b'); L
      Number Field in b with defining polynomial x^2 + a0 over its base field
      >>> fr, to = L.structure()
      >>> fr
      Relative number field morphism:
        From: Number Field in b with defining polynomial x^2 + a0 over its base field
        To:   Number Field in a with defining polynomial x^6 + 4*x^2 + 200
        Defn: b |--> a
              a0 |--> -a^2
      >>> to
      Ring morphism:
        From: Number Field in a with defining polynomial x^6 + 4*x^2 + 200
        To:   Number Field in b with defining polynomial x^2 + a0 over its base field
        Defn: a |--> b
      >>> type(fr), type(to)
      (<class 'sage.rings.number_field.homset.RelativeNumberFieldHomset_with_category.element_class'>,
       <class 'sage.rings.number_field.homset.NumberFieldHomset_with_category.element_class'>)

      >>> M = L.absolute_field(names=('c',)); (c,) = M._first_ngens(1); M
      Number Field in c with defining polynomial x^6 + 4*x^2 + 200
      >>> fr, to = M.structure()
      >>> fr
      Isomorphism map:
        From: Number Field in c with defining polynomial x^6 + 4*x^2 + 200
        To:   Number Field in b with defining polynomial x^2 + a0 over its base field
      >>> to
      Isomorphism map:
        From: Number Field in b with defining polynomial x^2 + a0 over its base field
        To:   Number Field in c with defining polynomial x^6 + 4*x^2 + 200
      >>> type(fr), type(to)
      (<class 'sage.rings.number_field.maps.MapAbsoluteToRelativeNumberField'>,
       <class 'sage.rings.number_field.maps.MapRelativeToAbsoluteNumberField'>)
      >>> fr(M.gen()), to(fr(M.gen())) == M.gen()
      (b, True)
      >>> to(L.gen()), fr(to(L.gen())) == L.gen()
      (c, True)
      >>> (to * fr)(M.gen()) == M.gen(), (fr * to)(L.gen()) == L.gen()
      (True, True)

class sage.rings.number_field.maps.MapRelativeVectorSpaceToRelativeNumberField(V, K)

  Bases: `NumberFieldIsomorphism`

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: L.<b> = NumberField(x^4 + 3*x^2 + 1)
      sage: K = L.relativize(L.subfields(2)[0][1], 'a'); K
      Number Field in a with defining polynomial x^2 - b0*x + 1 over its base field
      sage: V, fr, to = K.relative_vector_space()
      sage: V
      Vector space of dimension 2 over Number Field in b0 with defining polynomial x^2 + 1
      sage: fr
      Isomorphism map:
        From: Vector space of dimension 2
              over Number Field in b0 with defining polynomial x^2 + 1
        To:   Number Field in a
              with defining polynomial x^2 - b0*x + 1 over its base field
      sage: type(fr)
      <class 'sage.rings.number_field.maps.MapRelativeVectorSpaceToRelativeNumberField'>

      sage: a0 = K.gen(); b0 = K.base_field().gen()
      sage: fr(to(a0 + 2*b0)), fr(V([0, 1])), fr(V([b0, 2*b0]))
      (a + 2*b0, a, 2*b0*a + b0)
      sage: (fr * to)(K.gen()) == K.gen()
      True
      sage: (to * fr)(V([1, 2])) == V([1, 2])
      True

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> L = NumberField(x**Integer(4) + Integer(3)*x**Integer(2) + Integer(1), names=('b',)); (b,) = L._first_ngens(1)
      >>> K = L.relativize(L.subfields(Integer(2))[Integer(0)][Integer(1)], 'a'); K
      Number Field in a with defining polynomial x^2 - b0*x + 1 over its base field
      >>> V, fr, to = K.relative_vector_space()
      >>> V
      Vector space of dimension 2 over Number Field in b0 with defining polynomial x^2 + 1
      >>> fr
      Isomorphism map:
        From: Vector space of dimension 2
              over Number Field in b0 with defining polynomial x^2 + 1
        To:   Number Field in a
              with defining polynomial x^2 - b0*x + 1 over its base field
      >>> type(fr)
      <class 'sage.rings.number_field.maps.MapRelativeVectorSpaceToRelativeNumberField'>

      >>> a0 = K.gen(); b0 = K.base_field().gen()
      >>> fr(to(a0 + Integer(2)*b0)), fr(V([Integer(0), Integer(1)])), fr(V([b0, Integer(2)*b0]))
      (a + 2*b0, a, 2*b0*a + b0)
      >>> (fr * to)(K.gen()) == K.gen()
      True
      >>> (to * fr)(V([Integer(1), Integer(2)])) == V([Integer(1), Integer(2)])
      True

class sage.rings.number_field.maps.MapVectorSpaceToNumberField(V, K)

  Bases: `NumberFieldIsomorphism`

  The map to an absolute number field from its underlying \(\QQ\)-vector space.

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: K.<a> = NumberField(x^4 + 3*x + 1)
      sage: V, fr, to = K.vector_space()
      sage: V
      Vector space of dimension 4 over Rational Field
      sage: fr
      Isomorphism map:
        From: Vector space of dimension 4 over Rational Field
        To:   Number Field in a with defining polynomial x^4 + 3*x + 1
      sage: to
      Isomorphism map:
        From: Number Field in a with defining polynomial x^4 + 3*x + 1
        To:   Vector space of dimension 4 over Rational Field
      sage: type(fr), type(to)
      (<class 'sage.rings.number_field.maps.MapVectorSpaceToNumberField'>,
       <class 'sage.rings.number_field.maps.MapNumberFieldToVectorSpace'>)

      sage: fr.is_injective(), fr.is_surjective()
      (True, True)

      sage: fr.domain(), to.codomain()
      (Vector space of dimension 4 over Rational Field,
       Vector space of dimension 4 over Rational Field)
      sage: to.domain(), fr.codomain()
      (Number Field in a with defining polynomial x^4 + 3*x + 1,
       Number Field in a with defining polynomial x^4 + 3*x + 1)
      sage: fr * to
      Composite map:
        From: Number Field in a with defining polynomial x^4 + 3*x + 1
        To:   Number Field in a with defining polynomial x^4 + 3*x + 1
        Defn:   Isomorphism map:
                From: Number Field in a with defining polynomial x^4 + 3*x + 1
                To:   Vector space of dimension 4 over Rational Field
              then
                Isomorphism map:
                From: Vector space of dimension 4 over Rational Field
                To:   Number Field in a with defining polynomial x^4 + 3*x + 1
      sage: to * fr
      Composite map:
        From: Vector space of dimension 4 over Rational Field
        To:   Vector space of dimension 4 over Rational Field
        Defn:   Isomorphism map:
                From: Vector space of dimension 4 over Rational Field
                To:   Number Field in a with defining polynomial x^4 + 3*x + 1
              then
                Isomorphism map:
                From: Number Field in a with defining polynomial x^4 + 3*x + 1
                To:   Vector space of dimension 4 over Rational Field

      sage: to(a), to(a + 1)
      ((0, 1, 0, 0), (1, 1, 0, 0))
      sage: fr(to(a)), fr(V([0, 1, 2, 3]))
      (a, 3*a^3 + 2*a^2 + a)

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> K = NumberField(x**Integer(4) + Integer(3)*x + Integer(1), names=('a',)); (a,) = K._first_ngens(1)
      >>> V, fr, to = K.vector_space()
      >>> V
      Vector space of dimension 4 over Rational Field
      >>> fr
      Isomorphism map:
        From: Vector space of dimension 4 over Rational Field
        To:   Number Field in a with defining polynomial x^4 + 3*x + 1
      >>> to
      Isomorphism map:
        From: Number Field in a with defining polynomial x^4 + 3*x + 1
        To:   Vector space of dimension 4 over Rational Field
      >>> type(fr), type(to)
      (<class 'sage.rings.number_field.maps.MapVectorSpaceToNumberField'>,
       <class 'sage.rings.number_field.maps.MapNumberFieldToVectorSpace'>)

      >>> fr.is_injective(), fr.is_surjective()
      (True, True)

      >>> fr.domain(), to.codomain()
      (Vector space of dimension 4 over Rational Field,
       Vector space of dimension 4 over Rational Field)
      >>> to.domain(), fr.codomain()
      (Number Field in a with defining polynomial x^4 + 3*x + 1,
       Number Field in a with defining polynomial x^4 + 3*x + 1)
      >>> fr * to
      Composite map:
        From: Number Field in a with defining polynomial x^4 + 3*x + 1
        To:   Number Field in a with defining polynomial x^4 + 3*x + 1
        Defn:   Isomorphism map:
                From: Number Field in a with defining polynomial x^4 + 3*x + 1
                To:   Vector space of dimension 4 over Rational Field
              then
                Isomorphism map:
                From: Vector space of dimension 4 over Rational Field
                To:   Number Field in a with defining polynomial x^4 + 3*x + 1
      >>> to * fr
      Composite map:
        From: Vector space of dimension 4 over Rational Field
        To:   Vector space of dimension 4 over Rational Field
        Defn:   Isomorphism map:
                From: Vector space of dimension 4 over Rational Field
                To:   Number Field in a with defining polynomial x^4 + 3*x + 1
              then
                Isomorphism map:
                From: Number Field in a with defining polynomial x^4 + 3*x + 1
                To:   Vector space of dimension 4 over Rational Field

      >>> to(a), to(a + Integer(1))
      ((0, 1, 0, 0), (1, 1, 0, 0))
      >>> fr(to(a)), fr(V([Integer(0), Integer(1), Integer(2), Integer(3)]))
      (a, 3*a^3 + 2*a^2 + a)

class sage.rings.number_field.maps.MapVectorSpaceToRelativeNumberField(V, L, from_V, from_K)

  Bases: `NumberFieldIsomorphism`

  The isomorphism to a relative number field from its underlying \(\QQ\)-vector space. Compare `MapRelativeVectorSpaceToRelativeNumberField`.

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: L.<a, b> = NumberField([x^2 + 3, x^2 + 5])
      sage: V, fr, to = L.absolute_vector_space()
      sage: type(fr)
      <class 'sage.rings.number_field.maps.MapVectorSpaceToRelativeNumberField'>

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> L = NumberField([x**Integer(2) + Integer(3), x**Integer(2) + Integer(5)], names=('a', 'b',)); (a, b,) = L._first_ngens(2)
      >>> V, fr, to = L.absolute_vector_space()
      >>> type(fr)
      <class 'sage.rings.number_field.maps.MapVectorSpaceToRelativeNumberField'>

class sage.rings.number_field.maps.NameChangeMap(K, L)

  Bases: `NumberFieldIsomorphism`

  A map between two isomorphic number fields with the same defining polynomial but different variable names.

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: K.<a> = NumberField(x^2 - 3)
      sage: L.<b> = K.change_names()
      sage: from_L, to_L = L.structure()
      sage: from_L
      Isomorphism given by variable name change map:
        From: Number Field in b with defining polynomial x^2 - 3
        To:   Number Field in a with defining polynomial x^2 - 3
      sage: to_L
      Isomorphism given by variable name change map:
        From: Number Field in a with defining polynomial x^2 - 3
        To:   Number Field in b with defining polynomial x^2 - 3
      sage: type(from_L), type(to_L)
      (<class 'sage.rings.number_field.maps.NameChangeMap'>,
       <class 'sage.rings.number_field.maps.NameChangeMap'>)

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> K = NumberField(x**Integer(2) - Integer(3), names=('a',)); (a,) = K._first_ngens(1)
      >>> L = K.change_names(names=('b',)); (b,) = L._first_ngens(1)
      >>> from_L, to_L = L.structure()
      >>> from_L
      Isomorphism given by variable name change map:
        From: Number Field in b with defining polynomial x^2 - 3
        To:   Number Field in a with defining polynomial x^2 - 3
      >>> to_L
      Isomorphism given by variable name change map:
        From: Number Field in a with defining polynomial x^2 - 3
        To:   Number Field in b with defining polynomial x^2 - 3
      >>> type(from_L), type(to_L)
      (<class 'sage.rings.number_field.maps.NameChangeMap'>,
       <class 'sage.rings.number_field.maps.NameChangeMap'>)

class sage.rings.number_field.maps.NumberFieldIsomorphism

  Bases: `Map`

  A base class for various isomorphisms between number fields and vector spaces.

  EXAMPLES:

  Sage

      sage: x = polygen(ZZ, 'x')
      sage: K.<a> = NumberField(x^4 + 3*x + 1)
      sage: V, fr, to = K.vector_space()
      sage: isinstance(fr, sage.rings.number_field.maps.NumberFieldIsomorphism)
      True

  Python

      >>> from sage.all import *
      >>> x = polygen(ZZ, 'x')
      >>> K = NumberField(x**Integer(4) + Integer(3)*x + Integer(1), names=('a',)); (a,) = K._first_ngens(1)
      >>> V, fr, to = K.vector_space()
      >>> isinstance(fr, sage.rings.number_field.maps.NumberFieldIsomorphism)
      True

  is_injective()

    EXAMPLES:

    Sage

        sage: x = polygen(ZZ, 'x')
        sage: K.<a> = NumberField(x^4 + 3*x + 1)
        sage: V, fr, to = K.vector_space()
        sage: fr.is_injective()
        True

    Python

        >>> from sage.all import *
        >>> x = polygen(ZZ, 'x')
        >>> K = NumberField(x**Integer(4) + Integer(3)*x + Integer(1), names=('a',)); (a,) = K._first_ngens(1)
        >>> V, fr, to = K.vector_space()
        >>> fr.is_injective()
        True

  is_surjective()

    EXAMPLES:

    Sage

        sage: x = polygen(ZZ, 'x')
        sage: K.<a> = NumberField(x^4 + 3*x + 1)
        sage: V, fr, to = K.vector_space()
        sage: fr.is_surjective()
        True

    Python

        >>> from sage.all import *
        >>> x = polygen(ZZ, 'x')
        >>> K = NumberField(x**Integer(4) + Integer(3)*x + Integer(1), names=('a',)); (a,) = K._first_ngens(1)
        >>> V, fr, to = K.vector_space()
        >>> fr.is_surjective()
        True