Advertisement
Solingen

z2.2.cpp

Dec 21st, 2024
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int mod5(int x)
  5. {
  6.     return (x % 5 + 5) % 5;
  7. }
  8.  
  9. int inv5(int x)
  10. {
  11.     // Поиск обратного элемента к x (mod 5)
  12.     // x * inv = 1 (mod 5)
  13.     x = mod5(x);
  14.     for (int i = 1; i < 5; i++)
  15.     {
  16.         if ((x * i) % 5 == 1) return i;
  17.     }
  18.     return -1; // если не нашли
  19. }
  20.  
  21. bool isSquareMod5(int x)
  22. {
  23.     x = mod5(x);
  24.     for (int r = 0; r < 5; r++)
  25.         if (mod5(r*r) == x) return true;
  26.     return false;
  27. }
  28.  
  29. int sqrtMod5(int x)
  30. {
  31.     x = mod5(x);
  32.     for (int r = 0; r < 5; r++)
  33.         if (mod5(r*r) == x) return r;
  34.     return -1;
  35. }
  36.  
  37. // Функция factorQuadratic: раскладывает ax^2 + bx + c (mod 5)
  38. // Возвращает строку вида: "Не раскладывается" или "(x - r1)(x - r2)"
  39. string factorQuadratic(int a, int b, int c)
  40. {
  41.     a = mod5(a);
  42.     b = mod5(b);
  43.     c = mod5(c);
  44.  
  45.     if (a == 0)
  46.     {
  47.         // Линейный случай
  48.         if (b == 0)
  49.         {
  50.             if (c == 0) return "0 = 0, любой x";
  51.             else        return "Нет решений";
  52.         }
  53.         int ib = inv5(b);
  54.         if (ib == -1) return "Нет решений (b=0 в F5)";
  55.         int root = mod5(-c * ib);
  56.         return "Линейно: (x - " + to_string(root) + ")";
  57.     }
  58.  
  59.     int D = mod5(b*b - 4*a*c);
  60.     if (!isSquareMod5(D)) return "Неприводим над F5";
  61.  
  62.     int sd = sqrtMod5(D);
  63.     int i2a = inv5(mod5(2*a));
  64.     if (i2a == -1) return "Обратный элемент к 2a не найден";
  65.  
  66.     // Первый корень
  67.     int r1 = mod5( mod5(-b + sd) * i2a );
  68.     // Второй корень
  69.     int r2 = mod5( mod5(-b - sd) * i2a );
  70.  
  71.     if (r1 == r2)
  72.     {
  73.         return "(x - " + to_string(r1) + ")^2";
  74.     }
  75.     else
  76.     {
  77.         return "(x - " + to_string(r1) + ")(x - " + to_string(r2) + ")";
  78.     }
  79. }
  80.  
  81. int main()
  82. {
  83.     int a, b, c;
  84.     cout << "Введите a, b, c в F5: ";
  85.     cin >> a >> b >> c;
  86.     string result = factorQuadratic(a, b, c);
  87.     cout << result << endl;
  88.     return 0;
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement