public class Rational {

    // Don't shoot the programmer! 
    // This Java class was written by some one (Yvan Saint-Aubin)
    // who had not yet written more than a thousand lines
    // of Java in his life. If you think your code is better, 
    // you may well be right!

    int num, den;

    public Rational(int a) {
       num = a; den = 1;
    }

    public Rational(int a, int b) {
        num = a; den = b;
        if (b == 0) System.out.println("You're heading for trouble ...");
        else if (b < 0) {num = - num ; den = - den;}
        int aDiviser = gcd(num, den);
        num = num / aDiviser;
        den = den / aDiviser;
    }

    public static final Rational MOINS_UN = new Rational(-1,1);
    public static final Rational UN       = new Rational( 1,1);
    public static final Rational ZERO     = new Rational( 0,1);

    public Rational inverseAdditif() {
        return new Rational( -num, den);
    }
    public Rational inverseAdditif(Rational r) {
        return new Rational( - r.num, r.den);
    }
    public Rational inverseMult() {
        return new Rational( den, num);
    }

    public static Rational inverseMult(Rational r) {
        return new Rational( r.den, r.num);
    }

    public static Rational add(Rational r1, Rational r2) {
       int num1 = r1.num * r2.den + r1.den * r2.num;
       int den1 = r1.den * r2.den ;
       int aDiviser = gcd(num1, den1);
       num1 = num1 / aDiviser;
       den1 = den1 / aDiviser;
       return new Rational(num1, den1);
    }

    public static Rational minus(Rational r1, Rational r2) {
       return add( r1, multiply(MOINS_UN, r2) );
    }

    public static Rational multiply(Rational r1, Rational r2) {
       int num1 = r1.num * r2.num ;
       int den1 = r1.den * r2.den ;
       return new Rational( num1, den1 );
    }

    public static Rational divide(Rational r1, Rational r2) {
       return multiply(r1, r2.inverseMult() );
    }

    public static boolean greaterThan(Rational r1, Rational r2) {
        Rational r = minus(r1, r2);
        if (r.num > 0) return true;
        else return false;
    }

    public static boolean equalTo(Rational r1, Rational r2) {
        Rational r = minus(r1, r2);
        if (r.num == 0) return true;
        else return false;
    }
    
    public boolean isIntegerMultipleOf(Rational r) {
        Rational ratioXR = divide(this, r);
        int aDiviser = gcd( ratioXR.num, ratioXR.den );
        if (aDiviser == ratioXR.den ) return true  ;
        else                          return false ;
    
    }

    public String toString() {
        return "(" + num + "/" + den + ")";
    }

    private static int gcd(int a, int b) {
        int m = a ; int n = b;
        if (m < 0) m = -m;
        if (n < 0) n = -n;
        while (n > 0) {
            int r = m % n ;
            m = n;
            n = r;
        }
        return m;
    }
}


