/** Calcaulte the simplest rational between two reals. */ public static RealNum rationalize(RealNum x, RealNum y) { // This algorithm is by Alan Bawden. It has been transcribed // with permission from C-Gambit, copyright Marc Feeley. if (x.grt(y)) { return(simplest_rational2(y, x)); } else if (!(y.grt(x))) { return(x); } else if (x.sign() > 0) { return(simplest_rational2(x, y)); } else if (y.isNegative()) { return((RealNum)(simplest_rational2((RealNum)y.neg(), (RealNum)x.neg())).neg()); } else { return(IntNum.zero()); } }
/** Calcaulte the simplest rational between two reals. */ public static RealNum rationalize(RealNum x, RealNum y) { // This algorithm is by Alan Bawden. It has been transcribed // with permission from C-Gambit, copyright Marc Feeley. if (x.grt (y)) return simplest_rational2 (y, x); else if (! (y.grt(x))) return x; else if (x.sign() > 0) return simplest_rational2 (x, y); else if (y.isNegative ()) return (RealNum) (simplest_rational2 ((RealNum)y.neg(), (RealNum)x.neg())).neg(); else return IntNum.zero (); }
private static RealNum simplest_rational2(RealNum x, RealNum y) { RealNum fx = x.toInt(FLOOR); RealNum fy = y.toInt(FLOOR); if (!x.grt(fx)) { return(fx); } else if (fx.Equals(fy)) { RealNum n = (RealNum)IntNum.one().div(y.sub(fy)); RealNum d = (RealNum)IntNum.one().div(x.sub(fx)); return((RealNum)fx.add(IntNum.one().div(simplest_rational2(n, d)), 1)); } else { return((RealNum)fx.add(IntNum.one(), 1)); } }
private static RealNum simplest_rational2(RealNum x, RealNum y) { RealNum fx = x.toInt (FLOOR); RealNum fy = y.toInt (FLOOR); if (! x.grt(fx)) return fx; else if (fx.Equals(fy)) { RealNum n = (RealNum) IntNum.one().div(y.sub(fy)); RealNum d = (RealNum) IntNum.one().div(x.sub(fx)); return (RealNum) fx.add(IntNum.one().div(simplest_rational2 (n, d)), 1); } else return (RealNum) fx.add(IntNum.one(), 1); }