You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.4 KiB
58 lines
1.4 KiB
module Fractions exposing (..)
|
|
|
|
import Arithmetic exposing (gcd)
|
|
|
|
type alias Frac = { num : Int, den : Int }
|
|
|
|
simplifier a =
|
|
let
|
|
pgcd = gcd a.num a.den
|
|
sgnDuDen =
|
|
if a.den < 0 then -1 else 1
|
|
in
|
|
Frac (sgnDuDen*a.num // pgcd) (sgnDuDen*a.den // pgcd)
|
|
--{ a | num = a.num // pgcd, den = a.den // pgcd }
|
|
|
|
estEntier a = .den (simplifier a) == 1
|
|
|
|
add a b =
|
|
simplifier <| Frac (a.num*b.den + a.den*b.num) (a.den*b.den)
|
|
|
|
neg a = simplifier <| Frac (-a.num) a.den
|
|
|
|
sub a b = simplifier <| add a (neg b)
|
|
|
|
mul a b = simplifier <| Frac (a.num*b.num) (a.den*b.den)
|
|
|
|
inv a = simplifier <| Frac a.den a.num
|
|
|
|
div a b = simplifier <| mul a (inv b)
|
|
|
|
exp : Frac -> Frac -> Maybe Frac
|
|
exp a b =
|
|
let
|
|
aa = simplifier a
|
|
bb = simplifier b
|
|
sgnDeA =
|
|
if aa.num < 0 then -1 else 1
|
|
sgnDeB =
|
|
if bb.num < 0 then -1 else 1
|
|
in
|
|
if bb.den == 1 && bb.num < 0 then
|
|
Just <| Frac ((sgnDeA*aa.den)^(sgnDeB*bb.num)) ((sgnDeA*aa.num)^(sgnDeB*bb.num))
|
|
else if bb.den == 1 then
|
|
Just <| Frac (aa.num^bb.num) (aa.den^bb.num)
|
|
else
|
|
Nothing
|
|
|
|
-- À utiliser sur une fraction simplifier !
|
|
teX a
|
|
= case a.den of
|
|
1 -> String.fromInt a.num
|
|
_ ->
|
|
if a.num < 0 then
|
|
"-\\frac{" ++ String.fromInt (-a.num) ++ "}{" ++ String.fromInt a.den ++ "}"
|
|
else
|
|
"\\frac{" ++ String.fromInt a.num ++ "}{" ++ String.fromInt a.den ++ "}"
|
|
|
|
raw a = "(" ++ String.fromInt a.num ++ "/" ++ String.fromInt a.den ++ ")" |