我正在 SAGE 中编写一个程序,除其他外,它必须计算“大”数字字段的最大阶数。我正在处理的数字字段不仅具有相当大的度数(到目前为止我必须处理的数字字段约为 40),而且判别式也非常大。
不幸的是,这使得无法使用 SAGE 用于计算最大订单的标准内置函数 - 该命令K.maximal_order()
太费时了。让我具体说明以下代码中使用的符号:
Qa12 指定一个带有整数环的数字字段(即最大顺序)OO
。需要计算的是OOK
的扩展K
的最大阶数Qa12
。现在,在 MAGMA 中,这可以使用以下代码完成:
subOrderK:=ext<OO | y^2-kappa12>;
subOrderK:=AbsoluteOrder(subOrderK);
D:=Discriminant(subOrderK);
for p in PrimeDivisors(D) do
subOrderK:=pMaximalOrder(subOrderK,p);
end for;
OOK:=subOrderK;
这在相当短的时间内运行,即通常不到一分钟。我没有找到直接翻译它的方法,因为 SAGE 中的前两行代码似乎没有类似的东西。很可能是我遗漏了一些东西,所以如果你认为你确实知道翻译前两行的方法,那么请告诉我。如果计算字段的扩展名,则代码应如下所示:
K.<c> = Qa12.extension(y^2-kappa12)
K.<alpha> = K.absolute_field()
subOrderK = K.order(alpha)
D = subOrderK.discriminant()
for p in factor(D):
subOrderK = K.maximal_order(p[0])
OOK = subOrderK
现在,这段代码有两个问题,第一个是所述数字字段的判别式很大,分解它是不可能的。换句话说,我还没有测试过for循环。你有什么方法可以避免处理这些巨大的判别器吗?for 循环是我不安全的第二个地方:因为(再次 - 据我所知)没有直接模拟pMaximalOrder(subOrderK,p)
上面的 MAGMA 命令,我希望 SAGE 会“记住”之前的subOrderK
值for 循环,因此重新创建了 MAGMA 命令的效果。真的是这样吗?如果注意,您是否找到避免此问题的方法?
注意:
几天前我在 ask.sagemath 上发布了基本相同的问题,但到目前为止无济于事。