hammarの助けを借りて、コンパイルするHaskellビットのテンプレートを作成しました
$(zModP 5)
に
newtype Z5 = Z5 Int
instance Additive.C Z5 where
(Z5 x) + (Z5 y) = Z5 $ (x + y) `mod` 5
...
私は今、この方法では解決できないと思う問題に直面しています。
多項式についての注目すべき事実は、それらがいくつかの素数を法として既約である場合、それらは有理数で既約であるということですp
。私はすでに、ブルートフォースが与えられた(有限)体上で多項式を因数分解しようとする方法を持っています。
この関数を複数のフィールドで実行してみたいと思います。これが私が欲しいものの一種です:
isIrreducible :: (FiniteField.C a) => Poly.T a -> Bool
isIrreducible p = ...
intPolyIrreducible :: Poly.T Int -> Bool
intPolyIrreducible p = isIrreducible (p :: Poly.T Z2) ||
isIrreducible (p :: Poly.T Z3) ||
isIrreducible (p :: Poly.T Z5) ||
...
基本的に、「除算」の多数の定義に対して素因数分解アルゴリズムを実行してみたいと思います。
これはTHでも可能だと思いますが、永遠にかかるようです。算術演算をパラメータとして渡す方が簡単かどうか疑問に思っていますisIrreducible
か?
あるいは、これはNewtypeモジュールが役立つ可能性があるように思われますが、同じように難しい方法でTHを使用しないとどのように機能するかを考えることはできません...
誰かがこれを達成するための最善の方法について何か考えがありますか?