/// <summary> /// 多項式が整理できる場合は整理する /// ・分母分子ごとに同類項をまとめる /// ・共通因数があれば求める /// ・共通因数を掛けて約分し、それを分母分子に分けて掛ける /// </summary> private void Initialise() { if (NumMonof.IsZero()) { DenMonof = new List <Monomial> { 1 }; return; } if (NumMonof.IsOne() && DenMonof.IsOne()) { return; } //0の項を削除 NumMonof = NumMonof.Where(x => !x.IsZero()).ToList(); DenMonof = DenMonof.Where(x => !x.IsZero()).ToList(); //同類項をまとめる var SortedNumerator = NumMonof.Grouping(IsNumberKey: false).Select(x => { var res = x[0]; res.Number = x.Select(y => y.Number).Aggregate((now, next) => now + next); return(res); }).ToList(); var SortedDenominator = DenMonof.Grouping(IsNumberKey: false).Select(x => { var res = x[0]; res.Number = x.Select(y => y.Number).Aggregate((now, next) => now + next); return(res); }).ToList(); if (SortedNumerator.IsOne() || SortedDenominator.IsOne()) { NumMonof = SortedNumerator; DenMonof = SortedDenominator; return; } var NumFactor = Factorizations.FactorOut(SortedNumerator); var DenFactor = Factorizations.FactorOut(SortedDenominator); Monomial Factor = NumFactor.Item1 / DenFactor.Item1; NumMonof = NumFactor.Item2.Select(x => x * Factor.GetNumerator()).ToList(); DenMonof = DenFactor.Item2.Select(x => x * Factor.GetDenominator()).ToList(); Reduction(); Trace.WriteLine("Formula Initialized:" + this.GetString()); }