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

У меня есть эти проблемы с полиномами, и я потратил на это около 4 часов, но я просто не могу их понять. Я новичок в Python и программировании, и я пытался решить это на бумаге, но я просто не знаю.

  1. Напишите и протестируйте функцию Python negate(p), которая инвертирует полином, представленный списком его коэффициентов p, и возвращает новый полином (представленный в виде списка). Другими словами, напишите функцию, которая делает список чисел отрицательным.

  2. Напишите функцию Python eval_polynomial(p, x), которая возвращает значение P(x), где P — полином, представленный списком его коэффициентов p. Например, eval_polynomial([1, 0, 3], 2) должно возвращать 1*2^2 + 0*2 + 3 = 7. Используйте один цикл while.

  3. Напишите и протестируйте функцию multiply_by_one_term(p, a, k), которая умножает заданный многочлен p, представленный списком коэффициентов, на ax^k и возвращает произведение в виде нового списка.

Я был бы очень признателен, если бы кто-то мог мне помочь.


person confusedstudent    schedule 07.08.2013    source источник
comment
Запустите оболочку Python и попробуйте эти примеры здесь: docs.python.org/ 2/учебник/   -  person Anycorn    schedule 07.08.2013
comment
Случай 2: возвращаемое значение лучше сказать 1 * 2 ** 2 + 0 * 2 ** 1 + 3 * 2 ** 0 в python...   -  person Antti Haapala    schedule 07.08.2013
comment
В дополнение к комментарию @Anycorn используйте блокнот ipython или ipython.   -  person Shashank Agarwal    schedule 07.08.2013


Ответы (2)


Я бы рекомендовал использовать numpy.poly1d и numpy.polymul, где коэффициенты равны a0*x2 + a1*x + a2.

Например, чтобы представить 3*x**2 + 2*x + 1:

p1 = numpy.poly1d([3,2,1])

И с получившимся объектом poly1d вы можете работать, используя *, / и так далее...:

print(p1*p1)
#   4      3      2
#9 x + 12 x + 10 x + 4 x + 1

Если вы хотите построить свои собственные функции, предполагая, что p содержит коэффициенты по порядку: a0 + a1*x + a2*x**2 + ...:

def eval_polynomial(p,x):
    return sum((a*x**i for i,a in enumerate(p)))

def multiply_by_one_term(p, a, k):
    return [0]*k + [a*i for i in p]

Примечание

В моей функции оценки используются экспоненты, которых можно избежать с помощью правила Хорнера, как указано в другом ответе, который доступен в функции polyval Numpy.

person Saullo G. P. Castro    schedule 07.08.2013
comment
У меня пока недостаточно репутации, но я бы проголосовал за вас. Я действительно понял логику ваших решений. - person confusedstudent; 08.08.2013
comment
@confusedstudent здорово, что ты понял эту логику - person Saullo G. P. Castro; 09.09.2017
comment
Это решение, хотя и ясное в своем подходе, заметно неэффективно. Пожалуйста, рассмотрите возможность использования правила Хорнера, чтобы избежать вызова экспоненты на каждой итерации. Я полагаю, я должен опубликовать это как ответ. - person fearless_fool; 05.11.2018

Вместо этого используйте метод Хорнера!

Для многочленов следует использовать метод Хорнера. Его главная особенность заключается в том, что для вычисления многочлена порядка N требуется только N умножений и N сложений — никаких экспонент:

def eval_polynomial(P, x):
    '''
    Compute polynomial P(x) where P is a vector of coefficients, highest
    order coefficient at P[0].  Uses Horner's Method.
    '''
    result = 0
    for coeff in P:
        result = x * result + coeff
    return result

>>> eval_poly([1, 0, 3], 2)
7

Вы можете работать с ним вручную или перейти по ссылке, чтобы увидеть, как это работает.

person fearless_fool    schedule 03.11.2018
comment
Хорошее решение для оценки полиномов, хотя можно использовать поливал Numpy - person Saullo G. P. Castro; 04.11.2018
comment
numpy великолепен, но OP должен был написать функцию. И есть много случаев, когда вы хотели бы оценить полином, не перетаскивая все numpy. - person fearless_fool; 05.11.2018