
package rationnels;
import java.util.Date;
import java.io.*;

public class Rationnel implements Serializable {

private int num,den;
private Date d;

/** crée un rationnel connaissant le numérateur et le dénominateu  non nul
 * @param n  le numérateur
 * @param d   le dénominateur */
 public Rationnel(int n,int d){
  if (d==0) throw new ArithmeticException("le dénominateur ne peut être nul");
  this.num=n;this.den=d;this.simplifier();
  }

/** renvoie une chaîne de caractères représentant ce rationnel avec la
  * notation habituelle sous forme de fractions irréductibles
  * @return cette chaine */
 public String toString(){
  if ((this.den==1)||(this.num==0)) return(""+this.num);
  else return(""+this.num+'/'+this.den);
 }

 /*
 private static int pgcd(int a,int b){
  while (a!=b)  if (a>b){a=a-b;}else {b=b-a;};
  return(a);
 }
 */

/* renvoie le pgcd de deux entiers */
  private static int pgcd(int a,int b) {
  int r = a;
  while (r!=0)  {r = a%b; a=b; b=r; }
  return(a);
 }

/* normalise ce rationnel en le mettant sous forme
 * irréductible avec un dénominateur positif */
 private void simplifier(){
   if (this.num==0) this.den=1;
   else { int p = Rationnel.pgcd(this.num,this.den);this.num /= p;this.den /= p;
                                 // ou this.num=this.num/p;this.den =this.den/p;
          if (this.den < 0) {this.num= -this.num; this.den=- this.den;}
        };
  }

/** renvoie la somme de deux rationnels
 * @param a et b les deux rationnels
 * @return la somme */
 public static Rationnel somme(Rationnel a,Rationnel b){
  return(new Rationnel(a.num*b.den+a.den*b.num,a.den*b.den));
 }

/** ajoute un rationnel à ce rationnel
 * @param a le rationnel ajouté
 * @return la somme */
 public Rationnel somme(Rationnel a){
  return(new Rationnel(a.num*this.den+a.den*this.num,a.den*this.den));
 }

/** renvoie le produit de deux rationnels
 * @param a et b les deux rationnels
 * @return le produit */
 public static Rationnel produit(Rationnel a,Rationnel b){
  return(new Rationnel(a.num*b.num,a.den*b.den));
 }

/** multiplie ce rationnel par un rationnel
 * @param a le rationnel par lequel on multiplie
 * @return le produit */
 public Rationnel produit(Rationnel a){
  return(new Rationnel(a.num*this.num,a.den*this.den));
 }

/** renvoie l'inverse d'un rationnel
 * @param a le rationnel
 * @return l'inverse */
 public static Rationnel inverse(Rationnel a){
  return new Rationnel(a.den,a.num);
  }

/** renvoie l'inverse de ce rationnel
 * @return l'inverse */
 public Rationnel inverse(){
  return new Rationnel(this.den,this.num);
  }


};

