{-# LANGUAGE BangPatterns, NoImplicitPrelude #-} module UnitFractionsDecomposition2 where import GHC.Base import GHC.Num ((+),(-),(*),abs) import GHC.List (null) import Data.List (minimumBy) import GHC.Real (round,fromIntegral,(/),truncate,ceiling) import GHC.Float (sqrt) setOfSolutions :: Double -> [(Double, Double)] setOfSolutions :: Double -> [(Double, Double)] setOfSolutions Double k | Double -> Bool isRangeN Double k = let j :: Integer j = Double -> Integer forall a b. (RealFrac a, Integral b) => a -> b ceiling (Double 1.0 Double -> Double -> Double forall a. Fractional a => a -> a -> a / Double k) p :: Integer p = Double -> Integer forall a b. (RealFrac a, Integral b) => a -> b truncate (Double -> Double -> Double forall a. Ord a => a -> a -> a min (Double 2.0 Double -> Double -> Double forall a. Fractional a => a -> a -> a / Double k) ((Double -> Double forall a. Floating a => a -> a sqrt (Double kDouble -> Double -> Double forall a. Num a => a -> a -> a *Double k Double -> Double -> Double forall a. Num a => a -> a -> a + Double 16) Double -> Double -> Double forall a. Num a => a -> a -> a - Double k Double -> Double -> Double forall a. Num a => a -> a -> a + Double 4)Double -> Double -> Double forall a. Fractional a => a -> a -> a /(Double 4Double -> Double -> Double forall a. Num a => a -> a -> a *Double k))) in if Integer j Integer -> Integer -> Bool forall a. Eq a => a -> a -> Bool == Integer p then [(Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral Integer j, let j1 :: Double j1 = Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral Integer j in Double j1Double -> Double -> Double forall a. Fractional a => a -> a -> a /(Double kDouble -> Double -> Double forall a. Num a => a -> a -> a *Double j1 Double -> Double -> Double forall a. Num a => a -> a -> a - Double 1))] else [(Double x, Double xDouble -> Double -> Double forall a. Fractional a => a -> a -> a /(Double kDouble -> Double -> Double forall a. Num a => a -> a -> a *Double x Double -> Double -> Double forall a. Num a => a -> a -> a - Double 1)) | Double x <- [Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral Integer j..Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral Integer p]] | Bool otherwise = [] {-# INLINE setOfSolutions #-} suitable2 :: Double -> (Double,Double) suitable2 :: Double -> (Double, Double) suitable2 Double k | [(Double, Double)] -> Bool forall a. [a] -> Bool null [(Double, Double)] xs = (Double forall a. HasCallStack => a undefined, Double forall a. HasCallStack => a undefined) | Bool otherwise = ((Double, Double) -> (Double, Double) -> Ordering) -> [(Double, Double)] -> (Double, Double) forall (t :: * -> *) a. Foldable t => (a -> a -> Ordering) -> t a -> a minimumBy (\(Double _, Double y1) (Double _, Double y2) -> Double -> Double -> Ordering forall a. Ord a => a -> a -> Ordering compare (Double -> Double forall a. Num a => a -> a abs (Double y1 Double -> Double -> Double forall a. Num a => a -> a -> a - Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral (Double -> Integer forall a b. (RealFrac a, Integral b) => a -> b round Double y1))) (Double -> Double forall a. Num a => a -> a abs (Double y2 Double -> Double -> Double forall a. Num a => a -> a -> a - Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral (Double -> Integer forall a b. (RealFrac a, Integral b) => a -> b round Double y2)))) [(Double, Double)] xs where !xs :: [(Double, Double)] xs = Double -> [(Double, Double)] setOfSolutions Double k {-# INLINE suitable2 #-} suitable21 :: Double -> ([Double],Double) suitable21 :: Double -> ([Double], Double) suitable21 Double k | [(Double, Double)] -> Bool forall a. [a] -> Bool null [(Double, Double)] xs = ([],Double forall a. HasCallStack => a undefined) | Bool otherwise = let (!Double a,!Double b) = ((Double, Double) -> (Double, Double) -> Ordering) -> [(Double, Double)] -> (Double, Double) forall (t :: * -> *) a. Foldable t => (a -> a -> Ordering) -> t a -> a minimumBy (\(Double _, Double y1) (Double _, Double y2) -> Double -> Double -> Ordering forall a. Ord a => a -> a -> Ordering compare (Double -> Double forall a. Num a => a -> a abs (Double y1 Double -> Double -> Double forall a. Num a => a -> a -> a - Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral (Double -> Integer forall a b. (RealFrac a, Integral b) => a -> b round Double y1))) (Double -> Double forall a. Num a => a -> a abs (Double y2 Double -> Double -> Double forall a. Num a => a -> a -> a - Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral (Double -> Integer forall a b. (RealFrac a, Integral b) => a -> b round Double y2)))) [(Double, Double)] xs in ([Double a,Double b],Double k Double -> Double -> Double forall a. Num a => a -> a -> a - (Double 1.0Double -> Double -> Double forall a. Fractional a => a -> a -> a /Double a Double -> Double -> Double forall a. Num a => a -> a -> a + Double 1.0Double -> Double -> Double forall a. Fractional a => a -> a -> a /Integer -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral (Double -> Integer forall a b. (RealFrac a, Integral b) => a -> b round Double b))) where !xs :: [(Double, Double)] xs = Double -> [(Double, Double)] setOfSolutions Double k {-# INLINE suitable21 #-} isRangeN :: Double -> Bool isRangeN :: Double -> Bool isRangeN Double k = Double k Double -> Double -> Bool forall a. Ord a => a -> a -> Bool >= Double 0.005 Bool -> Bool -> Bool && Double k Double -> Double -> Bool forall a. Ord a => a -> a -> Bool < Double 1 {-# INLINE isRangeN #-}