2016-03-07 10 views
5

Есть ли встроенная функция в максимумах, чтобы получить из полиномиальной функции список с его коэффициентами? А чтобы получить степень полинома?Коэффициенты максимумов многочленов

Самая подобная функция, которую я нашел, это args, но она также возвращает переменную вместе с коэффициентом. Я мог бы принять это, еще больше при использовании length вместе с args вернул бы степень. Проблема в том, что args не работает с полиномами нулевой степени.

Есть ли другая функция, которая лучше подходит для этих целей? Заранее спасибо.

ответ

7

Чтобы вычислить степень полинома в одной переменной, вы можете использовать функцию hipow.

(%i) p1 : 3*x^5 + x^2 + 1$ 
(%i) hipow(p1,x); 
(%o)        5 

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

(%i) p2 : 4*y^8 - 3*x^5 + x^2 + 1$ 
(%i) degree(p) := if integerp(p) then 0 else 
      lmax(map (lambda([u], hipow(p,u)),listofvars(p)))$ 
(%i) degree(p1); 
(%o)        5 
(%i) degree(p2); 
(%o)        8 
(%i) degree(1); 
(%o)        0 

coeff функция возвращает коэффициент x^n, учитывая coeff(p,x,n), так, чтобы создать список коэффициентов полинома от одной переменной, мы можем перебирать степеням х, сохраняя коэффициенты в списке.

(%i) coeffs1(p,x) := block([l], l : [], 
         for i from 0 thru hipow(p,x)  
          do (l : cons(coeff(p,x,i),l)), l)$ 
(%i) coeffs1(p1,x); 
(%o)      [3, 0, 0, 1, 0, 1] 

И создать список коэффициентов полинома в более чем одной переменной, карта coeffs1 над listofvars.

(%i) coeffs(p) := map(lambda([u], coeffs1(p, u)), listofvars(p))$ 
(%i) coeffs(p2); 
(%o) [[- 3, 0, 0, 1, 0, 4 y^8 + 1], 
     [4, 0, 0, 0, 0, 0, 0, 0, - 3 x^5 + x^2 + 1]] 
+0

Ваша степень только макс-хипоу, но не максимальная мономиальная степень. Позднее можно было бы, например, дать степень (x^2 * y-x) = 3. –