Полиномиальная факторизация в Haskell

С помощью 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 таким же сложным способом ...

У кого-нибудь есть такие мысли о том, как лучше всего этого добиться?

8
задан Community 23 May 2017 в 11:55
поделиться