数域 - 构建指南 v10.8

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

# 数域

## 分歧 (Ramification)

如何在 Sage 中计算具有给定判别式和分歧的数域？

Sage 可以访问 Jones 数域数据库，该数据库包含有界分歧且度数不超过 6 的数域。 该数据库必须单独安装（`database_jones_numfield`）。

首先加载数据库：

Sage

    sage: J = JonesDatabase()            # optional - database
    sage: J                              # optional - database
    John Jones's table of number fields with bounded ramification and degree <= 6

Python

    >>> from sage.all import *
    >>> J = JonesDatabase()            # optional - database
    >>> J                              # optional - database
    John Jones's table of number fields with bounded ramification and degree <= 6

列出数据库中所有分歧最多为 2 的数域的度数和判别式：

Sage

    sage: [(k.degree(), k.disc()) for k in J.unramified_outside([2])] # optional - database
    [(4, -2048), (2, 8), (4, -1024), (1, 1), (4, 256), (2, -4), (4, 2048), (4, 512), (4, 2048), (2, -8), (4, 2048)]

[Python]

    >>> from sage.all import *
    >>> [(k.degree(), k.disc()) for k in J.unramified_outside([Integer(2)])] # optional - database
    [(4, -2048), (2, 8), (4, -1024), (1, 1), (4, 256), (2, -4), (4, 2048), (4, 512), (4, 2048), (2, -8), (4, 2048)]

列出在 2 之外无分歧且度数恰好为 2 的域的判别式：

Sage

    sage: [k.disc() for k in J.unramified_outside([2],2)] # optional - database
    [8, -4, -8]

Python

    >>> from sage.all import *
    >>> [k.disc() for k in J.unramified_outside([Integer(2)],Integer(2))] # optional - database
    [8, -4, -8]

列出数据库中在 3 和 5 处有分歧的立方域的判别式：

Sage

    sage: [k.disc() for k in J.ramified_at([3,5],3)] # optional - database
    [-6075, -6075, -675, -135]
    sage: factor(6075)
    3^5 * 5^2
    sage: factor(675)
    3^3 * 5^2
    sage: factor(135)
    3^3 * 5

[Python]

    >>> from sage.all import *
    >>> [k.disc() for k in J.ramified_at([Integer(3),Integer(5)],Integer(3))] # optional - database
    [-6075, -6075, -675, -135]
    >>> factor(Integer(6075))
    3^5 * 5^2
    >>> factor(Integer(675))
    3^3 * 5^2
    >>> factor(Integer(135))
    3^3 * 5

列出所有在 101 处有分歧的域：

Sage

    sage: J.ramified_at(101)                     # optional - database
    [Number Field in a with defining polynomial x^2 - 101,
     Number Field in a with defining polynomial x^4 - x^3 + 13*x^2 - 19*x + 361,
     Number Field in a with defining polynomial x^5 - x^4 - 40*x^3 - 93*x^2 - 21*x + 17,
     Number Field in a with defining polynomial x^5 + x^4 - 6*x^3 - x^2 + 18*x + 4,
     Number Field in a with defining polynomial x^5 + 2*x^4 + 7*x^3 + 4*x^2 + 11*x - 6]

Python

    >>> from sage.all import *
    >>> J.ramified_at(Integer(101))                     # optional - database
    [Number Field in a with defining polynomial x^2 - 101,
     Number Field in a with defining polynomial x^4 - x^3 + 13*x^2 - 19*x + 361,
     Number Field in a with defining polynomial x^5 - x^4 - 40*x^3 - 93*x^2 - 21*x + 17,
     Number Field in a with defining polynomial x^5 + x^4 - 6*x^3 - x^2 + 18*x + 4,
     Number Field in a with defining polynomial x^5 + 2*x^4 + 7*x^3 + 4*x^2 + 11*x - 6]

## 类数 (Class numbers)

如何在 Sage 中计算数域的类数 (class number)？

`class_number` 是一个与 QuadraticField 对象相关的方法：

Sage

    sage: K = QuadraticField(29, 'x')
    sage: K.class_number()
    1
    sage: K = QuadraticField(65, 'x')
    sage: K.class_number()
    2
    sage: K = QuadraticField(-11, 'x')
    sage: K.class_number()
    1
    sage: K = QuadraticField(-15, 'x')
    sage: K.class_number()
    2
    sage: K.class_group()
    Class group of order 2 with structure C2 of Number Field in x with defining polynomial x^2 + 15 with x = 3.872983346207417?*I
    sage: K = QuadraticField(401, 'x')
    sage: K.class_group()
    Class group of order 5 with structure C5 of Number Field in x with defining polynomial x^2 - 401 with x = 20.02498439450079?
    sage: K.class_number()
    5
    sage: K.discriminant()
    401
    sage: K = QuadraticField(-479, 'x')
    sage: K.class_group()
    Class group of order 25 with structure C25 of Number Field in x with defining polynomial x^2 + 479 with x = 21.88606862823929?*I
    sage: K.class_number()
    25
    sage: K.pari_polynomial()
    x^2 + 479
    sage: K.degree()
    2

