Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include "string.h" // ваша библиотека
- #include "array.h" // ваша библиотека
- using namespace std;
- int mod5(int x)
- {
- return (x % 5 + 5) % 5;
- }
- int inv5(int x)
- {
- x = mod5(x);
- for(int i = 1; i < 5; i++)
- if ((x * i) % 5 == 1) return i;
- return -1;
- }
- bool isSquareMod5(int x)
- {
- x = mod5(x);
- for (int r = 0; r < 5; r++)
- if (mod5(r*r) == x) return true;
- return false;
- }
- int sqrtMod5(int x)
- {
- x = mod5(x);
- for (int r = 0; r < 5; r++)
- if (mod5(r*r) == x) return r;
- return -1;
- }
- // Функция факторизации
- String factorQuadratic(int a, int b, int c)
- {
- // Соберём результат в String
- String msg;
- // Нормализуем
- a = mod5(a);
- b = mod5(b);
- c = mod5(c);
- // Проверяем a=0
- if (a == 0)
- {
- if (b == 0)
- {
- if (c == 0)
- msg = "Любой x (тождество 0=0)";
- else
- msg = "Нет решений (противоречие)";
- return msg;
- }
- // Иначе линейно
- int ib = inv5(b);
- if (ib == -1)
- {
- msg = "Нет решения: b=0 по модулю 5";
- return msg;
- }
- int root = mod5(-c * ib);
- msg = "Линейный случай, x=";
- // Конкатенация:
- msg = msg + to_string(root).c_str();
- return msg;
- }
- // Квадратный случай
- int D = mod5(b*b - 4*a*c);
- if (!isSquareMod5(D))
- {
- msg = "Неприводим над F5";
- return msg;
- }
- int sd = sqrtMod5(D);
- int i2a = inv5(mod5(2*a));
- if (i2a == -1)
- {
- msg = "Нет обратного к 2a!";
- return msg;
- }
- int r1 = mod5(mod5(-b + sd) * i2a);
- int r2 = mod5(mod5(-b - sd) * i2a);
- // Формируем строку
- if (r1 == r2)
- {
- msg = "(x - ";
- msg = msg + to_string(r1).c_str();
- msg = msg + ")^2";
- }
- else
- {
- msg = "(x - ";
- msg = msg + to_string(r1).c_str();
- msg = msg + ")(x - ";
- msg = msg + to_string(r2).c_str();
- msg = msg + ")";
- }
- return msg;
- }
- int main()
- {
- // Допустим, хотим разложить несколько многочленов сразу
- // Сохраним их коэффициенты в Array<int>
- Array<int> polys;
- // Вводим количество
- int n;
- cout << "Сколько многочленов? ";
- cin >> n;
- // Каждые 3 числа (a,b,c) - один многочлен
- for (int i = 0; i < n; i++)
- {
- cout << "Введите a,b,c для многочлена #" << i << ": ";
- int a, b, c;
- cin >> a >> b >> c;
- polys.append(a);
- polys.append(b);
- polys.append(c);
- }
- // Теперь обрабатываем
- for (int i = 0; i < n; i++)
- {
- int a = polys[i*3 + 0];
- int b = polys[i*3 + 1];
- int c = polys[i*3 + 2];
- String result = factorQuadratic(a, b, c);
- cout << "Многочлен " << i << ": ";
- cout << a << "x^2 + " << b << "x + " << c << " => " << result << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement