//Rational number arithmetic
function Rational(i, j) {
	this.num = i*1;
	this.denom = j*1;
}

function zero() {
	return new Rational(0,1);
}

function one() {
	return new Rational(1,1);
}

function divides(i, j) {
	return ((i % j) == 0);
}

/**
 * Greatest common denominator of two integers x,y
 */
function gcd(x, y) {
	var i = x.denom;
	var j = y.denom;
	if (divides(i,j)) return i;
	else if (divides(j,i)) return j;
	else return i*j;
}

function isNegative(x) {
	return (x.num < 0);
}

function negate(x) {
	x.num = -(x.num);
	return x;
}

function isZero(x) {
	return (x.num == 0);
}

/**
 * Simplifies a fraction by reducing its numerator and denominator
 * to their simplest
 */
function simplify(x) {
	var isNeg = isNegative(x);
	var t = (isNeg? -(x.num) : x.num);
	var b = x.denom;
	var smaller = Math.min(t, b);
	if (divides(t,b)) {
		t /= b;
		b = 1;
	}
	else if (divides(b,t)) {
		b /= t;
		t = 1;
	}
	else {
		for (var i = 2; i <= smaller; i++) {
			while (divides(t,i) && divides(b,i)) {
				t /= i;
				b /= i;
			}
			smaller = Math.min(t,b);
		}
	}
	var z = new Rational(1,1);
	z.num = (isNeg? -t : t);
	z.denom = b;
	return z;
}

function multiply(x, y) {
	var r = new Rational(1,1);
	r.num = x.num * y.num;
	r.denom = x.denom * y.denom;
	return simplify(r);
}

function divide(x, y) {
	var r = new Rational(1,1);
	r.num = x.num * y.denom;
	r.denom = x.denom * y.num;
	return simplify(r);
}

function add(x, y) {
	var i = gcd(x, y);
	var r = new Rational(1,1);
	r.num = x.num * i / x.denom + y.num * i / y.denom;
	r.denom = i;
	return simplify(r);
}

function subtract(x, y) {
	var i = gcd(x, y);
	var r = new Rational(1,1);
	r.num = x.num * i / x.denom - y.num * i / y.denom;
	r.denom = i;
	return simplify(r);
}

function max(x, y) {
	var z = subtract(x,y);
	if (isNegative(z)) return y;
	else return x;
}

function min(x, y) {
	var z = subtract(y,x);
	if (isNegative(z)) return y;
	else return x;
}

function isLtOne(x) {
	var z = simplify(x);
	return ((z.num - z.denom) < 0);
}

function isGtOne(x) {
	var z = simplify(x);
	return ((z.num - z.denom) > 0);
}

function isOne(x) {
	var z = simplify(x);
	return ((z.num - z.denom) == 0);
}

function isLt(x, y) {
	var z = subtract(x,y);
	if (isNegative(z)) return true;
	else return false;
}

function isGt(x, y) {
	var z = subtract(y,x);
	if (isNegative(z)) return true;
	else return false;
}

function equals(x, y) {
	var z = subtract(x,y);
	if (isZero(z)) return true;
	else return false;
}

function toRational(s) {
	if (!s) return zero();
	if ("" == s) return zero();
	if ("TIDAK ADA" == s.toUpperCase()) return zero();
	var i = s.indexOf("/");
	if (i < 0) {
		alert("Tidak dapat merubah " + s + " ke bilangan rasional");
		return null;
	}
	var z = one();
	z.num = s.substring(0,i);
	z.denom = s.substring(i+1);
	if (z.denom < 0) {
		z.num = -(z.num);
		z.denom = -(z.denom);
	}
	return z;
}

function toString(x) {
	if (isZero(x)) return "TIDAK ADA";
	else if (isOne(x)) return "SEMUANYA";
	else if ((x.num == -1) && (x.denom == 1)) return "UNTUK DIBAGI LAGI";
	else return x.num + "/" + x.denom;
}





