С помощью 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 таким же сложным способом ...
У кого-нибудь есть такие мысли о том, как лучше всего этого добиться?