Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- // Функция для корректировки по модулю 5:
- int mod5(int x)
- {
- return (x % 5 + 5) % 5;
- }
- // Проверка: является ли val квадратом по модулю 5
- bool isSquareMod5(int val)
- {
- val = mod5(val);
- for (int r = 0; r < 5; r++)
- {
- if (mod5(r*r) == val) return true;
- }
- return false;
- }
- // Находим корень val = r^2 (по модулю 5). Если есть, вернём любой подходящий r, иначе -1.
- int sqrtMod5(int val)
- {
- val = mod5(val);
- for (int r = 0; r < 5; r++)
- {
- if (mod5(r*r) == val) return r;
- }
- return -1;
- }
- // Поиск корней квадратного уравнения
- // a x^2 + b x + c = 0 (mod 5)
- int main()
- {
- int a, b, c;
- cout << "Введите коэффициенты a, b, c (по модулю 5): ";
- cin >> a >> b >> c;
- a = mod5(a);
- b = mod5(b);
- c = mod5(c);
- // Если a=0, это не квадратный многочлен
- if (a == 0)
- {
- // Тогда b x + c = 0 => x = -c/b, если b != 0
- if (b == 0)
- {
- if (c == 0) cout << "Все x - решение (тождественный 0)\n";
- else cout << "Нет решений (противоречие)\n";
- }
- else
- {
- // x = -c * (b^-1)
- // Найдём b^-1
- int inv_b = -1;
- for (int i = 1; i < 5; i++)
- {
- if ((b*i) % 5 == 1) { inv_b = i; break; }
- }
- int xSol = mod5(-c * inv_b);
- cout << "Линейный случай, корень x = " << xSol << " (mod 5)\n";
- }
- return 0;
- }
- // Иначе квадратный случай
- int D = mod5(b*b - 4*a*c);
- cout << "Дискриминант = " << D << " (mod 5)\n";
- if (!isSquareMod5(D))
- {
- cout << "Невозможно разложить (неприводимый многочлен)\n";
- return 0;
- }
- // Если дискриминант - квадрат, находим его корень
- // x1,2 = [ -b ± sqrt(D) ] / (2a)
- int sd = sqrtMod5(D);
- for (int sign = -1; sign <= 1; sign += 2)
- {
- int num = mod5(-b + sign*sd);
- // делим на 2a => умножаем на обратный элемент (2a)
- // обратный элемент для (2a) ищем перебором
- int twoA = mod5(2*a);
- int invTwoA = -1;
- for (int i = 1; i < 5; i++)
- {
- if ( (twoA*i) % 5 == 1 ) { invTwoA = i; break; }
- }
- int root = mod5(num * invTwoA);
- cout << "Корень: x = " << root << " (mod 5)\n";
- }
- // Факторизация:
- // Если x1 != x2, P(x) = a(x - x1)(x - x2)
- // Если x1 = x2, тогда (x - x1)^2
- // Вы можете самостоятельно вывести формулу, а тут просто напишем текст:
- cout << "Многочлен можно записать как a*(x - x1)*(x - x2) в F5.\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement