2012-07-02 2 views
-3

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

т.е. poly(x,y,1) выведет c[0] + c[1]*x + c[2]*y

т.е. poly(x,y,2) выведет c[0] + c[1]*x + c[2]*y + c[3]*x**2 + c[4]*y**2 + c[5]*x*y

Могли бы вы дайте мне некоторые идеи? Может быть, itertools?

+2

Способ, которым написан ваш вопрос, читается как «пожалуйста, сделайте мою домашнюю работу». Вы должны действительно рассмотреть публикацию того, что вы пробовали до сих пор. – inspectorG4dget

+1

Полином двух переменных требуется двумерная матрица коэффициентов (n x n). – Kos

+0

Идеи: Треугольник поискового паскаля и как он относится к полиномиальному расширению. –

ответ

2

Вы можете попробовать начать с чем-то вроде

def poly(x,y,n): 
    counter = 0 
    for nc in range(n+1): 
     for i in range(nc+1): 
      print "c[", counter, "]", 
      print " * ", x, "**", i, 
      print " * ", y, "**", nc-i, 
      print " + ", 
      counter += 1 

Например

poly("x", "y", 2) 

будет производить

c[ 0 ] * x ** 0 * y ** 0 + c[ 1 ] * x ** 0 * y ** 1 + c[ 2 ] * x ** 1 * y ** 0 + c[ 3 ] * x ** 0 * y ** 2 + c[ 4 ] * x ** 1 * y ** 1 + c[ 5 ] * x ** 2 * y ** 0 + 

Строения в if с, если вы хотите, чтобы подавить нежелательный выход.

1

Поскольку вы хотели функциональное решение с itertools, вот один вкладыш:

import itertools as itt 
from collections import Counter 
n = 3 
xy = ("x", "y") # list of variables may be extended indefinitely 
poly = '+'.join(itt.starmap(lambda u, t: u+"*"+t if t else u, zip(map(lambda v: "C["+str(v)+"]", itt.count()),map(lambda z: "*".join(z), map(lambda x: tuple(map(lambda y: "**".join(map(str, filter(lambda w: w!=1, y))), x)), map(dict.items, (map(Counter, itt.chain.from_iterable(itt.combinations_with_replacement(xy, i) for i in range(n+1)))))))))) 

Это даст вам

C[0]+C[1]*x+C[2]*y+C[3]*x**2+C[4]*y*x+C[5]*y**2+C[6]*x**3+C[7]*y*x**2+C[8]*y**2*x+C[9]*y**3 

Примечание, порядок коэффициентов немного отличается. Это будет работать не только для любого п, но и для любого числа переменных (х, у, г, и т.д ...)

Просто для смеха

+0

Я получил смех lol –

0

Чуть более обобщенно:

from itertools import product 

def make_clause(c, vars, pows): 
    c = ['c[{}]'.format(c)] 
    vp = (['', '{}', '({}**{})'][min(p,2)].format(v,p) for v,p in zip(vars,pows)) 
    return '*'.join(c + [s for s in vp if s]) 

def poly(vars, max_power): 
    res = (make_clause(c, vars, pows) for c,pows in enumerate(product(*(range(max_power+1) for v in vars)))) 
    return ' + '.join(res) 

затем poly(['x', 'y'], 2)

"c[0] + c[1]*y + c[2]*(y**2) + c[3]*x + c[4]*x*y + c[5]*x*(y**2) + c[6]*(x**2) + c[7]*(x**2)*y + c[8]*(x**2)*(y**2)" 
Смежные вопросы