# How can I easily create and handle polynomials with symbolic coefficients?

I would like to create polynomial functions with symbolic (yet unknown) coefficients, like:

```
p(x)=a*x^5 + b*x^4 + c*x^3 + d*x^2+e*x+f
```

Then I would like to experiment with the degree and thus the number of coefficients, for example:

```
p(x)=a*x^7 + b*x^6 + c*x^5 + d*x^4+e*x^3+f*x^2+g*x+h
```

The problem is I always have to explicitely declare the coefficients, as variables, like:

```
var("a b c d e f g h")
```

So I should always have to enumerate them by hand.

Isn't exist some automatism to do this? For example:

```
Polynomial(x,degree=7)
```

and it would return

```
c0*x^7 + c1*x^6 + c2*x^5 + c3*x^4+c4*x^3+c5*x^2+c6*x+c7
```

Sometimes I also would like to query the coefficients, to solve an equation system, which contains those coefficients:

```
p(x)=a*x^7 + b*x^6 + c*x^5 + d*x^4+e*x^3+f*x^2+g*x+h
eq=[
derivative(p(x),x).subs(x=0)==0,
derivative(p(x),x,2).subs(x=0)==0,
p(x=0)==0,
p(x=x0)==1,
p(x=1)==1+z,
derivative(p(x),x).subs(x=1)==0,
derivative(p(x),x,2).subs(x=1)==0,
derivative(p(x),x).subs(x=x0)==1
]
s=solve(eq,a,b,c,d,e,f,g,h)
```

Again, when calling solve(), I have to explicitly enumerate the coefficients again, instead of some shortcut, like:

```
s=solve(eq,p(x).coefficients())
```

When I try to experiment with the degree of my polynomial p(x), to try out a higher or lower degree, and with more or less equations in the system, I always have to declare my coefficients as vars again and again, which is very annoying.

Furthermore when I tried to query coefficients by, eg.:

```
p.coefficient(x)
```

or

```
p.coefficient(x^3)
```

The first returns "g" as the coefficient, which is good. But how can I access or query the "free" coefficient, "h" which isn't multiplied by x?

```
p.coefficient(0)
```

Doesn't return anything. If it would return the free coeff, then I could get the coefficients by calling a map() with lambda function.