+{-# LANGUAGE RebindableSyntax #-}
+
-- | The Roots.Fast module contains faster implementations of the
-- 'Roots.Simple' algorithms. Generally, we will pass precomputed
-- values to the next iteration of a function rather than passing
import Normed
+import NumericPrelude hiding (abs)
+import qualified Algebra.Absolute as Absolute
+import qualified Algebra.Additive as Additive
+import qualified Algebra.Algebraic as Algebraic
+import qualified Algebra.RealRing as RealRing
+import qualified Algebra.RealField as RealField
-has_root :: (Fractional a, Ord a, Ord b, Num b)
+has_root :: (RealField.C a,
+ RealRing.C b,
+ Absolute.C b)
=> (a -> b) -- ^ The function @f@
-> a -- ^ The \"left\" endpoint, @a@
-> a -- ^ The \"right\" endpoint, @b@
c = (a + b)/2
-
-bisect :: (Fractional a, Ord a, Num b, Ord b)
+bisect :: (RealField.C a,
+ RealRing.C b,
+ Absolute.C b)
=> (a -> b) -- ^ The function @f@ whose root we seek
-> a -- ^ The \"left\" endpoint of the interval, @a@
-> a -- ^ The \"right\" endpoint of the interval, @b@
+
-- | Iterate the function @f@ with the initial guess @x0@ in hopes of
-- finding a fixed point.
fixed_point_iterations :: (a -> a) -- ^ The function @f@ to iterate.
--
-- We also return the number of iterations required.
--
-fixed_point_with_iterations :: (Normed a, RealFrac b)
+fixed_point_with_iterations :: (Normed a,
+ Additive.C a,
+ RealField.C b,
+ Algebraic.C b)
=> (a -> a) -- ^ The function @f@ to iterate.
-> b -- ^ The tolerance, @epsilon@.
-> a -- ^ The initial value @x0@.
-- "safe" since the list is infinite. We'll succeed or loop
-- forever.
Just winning_pair = find (\(_, diff) -> diff < epsilon) pairs
-