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); }
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()); }