parent
d5316f40e2
commit
9afce0fef2
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,130 +1,206 @@ |
|||||||
module Fraction exposing |
module Fraction exposing |
||||||
( Fraction |
( Erreur |
||||||
|
, Fraction |
||||||
, Resultat |
, Resultat |
||||||
, Erreur |
, add |
||||||
, frac |
|
||||||
, num |
|
||||||
, den |
, den |
||||||
|
, div |
||||||
, estEntier |
, estEntier |
||||||
, opp |
, exp |
||||||
, add |
, frac |
||||||
|
, inv |
||||||
|
, mul |
||||||
, neg |
, neg |
||||||
|
, num |
||||||
|
, opp |
||||||
|
, raw |
||||||
, sub |
, sub |
||||||
, mul |
|
||||||
, inv |
|
||||||
, div |
|
||||||
, exp |
|
||||||
, teX |
, teX |
||||||
, raw |
|
||||||
) |
) |
||||||
|
|
||||||
import Arithmetic exposing (gcd) |
import Arithmetic exposing (gcd) |
||||||
|
|
||||||
|
|
||||||
|
type alias Fraction = |
||||||
|
{ num : Int, den : Int } |
||||||
|
|
||||||
|
|
||||||
|
type alias Resultat = |
||||||
|
Result Erreur Fraction |
||||||
|
|
||||||
type alias Fraction = { num : Int, den : Int } |
|
||||||
|
|
||||||
type alias Resultat = Result Erreur Fraction |
type alias Erreur = |
||||||
type alias Erreur = String |
String |
||||||
|
|
||||||
|
|
||||||
frac : Int -> Int -> Resultat |
frac : Int -> Int -> Resultat |
||||||
frac a b = |
frac a b = |
||||||
let |
let |
||||||
min = 1 - 2^31 |
min = |
||||||
max = 2^31 - 1 |
1 - 2 ^ 31 |
||||||
|
|
||||||
|
max = |
||||||
|
2 ^ 31 - 1 |
||||||
in |
in |
||||||
case b of |
case b of |
||||||
0 -> Err "Division par zéro." |
0 -> |
||||||
|
Err "Division par zéro." |
||||||
|
|
||||||
_ -> |
_ -> |
||||||
if a > max || b > max || a < min || b < min then |
if a > max || b > max || a < min || b < min then |
||||||
Err "Certains calculs font intervenir des valeurs trop grandes pour être prises en charge." |
Err "Certains calculs font intervenir des valeurs trop grandes pour être prises en charge." |
||||||
|
|
||||||
else |
else |
||||||
Ok <| simplifier <| Fraction a b |
Ok <| simplifier <| Fraction a b |
||||||
|
|
||||||
|
|
||||||
simplifier : Fraction -> Fraction |
simplifier : Fraction -> Fraction |
||||||
simplifier a = |
simplifier a = |
||||||
let |
let |
||||||
pgcd = gcd a.num a.den |
pgcd = |
||||||
|
gcd a.num a.den |
||||||
|
|
||||||
sgnDuDen = |
sgnDuDen = |
||||||
if a.den < 0 then -1 else 1 |
if a.den < 0 then |
||||||
|
-1 |
||||||
|
|
||||||
|
else |
||||||
|
1 |
||||||
in |
in |
||||||
{ a |
{ a |
||||||
| num = sgnDuDen*(a.num // pgcd) |
| num = sgnDuDen * (a.num // pgcd) |
||||||
, den = sgnDuDen*(a.den // pgcd) |
, den = sgnDuDen * (a.den // pgcd) |
||||||
} |
} |
||||||
|
|
||||||
num a = a.num |
|
||||||
|
|
||||||
den a = a.den |
num a = |
||||||
|
a.num |
||||||
|
|
||||||
|
|
||||||
|
den a = |
||||||
|
a.den |
||||||
|
|
||||||
|
|
||||||
|
estEntier a = |
||||||
|
a.den == 1 |
||||||
|
|
||||||
estEntier a = a.den == 1 |
|
||||||
|
|
||||||
opp : (Fraction -> Fraction -> Resultat) -> Resultat -> Resultat -> Resultat |
opp : (Fraction -> Fraction -> Resultat) -> Resultat -> Resultat -> Resultat |
||||||
opp operation resultat1 resultat2 = |
opp operation resultat1 resultat2 = |
||||||
case (resultat1, resultat2) of |
case ( resultat1, resultat2 ) of |
||||||
(Ok fraction1, Ok fraction2) -> operation fraction1 fraction2 |
( Ok fraction1, Ok fraction2 ) -> |
||||||
(Err erreur, _) -> Err erreur |
operation fraction1 fraction2 |
||||||
(_, Err erreur) -> Err erreur |
|
||||||
|
( Err erreur, _ ) -> |
||||||
|
Err erreur |
||||||
|
|
||||||
|
( _, Err erreur ) -> |
||||||
|
Err erreur |
||||||
|
|
||||||
|
|
||||||
add : Fraction -> Fraction -> Resultat |
add : Fraction -> Fraction -> Resultat |
||||||
add a b = |
add a b = |
||||||
let |
let |
||||||
pgcd = gcd a.den b.den |
pgcd = |
||||||
aDenBis = a.den // pgcd |
gcd a.den b.den |
||||||
bDenBis = b.den // pgcd |
|
||||||
|
aDenBis = |
||||||
|
a.den // pgcd |
||||||
|
|
||||||
|
bDenBis = |
||||||
|
b.den // pgcd |
||||||
in |
in |
||||||
frac (a.num*bDenBis + b.num*aDenBis) (a.den*bDenBis) |
frac (a.num * bDenBis + b.num * aDenBis) (a.den * bDenBis) |
||||||
|
|
||||||
|
|
||||||
neg : Fraction -> Fraction |
neg : Fraction -> Fraction |
||||||
neg a = Fraction (-a.num) a.den |
neg a = |
||||||
|
Fraction -a.num a.den |
||||||
|
|
||||||
|
|
||||||
sub : Fraction -> Fraction -> Resultat |
sub : Fraction -> Fraction -> Resultat |
||||||
sub a b = add a (neg b) |
sub a b = |
||||||
|
add a (neg b) |
||||||
|
|
||||||
|
|
||||||
mul : Fraction -> Fraction -> Resultat |
mul : Fraction -> Fraction -> Resultat |
||||||
mul a b = |
mul a b = |
||||||
let |
let |
||||||
pgcd = gcd a.num b.den |
pgcd = |
||||||
pgcdBis = gcd b.num a.den |
gcd a.num b.den |
||||||
aNum = a.num // pgcd |
|
||||||
aDen = a.den // pgcdBis |
pgcdBis = |
||||||
bNum = b.num // pgcdBis |
gcd b.num a.den |
||||||
bDen = b.den // pgcd |
|
||||||
|
aNum = |
||||||
|
a.num // pgcd |
||||||
|
|
||||||
|
aDen = |
||||||
|
a.den // pgcdBis |
||||||
|
|
||||||
|
bNum = |
||||||
|
b.num // pgcdBis |
||||||
|
|
||||||
|
bDen = |
||||||
|
b.den // pgcd |
||||||
in |
in |
||||||
frac (aNum*bNum) (aDen*bDen) |
frac (aNum * bNum) (aDen * bDen) |
||||||
|
|
||||||
|
|
||||||
inv : Fraction -> Resultat |
inv : Fraction -> Resultat |
||||||
inv a = |
inv a = |
||||||
case a.num of |
case a.num of |
||||||
0 -> Err "Division par zéro" |
0 -> |
||||||
_ -> Ok <| Fraction a.den a.num |
Err "Division par zéro" |
||||||
|
|
||||||
|
_ -> |
||||||
|
Ok <| Fraction a.den a.num |
||||||
|
|
||||||
|
|
||||||
div : Fraction -> Fraction -> Resultat |
div : Fraction -> Fraction -> Resultat |
||||||
div a b = Result.andThen (mul a) <| inv b |
div a b = |
||||||
|
Result.andThen (mul a) <| inv b |
||||||
|
|
||||||
|
|
||||||
exp : Fraction -> Fraction -> Resultat |
exp : Fraction -> Fraction -> Resultat |
||||||
exp a b = |
exp a b = |
||||||
let |
let |
||||||
sgnDeA = |
sgnDeA = |
||||||
if a.num < 0 then -1 else 1 |
if a.num < 0 then |
||||||
|
-1 |
||||||
|
|
||||||
|
else |
||||||
|
1 |
||||||
|
|
||||||
sgnDeB = |
sgnDeB = |
||||||
if b.num < 0 then -1 else 1 |
if b.num < 0 then |
||||||
|
-1 |
||||||
|
|
||||||
|
else |
||||||
|
1 |
||||||
in |
in |
||||||
if b.den == 1 && b.num < 0 then |
if b.den == 1 && b.num < 0 then |
||||||
frac ((sgnDeA*a.den)^(sgnDeB*b.num)) ((sgnDeA*a.num)^(sgnDeB*b.num)) |
frac ((sgnDeA * a.den) ^ (sgnDeB * b.num)) ((sgnDeA * a.num) ^ (sgnDeB * b.num)) |
||||||
|
|
||||||
else if b.den == 1 then |
else if b.den == 1 then |
||||||
frac (a.num^b.num) (a.den^b.num) |
frac (a.num ^ b.num) (a.den ^ b.num) |
||||||
|
|
||||||
else |
else |
||||||
Err "Extraction de racine impossible" |
Err "Extraction de racine impossible" |
||||||
|
|
||||||
|
|
||||||
teX a |
teX a = |
||||||
= case a.den of |
case a.den of |
||||||
1 -> String.fromInt a.num |
1 -> |
||||||
|
String.fromInt a.num |
||||||
|
|
||||||
_ -> |
_ -> |
||||||
if a.num < 0 then |
if a.num < 0 then |
||||||
"-\\frac{" ++ String.fromInt (-a.num) ++ "}{" ++ String.fromInt a.den ++ "}" |
"-\\frac{" ++ String.fromInt -a.num ++ "}{" ++ String.fromInt a.den ++ "}" |
||||||
|
|
||||||
else |
else |
||||||
"\\frac{" ++ String.fromInt a.num ++ "}{" ++ String.fromInt a.den ++ "}" |
"\\frac{" ++ String.fromInt a.num ++ "}{" ++ String.fromInt a.den ++ "}" |
||||||
|
|
||||||
raw a = "(" ++ String.fromInt a.num ++ "/" ++ String.fromInt a.den ++ ")" |
|
||||||
|
raw a = |
||||||
|
"(" ++ String.fromInt a.num ++ "/" ++ String.fromInt a.den ++ ")" |
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue