表示没有浮点数的爱森斯坦数


9

我有一个项目,需要使用二次字段, 具体是表格的数字a+b3a,bQ

例如,这是爱森斯坦整数中的质数:

我不想用鼠尾草。 我想编写自己的数据类型来合并numpy。PARI很有用-但它与Python不兼容。

  • 这些对象的加法非常清楚
    (a1+b13)+(a2+b23)=(a1+a2)+(b1+b2)3
  • 乘法稍微复杂一点,但我们也可以对其进行硬编码
    (a1+b13)×(a2+b23)=(a1a23b1b2)+(a1b2+a2b1)3
  • 我的数据类型还需要容纳除法。为简单起见,让我们倒数:
    1a+b3=ab3a2+3b2

是否存在基于自然矩阵的方式来对这些操作进行编码,类似于 C 可以写成 2×2 矩阵?

(abba)

也许我只是用上述三个操作将操作硬编码为三元组。有任何想法吗?

Answers:


10

对于 a+b3 您可以使用表示形式

(a3bba)
加法很明显。对于乘法,您可以验证
(a13b1b1a1)(a23b2b2a2)=(a1a23b1b23(a1b2+b1a2)a1b2+b1a2a1a23b1b2)
保留了表示,因此我们有一个环同态。

取矩阵的行列式给出(平方)范数 a2+3b2,因此,倒数与预期的逆矩阵相对应。

您已经考虑过使用Triples,我假设您使用整数和一个公分母。该方法在矩阵表示中也可能有用。

更新:矩阵表示的通用方法是使用伴随矩阵。例如,假设您要代表a+bω 而是在哪里 ω=exp(2πi3),因此 ω2+ω+1=0。的伴随矩阵ω(0111),并且在所有与其相关的响铃操作中都表现出来 ω本身。当然,1 可以表示为 (1001); 因此,矩阵表示a+bω

(abbab)
您可能要验证这是一个环同构。另外,这很容易看到。对于乘法,现在对应的公式为
(a1+b1ω)(a2+b2ω)=(a1a2b1b2)+(a1b2+b1a2b1b2)ω(a1b1b1a1b1)(a2b2b2a2b2)=(a1a2b1b2(a1b2+b1a2b1b2)a1b2+b1a2b1b2a1a2a1b2b1a2)

2

我猜你想对所有东西都使用精确的有理算术,因为浮点错误可能会使 1/z 不在 Q[3] 即使 z是。为此,您可能需要看一下SymPy软件包。如果您不直接使用其有理数据类型,则可以为您自己编写的版本提供启发。然后,您可以在选择的任何有理数类型的基础上构建二次字段类型。

无论您如何表示字段的元素,都可以使用“魔术方法” 在Python中重载运算符。另请参见关于在Python中创建自己的数字类型的这篇SO文章

我不认为会有更多的工作将二次字段的元素编码为2 x 2有理数矩阵或一对有理数,因为算术运算并不那么复杂。但是,我怀疑第二种方法会更快。


1
numpy加速矩阵运算的实际性能与用户定义的数据类型的实际性能进行比较可能会很有趣。不确定获胜者将是什么。
ccorn 2014年

是的,的确如此,numpy在C端确实有很多Cython +手工编码的优化,可以使事情更快。您必须自己重做一些才能达到相同的效果。尽管如此,功能应该放在首位,后来人们可能会担心速度。
Daniel Shapero 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.