Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }