public virtual IAlgebraicExpression InnerProduct(TVector other)
        {
            if (other is IExplicitVectorValue <TVector, TBasis> v)
            {
                IList <IAlgebraicExpression> squares = new List <IAlgebraicExpression>();
                foreach (var term in this)
                {
                    if (v.ContainsBasisTerm(term.BasisVector))
                    {
                        squares.Add(term.Coefficient.Multiply(v[term.BasisVector]));
                    }
                }

                return(IAlgebraicExpression.Sum(squares));
            }

            return(IExplicitGeneralizedVector <TVector, TBasis> .InnerProductOperation(this.AsExpressionType(), other));
        }
        public virtual TVector SubtractBy(TVector other)
        {
            if (other is IExplicitVectorValue <TVector, TBasis> v)
            {
                var retTerms = new Dictionary <TBasis, IAlgebraicExpression>(this.Terms);

                foreach (var term in v)
                {
                    if (retTerms.ContainsKey(term.BasisVector))
                    {
                        retTerms[term.BasisVector] = retTerms[term.BasisVector].SubtractBy(term.Coefficient);
                    }
                    else
                    {
                        retTerms[term.BasisVector] = term.Coefficient.Negate();
                    }
                }

                return(this.NewExplicitVectorValue(retTerms));
            }

            return(IExplicitGeneralizedVector <TVector, TBasis> .Subtraction(this.AsExpressionType(), other));
        }