/// <summary> /// Вычисление корней данного многочлена по заданному модулю. /// </summary> /// <returns>Пары "корень-кратность"</returns> public Dictionary <int, int> SolveResults() { Dictionary <int, int> Roots = new Dictionary <int, int>(); Stack <int[]> rows = new Stack <int[]>(); rows.Push(Coefficients.Select(coef => (int)coef.A).ToArray()); //поместили изначальный массив коэффициентов for (int i = 0; i < Module; i++) { ModularPolynom buffer = new ModularPolynom(rows.Peek(), Module); int[] CurrentRow = buffer.GetValueArray(i); if (CurrentRow.Last() != 0) { continue; } int[] bufferarray = new int[CurrentRow.Length - 1]; Array.Copy(CurrentRow, bufferarray, bufferarray.Length); rows.Push(bufferarray); if (Roots.ContainsKey(i)) { Roots[i]++; } else { Roots.Add(i, 1); } i--; } return(Roots); }
public static ModularPolynom GetNormalized(ModularPolynom Source) { return(Source.Coefficients.Any(val => val.A != 0) ? new ModularPolynom( Source.Coefficients.SkipWhile(num => num.A == 0).Select(val => (int)val.A).ToArray(), Source.Module) : new ModularPolynom(new[] { 0 }, Source.Module)); }
/// <summary> /// Возвращает результат умножения многочленов по модулю. /// </summary> /// <param name="First"></param> /// <param name="Second"></param> /// <returns></returns> public static ModularPolynom operator *(ModularPolynom First, ModularPolynom Second) { First = GetNormalized(First); Second = GetNormalized(Second); if (First.Module != Second.Module) { throw new InvalidOperationException("Модули многочленов должны совпадать."); } if (First.Degree == 0) { return(Second * First[0]); } if (Second.Degree == 0) { return(First * Second[0]); } List <ModularPolynom> summaryarray = new List <ModularPolynom>(); for (int i = 0; i <= First.Degree; i++) { int FirstDegree = First.GetCoefDegree(i); if (First[i] == 0) { continue; } summaryarray.Add(new ModularPolynom(FirstDegree + Second.Degree, First.Module)); for (int j = 0; j <= Second.Degree; j++) { int SecondDegree = Second.GetCoefDegree(j); summaryarray[summaryarray.Count - 1][summaryarray[summaryarray.Count - 1].GetCoefIndex(FirstDegree + SecondDegree)] = First[i] * Second[j]; } } ModularPolynom Result = new ModularPolynom(summaryarray.Select(pol => pol.Degree).Max(), First.Module); Result = summaryarray.Aggregate(Result, (Current, part) => Current + part); return(Result); }
/// <summary> /// Инициализирует новый многочлен, который является копией заданного многочлена. /// </summary> /// <param name="Source"></param> public ModularPolynom(ModularPolynom Source) { Module = Source.Module; Coefficients = Source.Coefficients.Select(comp => (int)comp.A).Select(elem => new Comparison.LinearComparison(elem, Module)).ToArray(); }