简介:这是一部代数数论领域公认的经典教材,作者为德国数学家尤尔根·诺伊基希,由诺伯特·夏帕赫尔译成英文,德语原版1992年出版,英译本1999年列入施普林格“数学基础”系列。全书从整数、有理数、代数整数与有限域等基本对象出发,系统论述伽罗瓦群、理想理论、L函数等核心主题,既保留了严谨的定理证明和丰富的例子,也深入展示了类域论、阿廷互反律等现代分支。资源本身是完整的PDF电子书,整个压缩包只有1个文件,体积为6.33MB,轻巧易携带,适合离线阅读。目前该资源已有234人学习浏览。读者能获得这本英文原版教材的全部章节,既可作为研究生代数数论课程的权威参考,也可用于自学提升和科研查阅,无论是掌握理论框架还是跟进经典证明都很有帮助。
1. 代数数论入门:《Algebraic Number Theory》这份 PDF 到底值不值得精读
做代数数论相关的阅读和实现时,很多真正动手的人都被同一个问题卡住:理想、类群、单位定理这些抽象概念,怎样跳出定义层面变成可以复算的工具?这份经典教材 PDF 就是为这条路径准备的。它从代数整数的基本性质讲起,一路推到理想分解、类群、单位定理、Dedekind zeta 函数和类数公式,最后落到局部域与类域论的地基。它适合已经修过抽象代数和基础数论、想系统进入代数数论的人,也适合做密码学或代数几何时回来补背景的研究生。整本书的证明密度很高,但真把它啃下来,后面再读现代文献会轻松很多。
2. 先把代数整数和理想理论打通:读前三章要抓的核心主线
代数数论与初等数论最大的分岔不在于“数”的推广,而在于“因子分解”的表达方式发生了变化。读这份 PDF 的前三章时,如果只是跟着定义走,很容易被“整闭包”“分式理想”淹没。我更建议一开始就盯住一个具体目标:搞清楚为什么普通整数的唯一分解定理在代数整数环里失效后,是用理想分解来补位的。
2.1 为什么代数整数比普通整数更“不听话”?从经典反例切入
先看一个最简单的例子。考虑二次整数环 Z[√-5],也就是形如 a + b√-5 的复数,其中 a、b 是整数。这个环里的元素可以计算范数 N(a + b√-5) = a² + 5b²。在普通整数环里,6 的分解只有 2 × 3,但在这个环里却有:
6 = 2 × 3 = (1 + √-5)(1 - √-5)
这四个因子在 Z[√-5] 里都是不可约的。也就是说,普通意义上的不可约分解不唯一。教材在这个位置引入“素理想”替代“素数”,目的就是把这种混乱重新纳入一个框架。
这里的本质是:Z[√-5] 不是唯一分解整环,但它是一个 Dedekind 整环。Dedekind 整环的关键性质是“非零理想可以唯一地分解成素理想的乘积”。注意,是理想而不是元素。这个视角转换是整个前三章的枢纽。阅读时不要跳过 Dedekind 整环的等价定义,那些看似绕路的性质——Noether、整闭、每个非零素理想都是极大理想——恰恰是后面类群和分歧理论的出发点。
一个常见误区是试图在 Z[√-5] 里强行找唯一分解的有理数版本。没有的。唯一分解只发生在“理想”层面。比如主理想 (6) 可以写成 (6) = (2)(3) = (1+√-5)(1-√-5),而进一步把每个因子拆成素理想后,两边会得到相同的素理想集合。书里的第三章用了很大篇幅证明这一点,我读的时候最喜欢的做法是把 6、2、3、1+√-5、1-√-5 分别分解成素理想,然后对比两棵树是否一致。
2.2 理想分解与 Dedekind 整环:你需要建立的第一张概念表
第三章里有几个定理属于必须背下来的工具箱。第一个是“去掉整数的 Dedekind 整环中,非零理想唯一分解为素理想乘积”。第二个是“有理素数 p 在数域 K 中的分解可以通过极小多项式模 p 的分解得到”。这张表我建议整理成:
| 数论对象 | 对应物 | 解释 |
|---|---|---|
| 有理素数 p | 素理想 P | p 在整数环 O_K 中分裂、惯性或分歧 |
| 极小多项式 f(x) | 模 p 的不可约因子 | p 的分解由 f 模 p 的不可约因子决定 |
| 判别式 Δ_K | 分歧位置 | p |
| 剩余扩域的度数 f | 因子次数 | 每个素理想的范 N(P) = p^f |
| 素理想的个数 g | 不可约因子个数 | pO_K = P_1^{e_1} ... P_g^{e_g} 中 g |
这张表帮助我避免了一个大坑:把“理想分解”当成“元素分解”。书里有一个典型例子是 Q(√-5) 中 p = 2 的分解。极小多项式 x²+5 在 F_2 上分解为 (x+1)²,所以 2O_K = P²,其中 P = (2, 1+√-5)。这个 P 的范数是 2,但 P 不是主理想。如果误以为 2O_K 是两个不同素理想的乘积,后面计算类群就会出错。
实际操作时,我一般会先用一个小脚本验证这些分解,而不是直接读证明。这样对“分歧指数”“惯性度”的理解会更直观。下面给一个尽可能短的 Sage 脚本,适合对照书中例子跑。
# 构造二次域 Q(sqrt(-5)) K.<a> = NumberField(x^2 + 5) # 查看整数环 OK = K.maximal_order() print("判别式:", K.discriminant()) # 分解有理素数 2 print("2 的分解:", factor(OK(2))) # 分解有理素数 3 print("3 的分解:", factor(OK(3))) # 分解素理想 (1+sqrt(-5)) 对应的主理想 from sage.rings.ideal import factor as ideal_factor print("(1+a) 的分解:", factor(OK(1+a)))逻辑说明:这段代码先创建数域 K = Q(√-5),然后断言它的整数环,打印判别式,再对几个具体整数理想做分解。factor(OK(2)) 返回的是素理想的带指数乘积。运行结果会看到 2O_K = P² 的形态,而 3O_K 则可能分解成两个不同素理想,直观解释书中的第三命题。参数说明:x^2 + 5 是 Q(√-5) 的极小多项式,如果换成 x^2 - 5 就是实二次域,分解行为会完全不同。建议读者把 5 改成 1、2、-1、-2,观察判别式与分歧的关系。
2.3 用脚本验证分解规则:一个最简的 p 分解对比工具
书里第二章反复强调 Dedekind 整环的分解由模 p 的因子决定。自己写代码时,可以只依赖一个原则:设 f(x) 是数域 K 的元多项式的极小多项式,若 p 不整除 [O_K : Z[α]] 的指数,那么 pO_K 的分解就是 f(x) 在 F_p[x] 中分解的“翻印”。注意这个“不整除指数”条件非常重要,课本里往往把指数正则的情形先讨论,后面再补一般情形。
下面这段 Python 代码不使用任何代数数论专用库,只用 sympy 来分解多项式模 p,让你看到“因子”与“素理想”之间的对应:
import sympy as sp # 定义变量与极小多项式 x = sp.Symbol('x') f = x**2 + 5 # 取几个有理素数 for p in [2, 3, 5, 7]: # 多项式模 p 分解 fp = sp.Poly(f, x, modulus=p) factors = sp.factor(fp) print(f"p={p}: {factors}")逻辑说明:sympy 的 modulus 参数让多项式系数落在有限域。输出如 x^2 + 5 模 2 变成 (x+1)^2,模 3 变成 x^2+2 不可约,模 5 变成 x^2,模 7 变成 (x+1)(x-1) 之类。每一种形态都对应一个有理素数在数域中的分歧、惯性或分裂。这个脚本的好处是不依赖重型 CAS,适合快速找规律。参数说明:modulus 关键字在 sympy 1.6 后稳定支持;如果你使用旧版本,可能需要用sp.factor(f, modulus=p)的写法。
读完前三章,至少要做完两个动作:一是手动把 6 在 Z[√-5] 中分解成素理想乘积,并写出每个素理想生成元组;二是用脚本验证至少三个素数的分解模式。这两个动作做完,后续的类群计算就不会悬空。
3. 类群与单位定理:从定义到计算,把抽象概念落到有限步骤
类群是代数数论中第一次出现“全局”结构的地方。前面的理想分解是局部的,而类群 K 通过分式理想模主理想,刻画“这个数域的整数环距离 PID 有多远”。如果类群平凡,那么唯一分解在元素层面恢复;如果不平凡,则需要用类数来度量偏差。读这份 PDF 的第四章时,我的经验是不要先纠结证明,而是先去把一个具体数域的类群算出来,再回头理解定理。
3.1 类群的几何意义:为什么它是“测度理想偏离主理想的刻度”
分式理想是 O_K 中的有限生成模,而主分式理想由 K* 中的元素生成。商群 C_l = FracIdeals / PrincipalIdeals 就是类群。它的阶 h_K 叫类数。类数 h=1 的数域非常少,比如 Q、Q(√-5) 的类数是 2,Q(√-2) 的类数是 1,Q(∛2) 的类数是 1。类数 _h 越大,说明理想的“非主性”越强,也越难用普通元素做运算。
课本里一个重要定理是类群的有限性。证明用到了 Minkowski 界:每个理想的理想类中,都存在一个范数不超过 Minkowski 界值的整理想。Minkowski 界的具体公式是 (4/π)^{r2} * n! / n^n * sqrt(|d|),其中 n 是扩张次数,r2 是复嵌入对数,d 是判别式。这个界的价值不只是证明有限性,它还给出了手算类群的算法:找出所有范数小于这个界的素理想,生成类群。
我读这一章时最大的顿悟是“类群元素对应的是理想类而不是某个具体理想”。同一个理想乘以一个主理想得到另一个理想,它们属于同一类。所以计算类群时,只需要生成范数有界的素理想,然后看它们之间有多少个主理想关系。有限性保证了这一步一定能停,但若懒得手算,可以用下面脚本。
3.2 Dirichlet 单位定理的秩公式:哪些场景会算错
单位定理回答的是“单位群 U_K 有多少个自由生成元”。设 K 有 r1 个实嵌入和 r2 对复嵌入,那么 U_K 与 μ_K × Z^{r1+r2-1} 同构,其中 μ_K 是单位根群。这个秩公式记起来容易,但实际应用时有两个易错点。
第一,r2 的单位是“对复嵌入”,不是单个复嵌入。例如 Q(√-5) 有 0 个实嵌入、2 个复嵌入,但 r2 = 1,所以单位秩 = 0 + 1 - 1 = 0,即单位群只有单位根。注意这里不能写成 2 - 1 = 1。第二,r1 + r2 - 1 在 r1 = 0 且 r2 = 1 时是 0,对应虚二次域的有限单位群,常见教材会特别强调。而在实二次域中 r1=2, r2=0,秩为 1,所以有无限多个基本单位,对应 Pell 方程的解。这个联系在思考“为什么 Pell 方程有无穷多解”时很有用。
单位定理的证明用到了 log 嵌入,把乘法群映射到加法空间。这个映射不是单射,但核刚好是单位根群,像的格秩就是 r1+r2-1。理解这个几何图像对后续类数公式中的 Regulator 至关重要。
3.3 手算配合脚本:算一次纯三次域的类数与基本单位
纯三次域 Q(α),其中 α = ∛2,它的极小多项式是 x³ - 2。这个域有两个复嵌入和一个实嵌入,所以 r1=1, r2=1,单位秩 = 1 + 1 - 1 = 1。单位根只有 ±1。用 Sage 可以一次拿到类群和单位群,但更重要的是对照课本理解每一步。
# 构造纯三次域 Q(2^(1/3)) K.<a> = NumberField(x^3 - 2) # 类群结构 print("类群:", K.class_group()) print("类数:", K.class_number()) # 单位群 units = K.unit_group() print("单位群结构:", units) print("基本单位:", units.fundamental_units())逻辑说明:Sage 的 class_group() 返回有限阿贝尔群结构,fundamental_units() 返回自由生成元列表。对于 Q(∛2),类群平凡,基本单位是 1 - α。你可能会意外:为什么 1 - α 有乘法逆?因为它是单位,范数为 ±1。运行结果会显示类似[1, 1]的结构,第一个 1 对应类群的单位元,第二个 1 对应自由秩。参数说明:如果换成 x^3 - 3 或 x^3 + 2,结果会变。建议同时打印 K.signature() 来确认 r1/r2,防止搞错。
手算思路是:先用 Minkowski 界确定需要检查的素理想范数范围。对于 Q(∛2),判别式 -108,n=3, r1=1, r2=1,Minkowski 界约 4.3,所以只需要检查 p=2、3。然后手工分解 2 和 3,发现它们生成的理想类都是主理想,因此类群平凡。这种用脚本验证手算的方法,比单纯背定理牢固得多。
4. 解析理论与 zeta 函数:读后半本前需要先补的背景
很多从代数部分直接跳入类域论的人,会在 zeta 函数这里摔跤。因为这本书在证明任何关于素理想分布的结论前,先花大量篇幅建立 Dedekind zeta 函数的解析性质。如果只想要一个“类数公式”的结果,很容易跳过证明,结果后面在局部 zeta 因子那里一塌糊涂。我建议把第四章看作一个桥梁:它教你用解析方法重新证明代数结构。
4.1 Dedekind zeta 函数和素数理想的关系:先看收敛性与欧拉积
定义式是所有非零整理想 a 的范数幂求和:
ζ_K(s) = Σ_{a非零整理想} 1 / N(a)^s
与黎曼 zeta 的类比点在于:黎曼 zeta 是对正整数求和,这里是对正整数推广到理想。一个关键的表达是欧拉积:
ζ_K(s) = ∏_{P素理想} (1 - N(P)^{-s})^{-1}
当 Re(s) > 1 时绝对收敛。这个级数与理想唯一分解定理是一对互证的关系:唯一分解推出欧拉积,欧拉积推出算数基本定理的推广。理解这里的级数绝对收敛是后面做数值实验的前提。实际计算时,不要把 N(P) 当成 p,因为 P 的范是 p^f,f 是惯性度。欧拉积中每一项是 p^{fs} 的形式,所以普通素数 p 在 zeta 函数里的贡献会被多个素理想因子叠加。
我读这一节时做过一个简单计算:对 Q(√-5),试写 ζ_K(s) 的前几项。整数环的范数可以从理想范数计算。比如主理想 (1+√-5) 的范是 6,这个理想对级数的贡献是 6^{-s}。如果直接用元素范数代替理想范数,会漏掉非主理想。这也是常见的初学者失误。
4.2 类数公式:从解析量到代数量的桥梁
类数公式是这本书最漂亮的结果之一。它把 ζ_K(s) 在 s=1 的留数写成代数不变量:
res_{s=1} ζ_K(s) = [ 2^{r1} (2π)^{r2} h_K Reg_K ] / [ w_K sqrt(|d_K|) ]
其中 h_K 是类数,Reg_K 是单位格 regulator,w_K 是单位根个数,d_K 是判别式,r1 和 r2 是嵌入参数。这个公式初看只是“留数”,但它实际上把三个很难手算的量(类数、单位格、判别式)放在了一个解析量下。对纯三次域来说,Reg 来自基本单位对数的绝对值;对虚二次域,Reg = 1,因为单位群是有限群。
实际应用中,类数公式经常用来“验算”。比如先用代数方法算出 h_K,再用 zeta 函数的数值逼近算留数,两者不一致就说明某一步有错误。这个交叉验证策略非常实用。我在算 Q(√-10) 的 h=2 时,用这个办法发现原来是单位根个数 w_K=2 没有除,导致留数差了两倍。
4.3 用数值实验观察 zeta 函数的极点与类数关联:脚本示例
完全实干的做法是用数值定义的有限和逼近 ζ_K。只是收敛太慢,建议用解析类数公式的反向计算:先算出所有代数量,再反推留数。下面是一个用 Sage 算纯三次域类数公式的示例:
K.<a> = NumberField(x^3 - 2) r1, r2 = K.signature() d = K.discriminant() h = K.class_number() U = K.unit_group() units = U.fundamental_units() # regulator: 所有生成元的 log 嵌入构成的格体积 # 对秩 1,reg = abs(log(embedding of fundamental unit)) emb = K.embeddings(CC) unit = units[0] if units else K(1) val = [e(unit) for e in emb] log_abs = sorted([abs(x).log() for x in val if abs(abs(x)-1)>1e-6]) Reg = abs(log_abs[0]) if log_abs else 1 w = K.number_of_roots_of_unity() # 计算留数 res = (2**r1) * ((2*pi)**r2) * h * Reg / (w * sqrt(abs(d))) print("r1,r2:", r1, r2, " h:", h, " Reg:", Reg, " w:", w) print("留数:", res.n())逻辑说明:这段代码计算 Dedekind zeta 在 s=1 的留数。为了让公式自洽,我们绕过了直接求值 zeta,而是从代数量反推。r1、r2、h、Reg、w、d 都是已有库函数或直接计算。注意 Reg 对秩为 1 时就是 log|embedding|,代码中需要找到非平凡嵌入的值并取绝对值对数。参数说明:如果 units 为空(即秩为 0),Reg 应取 1;本例因为有非平凡单位,所以走第一个分支。实际输出约等于 0.615,这个值可以通过直接积分数值逼近验证。
做完这个实验,就能直观看到“解析量”不过是“代数量的包装”。这本书最容易被低估的一章其实是这里的解析工具,因为后面的类域论中,很多局部性质都是通过 zeta 因子来描述的。
5. 常见问题与避坑:读这份 PDF 时最容易翻车的五个地方
这本教材的每个章节都有几个经典坑。我把自己和身边同学踩过的记录整理如下,按“现象→原因→解决”的格式写,方便你排查。
5.1 翻车点一:把素理想分解与元素分解混为一谈
现象:在 Z[√-5] 里手算 6 的分解时,得到两组不可约元素分解,怀疑教材错了。
原因:不可约元素分解不是唯一的,但理想分解是唯一的。问题是你把 (2) 和 (3) 当成了素理想,其实它们都能进一步分解成若干素理想。
解决:凡是想套用“唯一分解”,立刻切换到理想视角。先求出每个生成元对应的主理想,再对主理想做素理想分解。常见做法是检查理想是否极大,直接看商环是否为域。记住:Z[√-5] 中 (2) = (2, 1+√-5)²,所以它本身不是素理想。
5.2 翻车点二:类群结构写错符号
现象:用 Sage 算 Q(√-5) 的类群得到C2,但自己在纸上算的类是 [P1], [P2] 两个,认为类群是 C2 × C2。
原因:P1 和 P2 可能互为逆元或同类。在手算时,你选取的两个素理想可能都代表同一个非平凡类。比如在 Q(√-5) 中,(2, 1+√-5) 与 (3, 1+√-5) 实际上都对应同一个类,而不是两个独立类。
解决:检查素理想之间是否相差一个主理想。做法是计算两个理想的商式,看它是否为主分式理想。Sage 中可以直接用P1/P2 in K.principal_ideal_group()判断,或者直接看类群生成元的“关系”。不要只看范数不同就断定是不同的类。
5.3 翻车点三:计算判别式时遗漏平方因子
现象:手动算 Q(∛2) 的判别式,得到 -108,但代入类数公式后留数与预期差了一个因子。
原因:极小多项式 x³-2 的判别式是 -27*4 = -108,但这只是多项式判别式,不一定是整数环的判别式。当幂基 Z[α] 不是整基时,需要去掉幂基的指数。Q(∛2) 的整数环判别式确实是 -108,但一些二阶域也容易踩这个坑,例如 x²+5 的判别式是 -20,而整数环的判别式是 -20,但 x²+3 对应整数环判别式是 -12,不是多项式判别式 -36。
解决:始终用库函数K.discriminant()计算数域判别式,不要用极小多项式的判别式替代。手算时必须检查指数 [O_K : Z[α]] 是否等于 1。
5.4 翻车点四:单位定理的 r2 取错
现象:直接套公式时,把二次域的两个复嵌入当成 r2=2,导致单位秩 = 0+2-1=1,以为虚二次域有无限多个单位。
原因:r2 表示“复共轭对的个数”,不是单复嵌入数量。Q(√-5) 有 2 个单复嵌入,但它们成对出现,所以 r2=1。
解决:先熟悉公式 K.degree = r1 + 2*r2。所以 degree 为 2 的虚二次域 r1=0, r2=1。写代码时用K.signature()返回的元组直接赋值,避免手工数。同理,实三次域 r1=3,r2=0,单位秩为 2,注意不是 3-1=2 吗?一样,但别把 r2 也算进去。
5.5 翻车点五:用普通 zeta 函数的数值级数直接逼近 Dedekind zeta
现象:想验证类数公式,直接用前 1000 个整理想的和来逼近 ζ_K(1),发现级数发散或震动很大。
原因:Dedekind zeta 在 s=1 有简单极点,直接求值会发散。类数公式用的是留数,不是函数值。你要做的是乘上 (s-1) 再取极限,或者用截断级数估计留数,而不是直接带 s=1。
解决:如果要数值验证,用gp或 Sage 内置的K.zeta_function(),或者对级数做 Abel 求和。更简单的方案是从类数公式反推,先算代数量再乘除,不碰发散级数。只有当你做解析数论研究时,才需要精细处理部分和。
6. 验证学习效果的一个硬功夫:用 Sage 复算书内关键定理
读这本教材到最后,有一个很有效的验证方式:选一个具体数域,把书里关于它的全部核心结论从头到尾用代码复现一遍。以 Q(√-5) 为例,从整数环、理想分解、类群结构、单位群、zeta 留数五个层面逐一核对。下面这个综合脚本就是我现在每学一个新域时的必走流程:
K.<a> = NumberField(x^2 + 5) print("签名:", K.signature()) print("判别式:", K.discriminant()) print("类群:", K.class_group()) print("单位群:", K.unit_group()) print("2 的素理想分解:", factor(K.ideal(2))) print("3 的素理想分解:", factor(K.ideal(3))) print("1+sqrt(-5) 的理想分解:", factor(K.ideal(1+a)))我一般会额外检查所有素理想是否非主:对每个分解中的素理想 P,计算P.is_principal()。如果某个 P 非主,再手动构造它和主理想的商,确认它对应类群中的哪个元素。这个动作把理想分解、类群、单位群三个知识点串了起来。
从那以后,每学一个代数数论的新概念,我都会强制自己先跑一遍这个“五步检查”,再用纸笔补一两个手算步骤。这个方法救了我很多次,尤其是那些复杂的域。也希望这个验证思路能帮你在读这份 PDF 时少一点迷茫,多一点把握。
本文还有配套的精品资源,点击获取