Example #1
0
 /// <summary>
 /// Алгоритм проверки многочлена пятой степени на простоту.
 /// Использует проверку на делимость на линейные и на квадратичные многочлены.
 /// Асимптотика: O(p^3)
 /// </summary>
 public static bool IsPrimePolynomial(Polynomial poly, int order, ref Polynomial second)
 {
     // Для начала проверим, делится ли многочлен на какой-нибудь линейный двучлен
     for (int i = 0; i < order; i++)
     {
         if (poly.GetValueOf(i) % order == 0) // Для этого достаточно посмотреть на значение многочлена в точке
         {
             int k = i;                       // Локальная переменная, значит свободную часть в линейном члене (x - k)
             k = -k;
             Abduction(ref k, order);         // Приведем ее к каноническому виду (т.е. вычет)
             second = new Polynomial(new List <int> {
                 1, k
             });                                              // Проверим на делимость
             return(false);
         }
     }
     for (int i = 1; i < order; i++)
     {
         for (int j = 0; j < order; j++)
         {
             for (int k = 0; k < order; k++)
             {
                 Polynomial current = new Polynomial(new List <int> {
                     i, j, k
                 });
                 Polynomial mod = Modulus(poly, current, order);
                 Abduction(ref mod, order);
                 if (mod == Polynomial.Zero || mod[0] == 0)
                 {
                     second = current;
                     return(false);
                 }
             }
         }
     }
     second = Polynomial.Zero;
     return(true);
 }