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); } }
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); }
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); }