Menu1 Menu2 Menu3 Menu4 Menu5 Menu6

Nous allons représenter les rationnels sous la forme d'un couple d'entiers : le numérateur et le dénominateur (non nul). Par exemple, 8/9 sera noté 8,9. Le but de l'exercice est définir les opérations sur les rationnels : addition, soustraction, multiplication, division.

1) Mais il faut d'abord définir la simplification d'une fraction : 16/12 doit être noté 4,3. Pour cela, commencez par écrire une fonction pgcd qui donne le PGCD de deux entiers strictement positifs. Je rappelle l'algorithme d'Euclide :
   on suppose a <= b
       si a divise b alors PGCD (a,b) = a
       sinon, PGCD (a,b) = PGCD (a,q) où q est le reste de la division euclidienne de b par a.
La fonction pgcd est récursive, par définition de l'algorithme d'Euclide (vous êtes libre d'en utiliser un autre, mais celui-là me semble quand même plus simple !). Si a > b, on rappelle pgcd en échangeant a et b. Sinon, si a divise b, on rend a. Sinon, on rappelle pgcd en remplaçant b par le reste de b/a :
let rec pgcd a b =
   if a > b then pgcd b a
   else if b mod a = 0 then a
   else pgcd a (b mod a);;

2) Maintenant, vous allez pouvoir écrire la fonction reduit qui prend en argument un rationnel (donc un couple d'entiers) et qui rend sa forme réduite. Par convention, le dénominateur devra toujours être positif. On pourra commencer par écrire une fonction donnant la forme réduite d'un rationnel dont le numérateur et le dénominateur sont positifs.
D'abord une fonction reduit2 qui réduit un rationnel dont le numérateur et le dénominateur sont positifs. Il faut faire attention au numérateur car s'il est nul, l'appel au pgcd va provoquer une erreur. On doit donc mettre ce cas à part. On rend par convention (0,1) (mais on pourrait rendre (0,4), (0,85), etc...)
let reduit2 (a,b) = if a = 0 then (0,1) else let n = pgcd a b in (a/n,b/n);;
Alors on écrit reduitbis, qui réduit une fraction dont le dénominateur est positif : on doit faire attention au signe du numérateur.
let reduitbis (a,b) = if a > 0 then reduit2 (a,b) else let (a2,b2) = reduit2 (-a,b) in (-a2,b2);;
Enfin, la fonction réduit qui réduit une fraction dans laquelle a et b sont de signe quelconque : si le dénominateur est positif, on appelle directement reduitbis. Sinon, on change d'abord les deux signes :
let reduit (a,b) = if b > 0 then reduitbis (a,b) else reduitbis (-a,-b);;

3) A présent, écrivez la fonction plus qui ajoute deux rationnels et rend le résultat sous forme réduite. Déduisez-en la fonction moins telle que moins a b rende a - b, sous forme réduite également.
Solution

> Haut de la page