public static Rational MakeNarrow(Rational r, Rational b) { if (r.GetHighPrimeIndex() == b.GetHighPrimeIndex()) { return(r); // can't narrow on same prime level } double r_ = r.ToDouble(); double b_ = b.ToDouble(); double l = Math.Log(r_, b_); // e.g. 1.58 for {3, 2} Pow e = (Pow)(l + 0.25); // something between Floor and Round r /= b.Power(e); return(r); }
public static Rational MakeNarrow(Rational r, int basePrimeIndex) { if (r.GetHighPrimeIndex() <= basePrimeIndex) { return(r); // can't narrow } r = ValidateNarrow(r); // double rr = r.ToDouble(); if (rr < 1.0) { return(r); // e.g. for 5/6 - doubtful !!! } int b = Utils.GetPrime(basePrimeIndex); // base prime: 2, 3,.. double l = Math.Log(rr - 1.0, b); Pow e = (Pow)Math.Round(l); Long d = Utils.Pow(b, e); r /= d; return(r); }