Exemplo n.º 1
0
            /// <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);
            }
Exemplo n.º 2
0
 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));
 }
Exemplo n.º 3
0
            /// <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);
            }
Exemplo n.º 4
0
 /// <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();
 }