Класс Poly нужен для представления и работы с многочленами. Многочлен представляется в виде списков коэффициентов. Индекс коэффициента соответствует степени одночлена, которому он соответствует.
Коэффициенты многочлена могут быть одного из следующих типов: int, float, Fraction. Допускаются многочлены с коэффициентами смешанных типов.
Конструктор __init__ может принимать следующие аргументы:
Выводит представление многочлена.
Символ | Unicode-код, в десятичной системе |
x0 | 8304 |
x1 | 185 |
x2 | 178 |
x3 | 179 |
x4-x9 | 8308-8313 |
Сложение объектов класса Poly
Необходимо реализовать все методы сложения и вычитания многочленов, сложение и вычитание многочленов и чисел.
Должны быть определены операторы “+” для операндов типа Poly, int, float, Fraction, при этом хотя бы один операнд имеет тип Poly.
Должен быть определен оператор “+=” для левого операнда типа Poly, правого операнда типа Poly, int, float, Fraction.
Вычитание объектов класса Poly
Необходимо реализовать все методы вычитания многочленов, умножение многочленов и чисел.
Должны быть определены операторы “-” для операндов типа Poly, int, float, Fraction, при этом хотя бы один операнд имеет тип Poly.
Должен быть определен оператор “-=” для левого операнда типа Poly, правого операнда типа Poly, int, float, Fraction.
Умножение объектов класса Poly
Необходимо реализовать все методы умножения многочленов, умножение многочленов и чисел.
Должны быть определены операторы “*” для операндов типа Poly, int, float, Fraction, при этом хотя бы один операнд имеет тип Poly.
Должен быть определен оператор “*=” для левого операнда типа Poly, правого операнда типа Poly, int, float, Fraction.
Деление объектов класса Poly
Необходимо реализовать деление многочленов с остатком. Операция деления многочленов с остатком работает только для многочленов с коэффициентами типа int и Fraction (оба многочлена, и делимое, и делитель должны иметь целочисленные или рациональные коэффициенты). Действительные числа в качестве коэффициентов многочленов пока не рассматриваются.
Пусть даны два многочлена A и B. При делении многочлена A на многочлен B получается два многочлена Q (частное) и R (остаток) такие, что A = Q * B + R, при этом deg(R) < deg(B). Для нахождения частного и остатка используется алгоритм деления “в столбик”.
Необходимо реализовать:
метод __divmod__(self, other) - возвращает кортеж из двух элементов: частного и остатка. Для вызова используется divmod(a, b).
метод __rdivmod__(self, other)
Должны быть определены операторы “//” и “%” для операндов типа Poly, int, float, Fraction, при этом хотя бы один операнд имеет тип Poly.
Должен быть определен операторы “//=” и “%=” для левого операнда типа Poly, правого операнда типа Poly, int, float, Fraction.
Возведение в степень
Необходимо реализовать алгоритм быстрого возведения многочлена в степень. Показатель степени - целое неотрицательное число.
Должен быть определены операторы “**” для левого операнда типа Poly, правого операнда типа int (при этом неотрицательное).
Должен быть определен оператор “**=” для левого операнда типа Poly, правого операнда типа int.
Вычисление значение многочлена в точке
Необходимо реализовать функцию вычисления значения выражения в точке x. Если P - объект класса Poly, x - объект типа int, float, Fraction, то вычисление многочлена в точке x производится при помощи перегруженной операции P | x.
Для перегрузки операции P | x нужно определить метод __or__ класса Poly. Левый операнд имеет тип Poly, правый операнд: тип int, float, Fraction.
Значение многочлена в точке должно вычисляться по схеме Горнера.
Определение длины многочлена и доступ к коэффициентам
Необходимо реализовать функцию определение длины многочлена len(P) и возможности чтения и изменения коэффициентов по индексу P[i].
Для определения длины объекта необходимо определить метод __len__(self). Данный метод должен возвращать длину списка коэффициентов, т.е. степень многочлена + 1.
Для возможности чтения значения коэффициента многочлена P[i] необходимо определить метод P.__getitem__(self, i). Если значение i некорректно, необходимо генерировать исключение IndexError при помощи инструкции raise IndexError(). Исключение IndexError необходимо генерировать и в случае, когда i < 0.
Для возможности присваивания коэффициенту многочлена нового значения val необходимо определить метод P.__setitem__(self, i, val). При этом если i >= len(P) необходимо “расширить” список коэффициентов до нужного значения, при i < 0 необходимо генерировать исключение IndexError.
Композиция многочленов
Необходимо реализовать операцию композиции многочленов: если P и Q - объекты класса Poly, то P(Q) должно возвращать объект класса Poly, являющийся композицией многочленов.
Для этого необходимо перегрузить определить метод __call__(self, x). Если P - объект класса Poly, то при использовании объекта P, как вызова функции P(x) будет вызван метод P.__call__(x).
Метод P.__call__(x) должен возвращать значение многочлена в точке x, если x является объектом классов int, float, Fraction, если x является объектом класса Poly, то метод __call__ должен возвращать композицию многочленов.