{-# LANGUAGE ConstraintKinds, DataKinds, ExplicitNamespaces            #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, GADTs                #-}
{-# LANGUAGE GeneralizedNewtypeDeriving, LiberalTypeSynonyms           #-}
{-# LANGUAGE MultiParamTypeClasses, NoMonomorphismRestriction          #-}
{-# LANGUAGE PatternGuards, PolyKinds, RankNTypes, ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving, TemplateHaskell, TypeFamilies         #-}
{-# LANGUAGE TypeOperators, TypeSynonymInstances, UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-type-defaults #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Algebra.Ring.Polynomial
    ( module Algebra.Ring.Polynomial.Monomial,
      module Algebra.Ring.Polynomial.Class,
      Polynomial,
      transformMonomial,
      castPolynomial, changeOrder, changeOrderProxy,
      scastPolynomial, OrderedPolynomial(..),
      allVars, substVar, homogenize, unhomogenize,
      normalize, varX, getTerms, shiftR, orderedBy,
      mapCoeff, reversal, padeApprox,
      eval, evalUnivariate,
      substUnivariate, minpolRecurrent,
      IsOrder(..), PadPolyL(..), padLeftPoly
    )  where
import Algebra.Algorithms.Groebner
import Algebra.Internal
import Algebra.Ring.Polynomial.Class
import Algebra.Ring.Polynomial.Internal
import Algebra.Ring.Polynomial.Monomial

import AlgebraicPrelude


instance {-# OVERLAPPABLE #-}
         (KnownNat n, Eq r, DecidableUnits r, DecidableZero r, Field r,
          IsMonomialOrder n ord, ZeroProductSemiring r)
      => UFD (OrderedPolynomial r ord n)

instance {-# OVERLAPPABLE #-}
         (KnownNat n, Eq r, DecidableUnits r, DecidableZero r, Field r,
          IsMonomialOrder n ord, ZeroProductSemiring r)
      => GCDDomain (OrderedPolynomial r ord n) where
  gcd = gcdPolynomial
  lcm = lcmPolynomial