public static int Test_UnitVector_Col_Row_Accessors()
        {
            List <double> initer = new List <double> {
                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
            };                                                       //init matrix vector
            SquareRealMatrix A = new SquareRealMatrix(4, 4, initer); //create 4X4 matrix

            A.Name = "A";                                            //give it a name

            UnitVectorSpace uvs  = new UnitVectorSpace(4);           //Create unit vector space to use
            UnitVector      e2   = new UnitVector("e2", 4, RowColumn.Column);
            UnitVector      e2_p = new UnitVector("e2", 4, RowColumn.Row);

            RealVector    rv = A * e2;
            StringBuilder sb = new StringBuilder();//Start building latex

            sb.Append(@"\begin{aligned}");
            sb.AppendFormat(@"&A = &{0} \\ \\", A.ToLatex()); //Display Original A matrix
            sb.Append(@"&A_{.2} = &" + rv.ToLatex() + @" \\ \\");
            RealVector rvRow = e2_p * A;

            sb.Append(@"&A_{2.}' = &" + rvRow.ToLatex());

            sb.Append(@"\end{aligned}");
            HtmlOutputMethods.WriteLatexEqToHtmlAndLaunch(sb.ToString(), "Test_UnitVector_Col_Row_Accessors.html"); //display Latex via mathjax
            return(0);
        }
        public static int Test_KroneckerSum()
        {
            RealFactory      rf = new RealFactory();
            SquareRealMatrix A  = rf[2, 2,
                                     1, -1,
                                     0, 2
                                  ];

            SquareRealMatrix B = rf[2, 2,
                                    1, 0,
                                    2, -1
                                 ];

            StringBuilder sb = new StringBuilder();//Start building latex

            sb.Append(@"\begin{aligned}");

            sb.AppendFormat(@"&A = {0}\;B = {1}", A.ToLatex(), B.ToLatex() + @" \\ \\");
            sb.AppendFormat(@"&C = A\;\oplus\;B = {0}", SquareRealMatrix.KroneckerSum(A, B).ToLatex());

            sb.Append(@"\end{aligned}");

            HtmlOutputMethods.WriteLatexEqToHtmlAndLaunch(sb.ToString(), "Test_KroneckerSum.html"); //display Latex via mathjax

            return(0);
        }
        public static int Test_Partioned_Matrix()
        {
            List <double> initer = new List <double> {
                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
            };                                                       //init matrix vector
            SquareRealMatrix A = new SquareRealMatrix(4, 4, initer); //create 4X4 matrix

            A.Name = "A";                                            //give it a name
            SquareRealMatrix AColumns = new SquareRealMatrix(new List <RealVector> {
                A[".1"], A[".2"], A[".3"], A[".4"]
            });                                                                                                            //Create partioned matrix from columns
            SquareRealMatrix ARows = new SquareRealMatrix(new List <RealVector> {
                A["1."], A["2."], A["3."], A["4."]
            });                                     //Create partioned matrix from rows

            StringBuilder sb = new StringBuilder(); //Start building latex

            sb.Append(@"\begin{aligned}");
            sb.AppendFormat(@"&A = &{0} \\ \\", A.ToLatex());                                                                         //Display Original A matrix
            sb.Append(@"&A = \left[ A_{.1}\;A_{.2}\;A_{.3}\;A_{.4} \right] = \;\;" + "&" + AColumns.ToLatex() + @" \\ \\");           //partioned matrix via columns of A
            sb.Append(@"&\left[ A_{1.}\;A_{2.}\;A_{3.}\;A_{4.} \right] = \;\;" + "&" + ARows.ToLatex() + @" \\ \\");                  //partioned matrix via rows of A
            sb.Append(@"&A = \left[ A_{1.}\;A_{2.}\;A_{3.}\;A_{4.} \right]' = \;\;" + "&" + ARows.Transpose().ToLatex() + @" \\ \\"); //transpose to get A
            sb.Append(@"\end{aligned}");
            HtmlOutputMethods.WriteLatexEqToHtmlAndLaunch(sb.ToString(), "Test_Partioned_Matrix.html");                               //display Latex via mathjax
            return(0);
        }
        public static SquareRealMatrix operator +(SquareRealMatrix a, SquareRealMatrix b)
        {
            SquareRealMatrix retVal = new SquareRealMatrix(a.Rows, a.Columns);

            for (int i = 0; i < retVal.Rows; i++)
            {
                for (int j = 0; j < retVal.Columns; j++)
                {
                    retVal.InternalRep[i, j] = a.InternalRep[i, j] + b.InternalRep[i, j];
                }
            }

            StringBuilder sb = new StringBuilder();

            sb.Append("$$");
            sb.Append(a.ToLatex());
            sb.Append(" + ");
            sb.Append(b.ToLatex());
            sb.Append(" = ");
            sb.Append(retVal.ToLatex());
            sb.Append("$$");

            retVal.m_FullRep = sb.ToString();
            return(retVal);
        }
        public static int Test_SRM_To_Elem()
        {
            SquareRealMatrix elem = SquareRealMatrix.ElementaryMatrix(4, 4, "E22");                     //E22 elementary matrix

            HtmlOutputMethods.WriteLatexEqToHtmlAndLaunch(elem.ToString("F"), "Test_SRM_To_Elem.html"); //display Latex via mathjax
            return(0);
        }
        public static SquareRealMatrix operator -(double b, SquareRealMatrix a)
        {
            SquareRealMatrix retVal = new SquareRealMatrix(a.Rows, a.Columns);

            for (int rowCount = 0; rowCount < retVal.Rows; rowCount++)
            {
                for (int colCount = 0; colCount < retVal.Columns; colCount++)
                {
                    retVal.InternalRep[rowCount, colCount] = b - a.InternalRep[rowCount, colCount];
                }
            }

            StringBuilder sb = new StringBuilder();

            sb.Append("$$");
            sb.Append(b.ToString());
            sb.Append(" - ");
            sb.Append(a.ToLatex());
            sb.Append(" = ");
            sb.Append(retVal.ToLatex());
            sb.Append("$$");

            retVal.m_FullRep = sb.ToString();
            return(retVal);
        }
        public static SquareRealMatrix operator *(SquareRealMatrix a, SquareRealMatrix b)
        {
            SquareRealMatrix retVal = new SquareRealMatrix(a.Rows, a.Columns);

            for (int rowCount = 0; rowCount < retVal.Rows; rowCount++)
            {
                for (int colCount = 0; colCount < retVal.Columns; colCount++)
                {
                    for (int retColCount = 0; retColCount < retVal.Columns; retColCount++)
                    {
                        retVal.InternalRep[rowCount, colCount] += a.InternalRep[rowCount, retColCount] * b.InternalRep[retColCount, colCount];
                        double sens = retVal.InternalRep[rowCount, colCount];

                        if (Math.Abs(sens) < 1.0e-8d) //f**ked up value set to zero  // TODO: tell us how you really feel about it, Brad.  GPG
                        {
                            retVal.InternalRep[rowCount, colCount] = 0;
                        }
                    }
                }
            }

            StringBuilder sb = new StringBuilder();

            sb.Append("$$");
            sb.Append(a.ToLatex());
            sb.Append(" \\cdot ");
            sb.Append(b.ToLatex());
            sb.Append(" = ");
            sb.Append(retVal.ToLatex());
            sb.Append("$$");

            retVal.m_FullRep = sb.ToString();

            return(retVal);
        }
        public static int Test_RationalSquareMatrix()
        {
            RationalFactory rf  = new RationalFactory();
            RealFactory     rff = new RealFactory();

            RationalSquareMatrix A = rf[3, 3,
                                        "1", "2", "-2",
                                        "-1", "1", "3",
                                        "2", "-1", "2"
                                     ];

            SquareRealMatrix SA = rff[3, 3,
                                      7, 2, -2,
                                      3, 1, 3,
                                      8, -1, 2
                                  ];
            RationalVector rv = rf["7", "3", "8"];

            StringBuilder sb = new StringBuilder();//Start building latex

            sb.Append(@"\begin{aligned}");

            sb.AppendFormat(@"&A = {0}", A.ToLatex() + @" \\ \\"); //display A matrix
            A[0] = rv;
            sb.AppendFormat(@"&Ab = {0}", A.ToLatex());            //display Vec A
            sb.AppendFormat(@"&Det = {0}", SA.Determinant());      //display Vec A
            sb.Append(@"\end{aligned}");

            HtmlOutputMethods.WriteLatexEqToHtmlAndLaunch(sb.ToString(), "Test_VecOperator.html"); //display Latex via mathjax

            return(0);
        }
        public static SquareRealMatrix KroneckerSum(SquareRealMatrix a, SquareRealMatrix b)
        {
            SquareRealMatrix retVal = null;
            SquareRealMatrix id     = IdentityMatrix(a.Rows);

            retVal = KroneckerProduct(a, id) + KroneckerProduct(id, b);

            retVal.FullRep = a.ToLatex() + @"\;\oplus\;" + b.ToLatex() + " = " + retVal.ToLatex(); //produce latex string

            return(retVal);
        }
        public static SquareRealMatrix DiagonalMatrix(int Dim, double[] arr)
        {
            SquareRealMatrix retVal = new SquareRealMatrix(Dim, Dim);

            for (int dimCount = 0; dimCount < Dim; dimCount++)
            {
                retVal[dimCount, dimCount] = arr[dimCount];
            }

            return(retVal);
        }
        public static string MultipliedVectorLatex(SquareRealMatrix A, double[] VectorIn, double[] VectorOut)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(A.ToLatex());
            sb.Append(VectorToLatex(VectorIn));
            sb.Append(" = ");
            sb.Append(VectorToLatex(VectorOut));

            return(sb.ToString());
        }
        public SquareRealMatrix MultiplyByScalar(double Scalar)
        {
            SquareRealMatrix retVal = new SquareRealMatrix(this.Columns, this.Rows);

            for (int rowCount = 0; rowCount < retVal.Rows; rowCount++)
            {
                for (int colCount = 0; colCount < retVal.Columns; colCount++)
                {
                    retVal.InternalRep[rowCount, colCount] = this.InternalRep[rowCount, colCount] * Scalar;
                }
            }

            return(retVal);
        }
        public static int Test_Rows_Of_Matrix()
        {
            List <double> initer = new List <double> {
                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
            };                                                                                                                   //init matrix vector
            SquareRealMatrix A = new SquareRealMatrix(4, 4, initer);                                                             //create 4X4 matrix

            A.Name = "A";                                                                                                        //give it a name
            RealVector rvRow = A["2."];                                                                                          //use accessor to get row 2 of matrix
            string     outR  = @"\begin{aligned}&A  = " + A.ToLatex() + @" \\ \\" + "&" + rvRow.ToLatex("F") + @"\end{aligned}"; //use row accessor A2. which returns row 2.

            HtmlOutputMethods.WriteLatexEqToHtmlAndLaunch(outR, "TestRows_Of_Matrix.html");                                      //display Latex via mathjax
            return(0);
        }
        public static SquareRealMatrix IdentityMatrix(int Order)
        {
            SquareRealMatrix retVal = new SquareRealMatrix(Order, Order);

            for (int rowCount = 0; rowCount < retVal.Rows; rowCount++)
            {
                for (int colCount = 0; colCount < retVal.Columns; colCount++)
                {
                    if (rowCount == colCount)
                    {
                        retVal[rowCount, colCount] = 1;
                    }
                }
            }
            return(retVal);
        }
        public SquareRealMatrix Transpose()
        {
            SquareRealMatrix retVal = new SquareRealMatrix(this.Rows, this.Columns);
            RowOrColumn      rc     = new RowOrColumn();

            rc.rowColumn = RowColumn.Row;
            rc.Val       = 0;
            for (int rowCount = 0; rowCount < Rows; rowCount++)
            {
                RealVector rv = this[rowCount];
                rc.Val     = rowCount;
                retVal[rc] = rv;
            }

            return(retVal);
        }
        public static SquareRealMatrix KroneckerProduct(SquareRealMatrix a, SquareRealMatrix b)
        {
            int Rows                = a.Rows * b.Rows;    //calculate number of rows.
            int Columns             = a.Columns * b.Rows; // calculate number of columns
            int incC                = 0;                  //increment variable for column of b matrix
            int incR                = 0;                  //increment variable for row of b matrix
            int incAMC              = 0;                  //increment variable for column of a matrix
            int incAMR              = 0;                  //increment variable for row of a matrix
            SquareRealMatrix retVal = new SquareRealMatrix(Rows, Columns);
            int    rowCount         = 0;
            int    colCount         = 0;
            double exp              = 0;

            for (rowCount = 0; rowCount < retVal.Rows; rowCount++)
            {
                if (incR > b.Rows - 1)//reached end of rows of b matrix
                {
                    incR = 0;
                    incAMR++;
                }
                incAMC = 0;
                for (colCount = 0; colCount < retVal.Columns; colCount++)
                {
                    exp = a[incAMR, incAMC] * b[incR, incC];
                    incC++;
                    if (incC > b.Columns - 1)////reached end of columns of b matrix
                    {
                        incC = 0;
                        incAMC++;
                    }

                    retVal[rowCount, colCount] = exp;
                }
                incR++;
            }

            retVal.FullRep = a.ToLatex() + @"\;\otimes\;" + b.ToLatex() + " = " + retVal.ToLatex(); //produce latex string
            return(retVal);
        }
        public static int Test_VecOperator()
        {
            RealFactory rf = new RealFactory(); //create a real factory

            SquareRealMatrix A = rf[2, 2,       //create a 2 X 2 real matrix
                                    1, 2,
                                    3, 4
                                 ];

            RealVector    VecA = A.Vec("A");          //use Vec operator giving the matrix a name
            StringBuilder sb   = new StringBuilder(); //Start building latex

            sb.Append(@"\begin{aligned}");

            sb.AppendFormat(@"&A = {0}", A.ToLatex() + @" \\ \\"); //display A matrix
            sb.AppendFormat(@"&{0}", VecA.ToLatex("F"));           //display Vec A
            sb.Append(@"\end{aligned}");

            HtmlOutputMethods.WriteLatexEqToHtmlAndLaunch(sb.ToString(), "Test_VecOperator.html"); //display Latex via mathjax

            return(0);
        }
        public static int Test_TraceFunction()
        {
            RealFactory rf = new RealFactory(); //create a real factory

            SquareRealMatrix A = rf[3, 3,       //create a 3 X 3 real matrix
                                    1, 2, 3,
                                    7, 8, 9,
                                    6, 5, 4
                                 ];

            StringBuilder sb = new StringBuilder();//Start building latex

            sb.Append(@"\begin{aligned}");

            sb.AppendFormat(@"&A = {0}", A.ToLatex() + @" \\ \\");  //display A matrix
            sb.AppendFormat(@"&tr A = {0}", A.Trace() + @" \\ \\"); //display trace
            sb.Append(@"\end{aligned}");

            HtmlOutputMethods.WriteLatexEqToHtmlAndLaunch(sb.ToString(), "Test_TraceFunction.html"); //display Latex via mathjax

            return(0);
        }
        public static SquareRealMatrix ElementaryMatrix(int rows, int columns, string Name)
        {
            SquareRealMatrix retVal = new SquareRealMatrix(rows, columns);

            retVal.Name = Name;

            if (retVal.Name[0] != 'E')
            {
                throw new Exception("Name of ElementaryMatrix must begin with a capital E followed by two number indices");
            }

            int oI1 = 0;
            int oI2 = 0;

            try
            {
                if (!int.TryParse(retVal.Name[1].ToString(), out oI1))
                {
                    throw new Exception("Name of ElementaryMatrix must begin with a capital E followed by two number indices, index 1 bad.");
                }

                if (!int.TryParse(retVal.Name[2].ToString(), out oI2))
                {
                    throw new Exception("Name of ElementaryMatrix must begin with a capital E followed by two number indices, index 2 bad");
                }

                retVal[oI1 - 1, oI2 - 1] = 1;
                retVal.LatexName         = @"E_{" + (oI1).ToString() + (oI2).ToString() + "}";
            }
            catch (Exception)
            {
                throw new Exception("Name of ElementaryMatrix must begin with a capital E followed by two number indices. Could not parse indices.");
            }

            retVal.FullRep = retVal.LatexName + @"\;=\;" + retVal.ToLatex();
            return(retVal);
        }