Esempio n. 1
0
        public Rational GetNarrowParent(Rational r)
        {
            int lastLevel = r.GetHighPrimeIndex();

            if (lastLevel >= _involvedPrimeCount)
            {
                return(default(Rational));
            }
            if (lastLevel <= _basePrimeIndex)
            {
                return(default(Rational));                              // We don't draw lines between base intervals (e.g. 1/2 - 1 - 2 - 4).
            }
            //
            Rational step = _narrows[lastLevel]; // last level step

            if (step.IsDefault())
            {
                return(default(Rational));              //!!! exception ?
            }
            int lastPower = r.GetPrimePower(lastLevel); // last level coordinate

            if (lastPower > 0)
            {
                return(r / step);
            }
            else
            {
                return(r * step);
            }
        }
Esempio n. 2
0
        public static Pow[] GetNarrowPowers(this Rational r, Rational[] narrows = null)
        {
            if (narrows == null)
            {
                narrows = NarrowUtils.GetDefault(r.GetInvolvedPowerCount());
            }
            int len = r.GetInvolvedPowerCount();

            if (len > narrows.Length)
            {
                return(null);
            }
            Pow[] res = new Pow[len];
            r = r.Clone();
            for (int i = len - 1; i >= 0; --i)
            {
                Pow e = r.GetPrimePower(i);
                res[i] = e;
                if (e != 0)
                {
                    r /= narrows[i].Power(e);
                }
            }
            return(res);
        }
Esempio n. 3
0
        public static Rational ValidateNarrow(Rational n)
        {
            if (n.IsDefault())
            {
                return(n);               // invalid
            }
            int h = n.GetHighPrimeIndex();

            if (h == -1)
            {
                return(default(Rational)); // "1" can't be a narrow
            }
            if (n.GetPrimePower(h) < 0)    // max prime should be in nominator
            {
                n = Rational.One / n;
            }
            return(n);
        }