我一直在使用 lmfdb.org 数据库来查找数字字段的积分基。现在,我想利用 PARI/GP 来乘代数整数。但是,我遇到了一个问题。PARI/GP 在其计算中使用积分基"nf.zk",这显然并不总是与"nfbasis(f)"相同,后者是 lmfdb.org 提供的积分基。
例如,我们有来自 PARI/GP 的以下代码:
? f = x^3 - x^2 + 2*x + 8
nf = nfinit(f)
nf.zk
%1 = [1, x, 1/2*x^2 - 1/2*x + 1]
? nfbasis(f)
%2 = [1, x, 1/2*x^2 - 1/2*x]
现在,我的问题是:
- 为什么 nf.zk 和 nfbasis(f) 不同?
- 为什么 PARI/GP 使用 nf.zk 而不是 nfbasis(f)?
- 最后,我可以告诉 PARI/GP 使用 nfbasis(f) 而不是 nf.zk 吗?
-
当我们不厌其烦地用
nfinit
初始化一个nf
结构时,我们执行预计算以加快以后的工作。在这里,nfinit
首先通过调用nfbasis
来计算整数基,它返回(规范)HNF 基,然后 LLL 相对于 T2 范数减少它。LLL还原基通常与HNF基不同,但它通常具有较小的元素。 -
这种LLL减少可能很昂贵(特别是当次数很大时),但它确保时间复杂性是根据字段判别而不是输入多项式的大小来限定的。 我相信所有在 lmfdb 中定义数字字段的多项式都通过
polredabs
运行,这确保了它们的系数很小(就字段判别而言),但 HNF 整数基可能仍然比 LLL 大得多。此外,如果代数整数的 T2 范数较小,则其以 LLL 约简基表示的表达式保证具有较小的系数,而在 HNF 基础上它可以具有更大的系数。 -
在 pari-2.14(尚未发布,但可通过
git
或 PARI/GP 网站上的夜间快照获得)中,您可以使用 nfinit(, 4),它删除了 LLL 缩减步骤。这加快了初始化速度,但通常会减慢涉及生成的nf
的每个操作。
? f = x^3 - x^2 + 2*x + 8
? nfinit(f,4).zk
%2 = [1, x, 1/2*x^2 - 1/2*x]