Как выполнить полиномиальное сложение и умножение с помощью python 3.x?

Например, 3x^4 - 17x^2 - 3x + 5. Каждый член многочлена можно представить в виде пары целых чисел (коэффициент, показатель степени). то есть [(3,4),(-17,2), (-3,1), (5,0)]

У нас есть следующие ограничения, гарантирующие, что каждый многочлен имеет уникальное представление:

  • Термины отсортированы в порядке убывания степени
  • Ни один термин не имеет нулевого коэффициента
  • Нет двух членов с одинаковым показателем
  • Показатели всегда неотрицательны

Напишите функции Python для следующих операций:

addpoly(p1,p2)
multpoly(p1,p2)

Некоторые примеры:

>>> addpoly( [(4,3),(3,0)], [(-4,3),(2,1)] )
[(2, 1),(3, 0)]

Объяснение: (4x^3 + 3) + (-4x^3 + 2x) = 2x + 3

>>> addpoly( [(2,1)], [(-2,1)] )
[]

Объяснение: 2x + (-2x) = 0

>>> multpoly( [(1,1),(-1,0)], [(1,2),(1,1),(1,0)] )
[(1, 3),(-1, 0)]

Объяснение: (x - 1) * (x^2 + x + 1) = x^3 - 1


person Sandeep Kumar    schedule 24.02.2017    source источник
comment
Если вам разрешено использовать библиотеку, просто используйте sympy. Нет необходимости изобретать велосипед   -  person user2341726    schedule 03.08.2017
comment
@ user2341726: OP попросили реализовать: написать функции Python для addpoly, multpoly   -  person smci    schedule 16.09.2018


Ответы (1)


Вы хотите определить функцию, которая принимает произвольное количество аргументов формы

[(4,3),(3,0)], [(-4,3),(2,1)]

addpoly можно легко сделать с помощью collections.defaultdict:

from collections import defaultdict

def addpoly(*polynoms):
    result = defaultdict(int)
    for polynom in polynoms:
        for factor, exponent in polynom:
            result[exponent] += factor
    return [(coeff, exponent) for exponent, coeff in result.items() if coeff]
In [68]: addpoly([(4,3),(3,0)],[(-4,3),(2,1)])
Out[68]: [(3, 0), (2, 1)]
person Sebastian Wozny    schedule 24.02.2017
comment
Я просто использовал числа с плавающей запятой, потому что технически показатели могут быть числами с плавающей запятой. Если мой ответ ответил на ваш вопрос, пожалуйста, примите его. - person Sebastian Wozny; 24.02.2017
comment
Этот код печатает даже те элементы, которые имеют нулевую степень. вместо этого нам нужен пустой список. компилятор показывает: когда ввод addpoly([(4,3),(3,0)],[(-4,3),(2,1)]) Ожидаемый результат: [(2, 1), (3 , 0)] Фактический вывод [(0, 3), (1, 2), (3, 0)] и в другом случае: когда ввод addpoly([(2,1)],[(-2,1) ]) Ожидаемый результат [] Фактический результат [(1, 0)] - person Sandeep Kumar; 24.02.2017
comment
Я очень извиняюсь за мои частые правки. Я здесь новичок :) спасибо за вашу поддержку! - person Sandeep Kumar; 24.02.2017
comment
Я понимаю, что нужно сделать... но не могу найти способ сделать это. Можете ли вы взглянуть на 2-й комментарий и посмотреть, как мы можем решить проблему с выходом... - person Sandeep Kumar; 24.02.2017
comment
Я изменил свой код, чтобы сделать это, в последней строке есть if factor - person Sebastian Wozny; 24.02.2017
comment
Если мой ответ ответил на ваш вопрос, пожалуйста, примите его. - person Sebastian Wozny; 25.02.2017
comment
Должен быть принятый ответ. В чем причина использования defaultdict? Будет ли работать простой дикт? - person Evgeny; 16.09.2018