Как вычислить корни многочлена в списке? - PullRequest
0 голосов
/ 08 мая 2020

У меня проблемы с домашним заданием из моего университета, поэтому я решил отправить сюда помощь

Мне нужно создать список для многочленов. Это нормально:

n = int(input("Degree of polynomial: "))
p = []

for i in range(n+1):
    p.append(float(input("p["+str(i)+"]: ")))
    i += 1

Например, многочлен:

                                             5x^4+3x^3-2x^2+x-2

Имеет:

                                                  n = 4

И список обозначен как:

                                             p[] = [5, 3, -2, 1, -2]

Кроме того, я создал список со значениями, которые притворяются корнями многочлена (listPRoots, возможные корни). Эта часть также подходит:

listPRoots= []

for i in range(int(p[0])): 
    if p[0]%(i+1) == 0:
        listPRoots.append(-(i+1))
        listPRoots.append(i+1)

Как показывает код, у меня есть список со значениями, которые могут быть корнями моего полинома. Я использовал теорему о рациональных корнях, чтобы составить этот список.

Теперь я хочу взять многочлен с коэффициентами в списке (p). С помощью этого полинома я хочу проверить каждое значение в списке (называемом listPRoots), чтобы найти значения корней полинома. Когда я нахожу это значение, я хочу поместить их в новый список (называемый listIntegrerRoots). Для этого я попробовал:

listIntegrerRoots = []
listTestRoots     = []

for i in range(len(listPRoots) - 1):
    flag = len (p) - 1
    while flag > 0:
        root = (listPRoots[i]**(flag)) * p[flag]
        listTestRoots.append(root)
        flag = flag- 1
    if sum(listTestRoots)  + p[0] == 0:
        listIntegrerRoots.append(listPRoots[i])

Но я не могу получить нужный список. Например:

n = 2
p[0] = 6, p[1] = -5, p[2] = 1

приведет к:

x^2 - 5x + 6

и:

listPRoots[] = [-1, 1, -2, 2, -3, 3, -6, 6]

Я бы сделал:

listIntegrerRoots[] = [2, 3]

Потому что 2 и 3 - корни моего многочлена. Но я получаю:

listIntegrerRoots[] = []

Кто-нибудь может мне с этим помочь?

Спасибо.

1 Ответ

0 голосов
/ 08 мая 2020

Только не забывайте очищать буфер суммы listTestRoots каждый раз, когда вы проверяете новое возможное значение root.

Должно быть что-то вроде:

for i in range(len(listPRoots) - 1):
    listTestRoots = []
    ....

И с моей точки зрения, переменная накопительной суммы могла бы быть лучшим выбором.

- * Edit * -

In [23]: for i in range(len(listPRoots)):
    ...:     s = 0
    ...:     for j in range(len(p)):
    ...:         s += (listPRoots[i] ** j) * p[j]
    ...:     if s == 0:
    ...:         listIntegerRoots.append(listPRoots[i])
    ...:
    ...:
    ...:

In [24]: listIntegerRoots
Out[24]: [2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...