数字域:Galois组和类组

伽罗瓦集团

我们可以使用 galois_group 函数,默认情况下调用Pari(http://pari.math.u-bordeaux.fr/). 你不必担心安装Pari,因为 帕里是Sage的一部分 . 事实上,尽管表面上Sage中许多困难的代数数论实际上是由Pari C库完成的(一定要在使用Sage的论文中引用Pari)。

sage: K.<alpha> = NumberField(x^6 + 40*x^3 + 1372)
sage: G = K.galois_group()
sage: G
Galois group of Number Field in alpha with defining polynomial x^6 + 40*x^3 + 1372

在内部G表示为一组置换,但我们也可以将G的任何元素应用于字段的任何元素:

sage: G.order()
6
sage: G.gens()
[(1,2)(3,4)(5,6), (1,4,6)(2,5,3)]
sage: f = G.1; f(alpha)
1/36*alpha^4 + 1/18*alpha

一些更先进的数论工具可通过G:

sage: P = K.primes_above(2)[0]
sage: G.inertia_group(P)
Subgroup [(), (1,4,6)(2,5,3), (1,6,4)(2,3,5)] of Galois group of Number Field in alpha with defining polynomial x^6 + 40*x^3 + 1372
sage: sorted([G.artin_symbol(Q) for Q in K.primes_above(5)])  # random order, see Trac #18308
[(1,3)(2,6)(4,5), (1,2)(3,4)(5,6), (1,5)(2,4)(3,6)]

如果数字域不是Galois over QQ 然后 galois_group 命令将构造其Galois闭包并返回该闭包的Galois组;您需要为Galois闭包的生成器指定一个变量名:

sage: K.<a> = NumberField(x^3 - 2)
sage: G = K.galois_group(names='b'); G
Galois group of Galois closure in b of Number Field in a with defining polynomial x^3 - 2
sage: G.order()
6

更多的伽罗瓦集团

我们又计算了两个伽罗瓦度群 \(5\) 扩张,看看有伽罗瓦群 \(S_5\) ,所以不能被自由基解决。为了这些目的,我们只想知道Galois群的结构是一个抽象群,而不是分裂域的一个显式自同构群;这一点计算起来要快得多。PARI有一个表示“抽象Galois group”的类型,Sage可以使用它:

sage: NumberField(x^5 - 2, 'a').galois_group(type="pari")
Galois group PARI group [20, -1, 3, "F(5) = 5:4"] of
degree 5 of the Number Field in a with defining
polynomial x^5 - 2
sage: NumberField(x^5 - x + 2, 'a').galois_group(type="pari")
Galois group PARI group [120, -1, 5, "S5"] of degree 5 of
the Number Field in a with defining polynomial x^5 - x + 2

岩浆伽罗瓦集团司令部

最新版本的Magma有一种计算Galois群的算法,理论上,当输入多项式具有任意阶数时,该算法适用。这个算法没有开源实现(据我所知)。如果你有岩浆,你可以通过调用 galois_group 函数和 algorithm='magma' 选项。返回值是间隙传递组数据库中的组之一。

sage: K.<a> = NumberField(x^3 - 2)
sage: K.galois_group(type="gap", algorithm='magma')  # optional - magma
Galois group Transitive group number 2 of degree 3 of
the Number Field in a with defining polynomial x^3 - 2

我们强调,如果你没有岩浆的话,上面的例子不应该起作用。

计算复杂嵌入

您还可以枚举数字字段的所有复杂嵌入:

sage: K.complex_embeddings()
[
Ring morphism:
  From: Number Field in a with defining polynomial x^3 - 2
  To:   Complex Field with 53 bits of precision
  Defn: a |--> -0.629960524947437 - 1.09112363597172*I,
Ring morphism:
  From: Number Field in a with defining polynomial x^3 - 2
  To:   Complex Field with 53 bits of precision
  Defn: a |--> -0.629960524947437 + 1.09112363597172*I,
Ring morphism:
  From: Number Field in a with defining polynomial x^3 - 2
  To:   Complex Field with 53 bits of precision
  Defn: a |--> 1.25992104989487
]

班级编号和班级分组

班集体 \(C_K\) 数字域的 \(K\) 是最大阶的分式理想群 \(R\) 属于 \(K\) 模主分式理想的子群。代数数论的一个主要定理断言 \(C_K\) 是一个有限群。例如,二次数字段 \(\QQ(\sqrt{{-23}})\) 有班级编号 \(3\) ,正如我们看到的使用Sage class number 命令。

sage: L.<a> = NumberField(x^2 + 23)
sage: L.class_number()
3

类数为1的二次虚域

只有9个二次虚场 \(\QQ(\sqrt{{D}})\) 有班级编号的 \(1\)

\[D=-3、-4、-7、-8、-11、-19、-43、-67、-163\]

为了使用Sage找到这个列表,我们首先尝试在Sage中创建列表。例如,键入 [1..10] 使整数列表介于 \(1\)\(10\) .

sage: [1..10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我们也可以列出 \(1\)\(11\) ,通过键入 [1,3,..,11] ,即在算术级数中给出第二项。

sage: [1,3,..,11]
[1, 3, 5, 7, 9, 11]

运用这个思想,我们从 \(-1\) 下至 \(-10\) .

sage: [-1,-2,..,-10]
[-1, -2, -3, -4, -5, -6, -7, -8, -9, -10]

枚举类为1的二次虚域

下面的前两行是一个列表 \(v\) 每一个 \(D\)\(-1\) 下至 \(-200\) 这样的话 \(D\) 是一个基本判别式(二次虚场的判别式)。

注解

请注意,您不会看到。。。在下面的输出中;这个。。。符号只是表示下面省略了部分输出。

sage: w = [-1,-2,..,-200]
sage: v = [D for D in w if is_fundamental_discriminant(D)]
sage: v
[-3, -4, -7, -8, -11, -15, -19, -20, ..., -195, -199]

最后,我们列出 \(D\) 在我们的名单上 \(v\) 使得二次数域 \(\QQ(\sqrt{{D}})\) 有班级编号 \(1\) . 注意到 QuadraticField(D)NumberField(x^2 - D) .

sage: [D for D in v if QuadraticField(D,'a').class_number()==1]
[-3, -4, -7, -8, -11, -19, -43, -67, -163]

当然,我们有 not 证明这是所有否定的清单 \(D\) 以便 \(\QQ(\sqrt{{D}})\) 有班级编号 \(1\) .

1类字段

一个令人沮丧的开放性问题是证明存在无限多个带类号的数域 \(1\) . 通过计算一堆实二次域的类数,很容易让人相信这可能是真的。例如,超过58%的实二次数域具有判别式 \(D<1000\) 有班级编号 \(1\) 你说什么?

sage: w = [1..1000]
sage: v = [D for D in w if is_fundamental_discriminant(D)]
sage: len(v)
302
sage: len([D for D in v if QuadraticField(D,'a').class_number() == 1])
176
sage: 176.0/302
0.582781456953642

要想了解更多关于正在发生的事情的直觉,请阅读Cohen Lenstra启发式方法。

分圆域的类数

Sage还可以在合理的范围内计算更高程度扩展的类数。这里我们用速记 CyclotomicField(n) 创建数字字段 \(\QQ(\zeta_n)\) .

sage: CyclotomicField(7)
Cyclotomic Field of order 7 and degree 6
sage: for n in [2..15]:
....:     print("{} {}".format(n, CyclotomicField(n).class_number()))
2 1
3 1
...
15 1

在上面的代码中,符号 for n in [2..15]: ... 意思是“做。。。对于 \(n\) 等于每个整数 \(2,3,4,\dots,15\) ."

注解

练习:计算前面示例的输出中省略的内容(替换为…)。

假设猜想以加快计算速度

Sage中类号和类群的计算由Pari C库完成,并且 不像巴黎 ,默认情况下,Sage告诉Pari 不要假设 任何猜测。这会使一些命令比直接在Pari中慢得多 假设未经证实的猜想 默认情况下。幸运的是,很容易告诉Sage要更加宽容,允许Pari假设猜想,无论是对于这一个调用,还是从此以后对于所有的数域函数。例如,使用 proof=False 根据Pari假设的猜想,只需几秒钟就可以验证 \(\QQ(\zeta_{{23}})\)\(3\) .

sage: CyclotomicField(23).class_number(proof=False)
3

注解

练习:最小的是什么 \(n\) 这样的话 \(\QQ(\zeta_n)\) 类号大于 \(1\) 是吗?

类群结构

除了计算类数,Sage还可以计算类组的组结构和生成器。例如,二次域 \(\QQ(\sqrt{{-30}})\) 具有类组 \(C = (\ZZ/2\ZZ)^{{\oplus 2}}\) ,其中包含 \((5,\sqrt{{-30}})\)\((3,\sqrt{{-30}})\) .

sage: K.<a> = QuadraticField(-30)
sage: C = K.class_group()
sage: C
Class group of order 4 with structure C2 x C2 of Number Field in a with defining polynomial x^2 + 30 with a = 5.477225575051661?*I
sage: category(C)
Category of finite enumerated commutative groups
sage: C.gens()
(Fractional ideal class (2, a), Fractional ideal class (3, a))

组内算术

在Sage中,符号 C.i 意思是“the \(i^{{th}}\) 对象的生成器 \(C\) ,其中生成器按数字索引 \(0, 1, 2, \dots\) . 下面,当我们写的时候 C.0 \* C.1 ,这意味着“类组的第0个和第1个生成器的乘积 \(C\) ."

sage: K.<a> = QuadraticField(-30)
sage: C = K.class_group()
sage: C.0
Fractional ideal class (2, a)
sage: C.0.ideal()
Fractional ideal (2, a)
sage: I = C.0 * C.1
sage: I
Fractional ideal class (5, a)

接下来我们发现分数理想的类 \((2,\sqrt{{-30}}+4/3)\) 等于理想阶级 \(C.0\) .

sage: A = K.ideal([2, a+4/3])
sage: J = C(A)
sage: J
Fractional ideal class (2/3, 1/3*a)
sage: J == C.0
True

不幸的是,目前在Sage类中没有理想的生成项。