Advertisement
Solingen

z2.1.cpp

Dec 21st, 2024
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // Функция для корректировки по модулю 5:
  5. int mod5(int x)
  6. {
  7.     return (x % 5 + 5) % 5;
  8. }
  9.  
  10. // Проверка: является ли val квадратом по модулю 5
  11. bool isSquareMod5(int val)
  12. {
  13.     val = mod5(val);
  14.     for (int r = 0; r < 5; r++)
  15.     {
  16.         if (mod5(r*r) == val) return true;
  17.     }
  18.     return false;
  19. }
  20.  
  21. // Находим корень val = r^2 (по модулю 5). Если есть, вернём любой подходящий r, иначе -1.
  22. int sqrtMod5(int val)
  23. {
  24.     val = mod5(val);
  25.     for (int r = 0; r < 5; r++)
  26.     {
  27.         if (mod5(r*r) == val) return r;
  28.     }
  29.     return -1;
  30. }
  31.  
  32. // Поиск корней квадратного уравнения
  33. // a x^2 + b x + c = 0 (mod 5)
  34. int main()
  35. {
  36.     int a, b, c;
  37.     cout << "Введите коэффициенты a, b, c (по модулю 5): ";
  38.     cin >> a >> b >> c;
  39.  
  40.     a = mod5(a);
  41.     b = mod5(b);
  42.     c = mod5(c);
  43.  
  44.     // Если a=0, это не квадратный многочлен
  45.     if (a == 0)
  46.     {
  47.         // Тогда b x + c = 0 => x = -c/b, если b != 0
  48.         if (b == 0)
  49.         {
  50.             if (c == 0) cout << "Все x - решение (тождественный 0)\n";
  51.             else cout << "Нет решений (противоречие)\n";
  52.         }
  53.         else
  54.         {
  55.             // x = -c * (b^-1)
  56.             // Найдём b^-1
  57.             int inv_b = -1;
  58.             for (int i = 1; i < 5; i++)
  59.             {
  60.                 if ((b*i) % 5 == 1) { inv_b = i; break; }
  61.             }
  62.             int xSol = mod5(-c * inv_b);
  63.             cout << "Линейный случай, корень x = " << xSol << " (mod 5)\n";
  64.         }
  65.         return 0;
  66.     }
  67.  
  68.     // Иначе квадратный случай
  69.     int D = mod5(b*b - 4*a*c);
  70.     cout << "Дискриминант = " << D << " (mod 5)\n";
  71.  
  72.     if (!isSquareMod5(D))
  73.     {
  74.         cout << "Невозможно разложить (неприводимый многочлен)\n";
  75.         return 0;
  76.     }
  77.  
  78.     // Если дискриминант - квадрат, находим его корень
  79.     // x1,2 = [ -b ± sqrt(D) ] / (2a)
  80.     int sd = sqrtMod5(D);
  81.     for (int sign = -1; sign <= 1; sign += 2)
  82.     {
  83.         int num = mod5(-b + sign*sd);
  84.         // делим на 2a => умножаем на обратный элемент (2a)
  85.         // обратный элемент для (2a) ищем перебором
  86.         int twoA = mod5(2*a);
  87.         int invTwoA = -1;
  88.         for (int i = 1; i < 5; i++)
  89.         {
  90.             if ( (twoA*i) % 5 == 1 ) { invTwoA = i; break; }
  91.         }
  92.         int root = mod5(num * invTwoA);
  93.         cout << "Корень: x = " << root << " (mod 5)\n";
  94.     }
  95.  
  96.     // Факторизация:
  97.     // Если x1 != x2, P(x) = a(x - x1)(x - x2)
  98.     // Если x1 = x2, тогда (x - x1)^2
  99.     // Вы можете самостоятельно вывести формулу, а тут просто напишем текст:
  100.     cout << "Многочлен можно записать как a*(x - x1)*(x - x2) в F5.\n";
  101.  
  102.     return 0;
  103. }
  104.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement