Exemplo n.º 1
0
        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]);
                }
            }
        }
Exemplo n.º 2
0
        /*
         * 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());
                }
            }
        }
Exemplo n.º 3
0
        public static Rational MakeNarrow(int narrowIndex, int basePrimeIndex)
        {
            Rational r = Rational.Prime(narrowIndex); // just prime: 2/1, 3/1, 5/1, 7/1, ..

            return(MakeNarrow(r, basePrimeIndex));
        }