public static T SolveEquations <T>(IList <LnEqn <T> > equations) where T : IVector, new()
        {
            if (equations.Count != equations[0].coefs.Dimension)
            {
                throw new Exception("");
            }

            LnEqn <T>[] eqns = new LnEqn <T> [equations.Count];
            for (int i = 0; i < eqns.Length; i++)
            {
                eqns[i] = new LnEqn <T>(equations[i]);
            }

            for (int i = 0; i < eqns.Length - 1; i++)
            {
                for (int j = i + 1; j < eqns.Length; j++)
                {
                    eqns[j].Eliminate(eqns[i], i);
                }
            }
            T results = new T();

            for (int i = eqns.Length - 1; i >= 1; i--)
            {
                eqns[i].NormalizeAt(i);
                results[i] = eqns[i].constant;
                eqns[i - 1].Eliminate(i, results[i]);
            }
            eqns[0].NormalizeAt(0);
            results[0] = eqns[0].constant;
            return(results);
        }
        public LnEqn <T> Eliminate(LnEqn <T> from, int index)
        {
            if (from.coefs[index] == 0)
            {
                throw new Exception();
            }

            double m = coefs[index] / from.coefs[index];

            for (int i = 0; i < coefs.Dimension; i++)
            {
                coefs[i] -= from.coefs[i] * m;
            }
            constant -= from.constant * m;
            return(this);
        }
 public static LnEqn <T> Eliminate <T>(LnEqn <T> eqn, LnEqn <T> from, int index) where T : IVector, new()
 {
     return(new LnEqn <T>(eqn).Eliminate(from, index));
 }
 public static LnEqn <T> Eliminate <T>(LnEqn <T> eqn, int index, double value) where T : IVector, new()
 {
     return(new LnEqn <T>(eqn).Eliminate(index, value));
 }
 public static LnEqn <T> NormalizeAt <T>(LnEqn <T> eqn, int index) where T : IVector, new()
 {
     return(new LnEqn <T>(eqn).NormalizeAt(index));
 }
 public LnEqn(LnEqn <T> eqn)
 {
     this.coefs    = eqn.coefs;
     this.constant = eqn.constant;
 }