フロートなしのアイゼンシュタイン数の表現


9

具体的には、2次フィールドを使用する必要があるプロジェクトがあります。具体的にはの形式でます。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

これらの演算をエンコードする自然な行列ベースの方法はありますか?行列でを書く方法に似ていますか?C2×2

(abba)

たぶん、上記で概説した3つの操作を使用して、操作をトリプルとしてハードコーディングするだけかもしれません。何か案は?

回答:


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

浮動小数点エラーを作ることができて、私は、あなたがすべてのための正確な合理的な算術演算をしたい推測しているではないで場合でも、あります。そのためには、SymPyパッケージを確認することをお勧めします。それらの有理データ型を直接使用しない場合、それはあなた自身の手巻きバージョンのインスピレーションとして役立ちます。次に、選択した任意の有理数型の上に2次フィールド型を構築できます。1/zQ[3]z

フィールドの要素をどのように表現しても、「マジックメソッド」を使用してPythonで演算子をオーバーロードできます。Pythonで独自の数値型を作成する方法に関するこのSOの投稿もご覧ください。

算術演算はそれほど複雑ではないので、2次フィールドの要素の表現を有理数の2 x 2行列または有理数のペアとしてコーディングする作業はそれほど多くないと思います。ただし、2番目の方法の方が高速になると思います。


1
numpy-accelerated matrix opsの実際のパフォーマンスをユーザー定義のデータ型のパフォーマンスと比較することは興味深いかもしれません。勝者がどうなるかわからない。
ccorn 2014

はい、そうです。numpyには、C側に多くのCython +手動でコーディングされた最適化があり、処理を高速化しています。同じ効果を得るためには、その一部を自分でやり直す必要があります。それにもかかわらず、機能性が最初に来るべきであり、後に人は速度について心配することができます。
Daniel Shapero 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.