{-# LANGUAGE BangPatterns, NoImplicitPrelude #-}

module UnitFractionsDecomposition2 where

import GHC.Base
import GHC.Num ((+),(-),(*),abs)
import GHC.List (null)
import Data.List (minimumBy)
import GHC.Real (infinity,fromRational,round,fromIntegral,(/),truncate)

setOfSolutions :: Double -> Double -> [(Double, Double)]
setOfSolutions :: Double -> Double -> [(Double, Double)]
setOfSolutions Double
k Double
n 
 | Double
0 forall a. Ord a => a -> a -> Bool
< Double
k Bool -> Bool -> Bool
&& Double
k forall a. Ord a => a -> a -> Bool
< Double
1 Bool -> Bool -> Bool
&& Double
n forall a. Ord a => a -> a -> Bool
> Double -> Double
minProportion Double
k = [(Double
x, Double
xforall a. Fractional a => a -> a -> a
/(Double
kforall a. Num a => a -> a -> a
*Double
x forall a. Num a => a -> a -> a
- Double
1)) | Double
x <- [forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
truncate (Double
1.0 forall a. Fractional a => a -> a -> a
/ Double
k)) forall a. Num a => a -> a -> a
+ Double
1.0..forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
truncate (Double
2.0 forall a. Fractional a => a -> a -> a
/ Double
k))]]
 | Bool
otherwise = []
{-# INLINE setOfSolutions #-}

suitable2 :: Double -> Double -> (Double,Double)
suitable2 :: Double -> Double -> (Double, Double)
suitable2 Double
k Double
n
 | forall a. [a] -> Bool
null [(Double, Double)]
xs = (forall a. HasCallStack => a
undefined, forall a. HasCallStack => a
undefined)
 | Bool
otherwise = forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
minimumBy (\(Double
_, Double
y1) (Double
_, Double
y2) -> forall a. Ord a => a -> a -> Ordering
compare (forall a. Num a => a -> a
abs (Double
y1 forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
round Double
y1))) (forall a. Num a => a -> a
abs (Double
y2 forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
round Double
y2)))) [(Double, Double)]
xs
      where !xs :: [(Double, Double)]
xs = Double -> Double -> [(Double, Double)]
setOfSolutions Double
k Double
n
{-# INLINE suitable2 #-}

suitable21 :: Double -> Double -> ([Double],Double)
suitable21 :: Double -> Double -> ([Double], Double)
suitable21 Double
k Double
n 
 | forall a. [a] -> Bool
null [(Double, Double)]
xs = ([],forall a. HasCallStack => a
undefined)
 | Bool
otherwise = let (!Double
a,!Double
b) = forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
minimumBy (\(Double
_, Double
y1) (Double
_, Double
y2) -> forall a. Ord a => a -> a -> Ordering
compare (forall a. Num a => a -> a
abs (Double
y1 forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
round Double
y1))) (forall a. Num a => a -> a
abs (Double
y2 forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
round Double
y2)))) [(Double, Double)]
xs
    in ([Double
a,Double
b],Double
k forall a. Num a => a -> a -> a
- (Double
1.0forall a. Fractional a => a -> a -> a
/Double
a forall a. Num a => a -> a -> a
+ Double
1.0forall a. Fractional a => a -> a -> a
/forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
round Double
b)))
      where !xs :: [(Double, Double)]
xs = Double -> Double -> [(Double, Double)]
setOfSolutions Double
k Double
n
{-# INLINE suitable21 #-}

minProportion :: Double -> Double
minProportion :: Double -> Double
minProportion Double
k 
 | Double
0 forall a. Ord a => a -> a -> Bool
< Double
k Bool -> Bool -> Bool
&& Double
k forall a. Ord a => a -> a -> Bool
< Double
1 = Double
1.0 forall a. Fractional a => a -> a -> a
/ (forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
truncate (Double
2.0forall a. Fractional a => a -> a -> a
/Double
k)) forall a. Num a => a -> a -> a
* Double
k forall a. Num a => a -> a -> a
- Double
1.0)
 | Bool
otherwise = forall a. Fractional a => Rational -> a
fromRational Rational
infinity
{-# INLINE minProportion #-}