public override string ToString() { if (!rational.IsDefault()) { return(rational.FormatFraction()); } return(Rationals.Utils.FormatCents(cents)); }
public string FormatFraction() { if (sign == 0) { return("0"); } return((sign < 0 ? "-" : "") + rational.FormatFraction()); }
/* * public static int[] FindCoordinates(Rational[] basis, Rational vector, int vectorLength) * { * int basisSize = basis.Length; * * // get prime powers * int[][] b = new int[basisSize][]; * for (int i = 0; i < basisSize; ++i) { * b[i] = basis[i].GetPrimePowers(); * } * int[] v = vector.GetPrimePowers(); * * // * int[] coordinates = FindCoordinates(b, v, vectorLength); * #if DEBUG * // check result * if (coordinates != null) { * Rational r = Rational.One; * for (int i = 0; i < coordinates.Length; ++i) { * r *= basis[i].Pow(coordinates[i]); * } * if (!r.Equals(vector)) throw new Exception( * String.Format("FindCoordinates failed: {0} != {1}", r, vector) * ); * } #endif * * return coordinates; * } */ #region Tests #if DEBUG private static void CheckVector(Rational[] basis, Rational vector, int vectorLength, bool addStandard = false) { // add standard basis int basisSize = basis.Length; if (addStandard) { Array.Resize(ref basis, basisSize + vectorLength); for (int i = 0; i < vectorLength; ++i) { basis[basisSize + i] = Rational.Prime(i); } } // for (int i = 0; i < basis.Length; ++i) { Debug.WriteLine(String.Format("Basis {0}. {1,-15} {2}", i, basis[i].FormatFraction(), basis[i].FormatMonzo())); } Debug.WriteLine(String.Format("Vector {0,-15} {1}", vector.FormatFraction(), vector.FormatMonzo())); // int[] coords = FindCoordinates(basis, vector, vectorLength); if (coords == null) { Debug.WriteLine("Invalid Basis or Out of basis subspace"); } else { Debug.WriteLine("Coordinates: " + Powers.ToString(coords, "()")); // Debug.WriteLine(vector.FormatFraction() + " = "); for (int i = 0; i < basisSize; ++i) { int e = Powers.SafeAt(coords, i); Debug.Print(" * ({0})^{1}", basis[i].FormatFraction(), e); } if (addStandard) { Rational r = new Rational(coords.Skip(basisSize).ToArray()); Debug.Print(" * {0} {1} {2}", r.FormatFraction(), r.FormatMonzo(), r.FormatNarrowPowers()); } } }
private static void Test3_FindCoordinates() { Rational r0 = new Rational(25, 24); // 25/24 |-3 -1 2> Chroma, Chromatic semitone Rational r1 = new Rational(81, 80); // 81/80 |-4 4 -1> Syntonic comma Rational r2 = new Rational(128, 125); // 128/125 |7 0 -3> Enharmonic diesis, Lesser diesis Rational r3 = new Rational(2048, 2025); // 2048/2025 |11 -4 -2> Diaschisma (128/125 / 81/80) Rational r4 = new Rational(531441, 524288); // 531441/524288 |-19 12 > Pif (81/80 * 32805/32768) Rational[] rs = new[] { //new Rational(2, 1), //new Rational(3, 2), r1, r2, //new Rational(36, 25), //new Rational(9, 8), //new Rational(2, 1), Rational.Prime(0), // 2 Rational.Prime(1), // 3 Rational.Prime(2), // 5 Rational.Prime(3), // 7 }; var matrix = new Matrix(rs, vectorLength: 3); matrix.Trace("----------------------------------------- start:"); matrix.MakeEchelon(); matrix.ReduceRows(); var r = //new Rational(81, 80) //r2 //new Rational(10, 9) new Rational(9, 8) ; var coords = matrix //.FindCoordinates(r); .FindFloatCoordinates(r); Debug.WriteLine(r.FormatFraction() + " ="); if (coords != null) { for (int i = 0; i < coords.Length; ++i) { Debug.WriteLine("{0,8}: {1,5}", rs[i].FormatFraction(), coords[i]); } } }