Python

    >>> from sage.all import *
    >>> K = QuadraticField(Integer(29), 'x')
    >>> K.class_number()
    1
    >>> K = QuadraticField(Integer(65), 'x')
    >>> K.class_number()
    2
    >>> K = QuadraticField(-Integer(11), 'x')
    >>> K.class_number()
    1
    >>> K = QuadraticField(-Integer(15), 'x')
    >>> K.class_number()
    2
    >>> K.class_group()
    Class group of order 2 with structure C2 of Number Field in x with defining polynomial x^2 + 15 with x = 3.872983346207417?*I
    >>> K = QuadraticField(Integer(401), 'x')
    >>> K.class_group()
    Class group of order 5 with structure C5 of Number Field in x with defining polynomial x^2 - 401 with x = 20.02498439450079?
    >>> K.class_number()
    5
    >>> K.discriminant()
    401
    >>> K = QuadraticField(-Integer(479), 'x')
    >>> K.class_group()
    Class group of order 25 with structure C25 of Number Field in x with defining polynomial x^2 + 479 with x = 21.88606862823929?*I
    >>> K.class_number()
    25
    >>> K.pari_polynomial()
    x^2 + 479
    >>> K.degree()
    2

下面是一个更为一般的数域类型的例子：

Sage

    sage: x = PolynomialRing(QQ, 'x').gen()
    sage: K = NumberField(x^5+10*x+1, 'a')
    sage: K
    Number Field in a with defining polynomial x^5 + 10*x + 1
    sage: K.degree()
    5
    sage: K.pari_polynomial()
    x^5 + 10*x + 1
    sage: K.discriminant()
    25603125
    sage: K.class_group()
    Class group of order 1 of Number Field in a with defining
    polynomial x^5 + 10*x + 1
    sage: K.class_number()
    1

[Python]

    >>> from sage.all import *
    >>> x = PolynomialRing(QQ, 'x').gen()
    >>> K = NumberField(x**Integer(5)+Integer(10)*x+Integer(1), 'a')
    >>> K
    Number Field in a with defining polynomial x^5 + 10*x + 1
    >>> K.degree()
    5
    >>> K.pari_polynomial()
    x^5 + 10*x + 1
    >>> K.discriminant()
    25603125
    >>> K.class_group()
    Class group of order 1 of Number Field in a with defining
    polynomial x^5 + 10*x + 1
    >>> K.class_number()
    1

- 另请参见 Math World 网站上的类数链接 http://mathworld.wolfram.com/ClassNumber.html 获取表格、公式和背景信息。

- 对于循环域，可以尝试：

  Sage

      sage: K = CyclotomicField(19)
      sage: K.class_number()    # long time
      1

  Python

      >>> from sage.all import *
      >>> K = CyclotomicField(Integer(19))
      >>> K.class_number()    # long time
      1

更多详情，请参见 `ring/number_field.py` 中的文档。

## 整基 (Integral basis)

如何在 Sage 中计算数域的整基？

Sage 可以计算数域的元素列表，该列表是该数域的整数全环的基。

Sage

    sage: x = PolynomialRing(QQ, 'x').gen()
    sage: K = NumberField(x^5+10*x+1, 'a')
    sage: K.integral_basis()
    [1, a, a^2, a^3, a^4]

Python

    >>> from sage.all import *
    >>> x = PolynomialRing(QQ, 'x').gen()
    >>> K = NumberField(x**Integer(5)+Integer(10)*x+Integer(1), 'a')
    >>> K.integral_basis()
    [1, a, a^2, a^3, a^4]

接下来我们计算立方域的整数环，其中 2 是“基本判别式因子”，因此整数环不是由单个元素生成的。

Sage

    sage: x = PolynomialRing(QQ, 'x').gen()
    sage: K = NumberField(x^3 + x^2 - 2*x + 8, 'a')
    sage: K.integral_basis()
    [1, 1/2*a^2 + 1/2*a, a^2]

[Python]

    >>> from sage.all import *
    >>> x = PolynomialRing(QQ, 'x').gen()
    >>> K = NumberField(x**Integer(3) + x**Integer(2) - Integer(2)*x + Integer(8), 'a')
    >>> K.integral_basis()
    [1, 1/2*a^2 + 1/2*a, a^2]