Esempio n. 1
0
        private static FactorInfo GetFactorInfo(Dictionary <Operator, FactorInfo> dictionary)
        {
            FactorInfo commonFactorInfo = null;

            foreach (KeyValuePair <Operator, FactorInfo> pair in dictionary)
            {
                if (commonFactorInfo == null || pair.Value.Positions.Count > commonFactorInfo.Positions.Count)
                {
                    commonFactorInfo = pair.Value;
                }
                else if (commonFactorInfo.Positions.Count == pair.Value.Positions.Count)
                {
                    bool equal = true;
                    for (int i = 0; i < commonFactorInfo.Positions.Count; i++)
                    {
                        if (!(commonFactorInfo.Positions[i] == pair.Value.Positions[i]))
                        {
                            equal = false;
                            break;
                        }
                    }
                    if (equal)
                    {
                        commonFactorInfo = new FactorInfo(commonFactorInfo.GetCommonFactor() * pair.Value.GetCommonFactor(), Rational.One);
                        for (int i = 0; i < pair.Value.Positions.Count; i++)
                        {
                            commonFactorInfo.Positions.Add(pair.Value.Positions[i]);
                        }
                    }
                }
            }

            return(commonFactorInfo);
        }
Esempio n. 2
0
        private static Symbol GetCommonFactor(List <Symbol> sumTerms, out List <int> positions)
        {
            Dictionary <Symbol, FactorInfo> factorDictionary = new Dictionary <Symbol, FactorInfo>();

            for (int i = 0; i < sumTerms.Count; i++)
            {
                Symbol sumTerm = sumTerms[i];
                foreach (Symbol productTerm in sumTerm.ProductTerms)
                {
                    Symbol   factor   = null;
                    Rational exponent = Rational.One;
                    if (productTerm.Exponent.SumTerms.Count == 0)
                    {
                        factor   = productTerm.ExponentBase;
                        exponent = productTerm.Exponent.SumConstantTerm;
                    }
                    else
                    {
                        factor = productTerm;
                    }

                    FactorInfo factorInfo = null;
                    if (factorDictionary.TryGetValue(factor, out factorInfo))
                    {
                        factorInfo.Exponent = Rational.Min(factorInfo.Exponent, exponent);
                    }
                    else
                    {
                        factorInfo = new FactorInfo(factor, exponent);
                        factorDictionary[factor] = factorInfo;
                    }
                    factorInfo.Positions.Add(i);
                }
            }

            FactorInfo commonFactorInfo = null;

            foreach (KeyValuePair <Symbol, FactorInfo> pair in factorDictionary)
            {
                if (commonFactorInfo == null || pair.Value.Positions.Count > commonFactorInfo.Positions.Count)
                {
                    commonFactorInfo = pair.Value;
                }
                else if (commonFactorInfo.Positions.Count == pair.Value.Positions.Count)
                {
                    bool equal = true;
                    for (int i = 0; i < commonFactorInfo.Positions.Count; i++)
                    {
                        if (!(commonFactorInfo.Positions[i] == pair.Value.Positions[i]))
                        {
                            equal = false;
                            break;
                        }
                    }
                    if (equal)
                    {
                        commonFactorInfo = new FactorInfo(commonFactorInfo.GetCommonFactor() * pair.Value.GetCommonFactor(), Rational.One);
                        for (int i = 0; i < pair.Value.Positions.Count; i++)
                        {
                            commonFactorInfo.Positions.Add(pair.Value.Positions[i]);
                        }
                    }
                }
            }

            positions = commonFactorInfo.Positions;
            return(commonFactorInfo.GetCommonFactor());
        }