# Generation of multivariate polynomial basis with given degree

**URL:** <https://discourse.julialang.org/t/generation-of-multivariate-polynomial-basis-with-given-degree/60757>\
**Category:** New to Julia\
**Tags:** polynomials\
**Created:** [May 8, 2021, 4:47am UTC](https://discourse.julialang.org/t/generation-of-multivariate-polynomial-basis-with-given-degree/60757 "2021-05-08T04:47:51Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![iHany](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ihany/32/18151_2.png) [@iHany](https://discourse.julialang.org/u/iHany)\
**Post date:** [May 8, 2021, 4:47am UTC](https://discourse.julialang.org/t/generation-of-multivariate-polynomial-basis-with-given-degree/60757/1 "2021-05-08T04:47:51Z")

</div>

Hi,

I would like to make a multivariate polynomial with given degree.  
For example, the bivariate polynomial basis of a vector `x = [x1, y2]` with degree of 2 would be  
`x -> [1, x1, x1^2, x2, x2^2, x1*x2]`.

It seems that there are some nice packages for handling multivariate polynomials such as [MultivariatePolynomials.jl](https://github.com/JuliaAlgebra/MultivariatePolynomials.jl) but I don’t know how to create a polynomial basis functions easily.

Any thoughts?

### Notes

- [An issue](https://github.com/JuliaAlgebra/MultivariatePolynomials.jl/issues/162) is linked.

---

<div class="post-metadata">

**Author:** ![abulak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abulak/32/28314_2.png) [@abulak](https://discourse.julialang.org/u/abulak)\
**Post date:** [May 8, 2021, 6:32am UTC](https://discourse.julialang.org/t/generation-of-multivariate-polynomial-basis-with-given-degree/60757/2 "2021-05-08T06:32:14Z")

</div>

```julia
julia> using DynamicPolynomials

julia> x,y = @polyvar x y
(x, y)

julia> monomials([x,y], 2)
3-element MonomialVector{true}:
 x²
 xy
 y²

julia> monomials([x,y], 1:2)
5-element MonomialVector{true}:
 x²
 xy
 y²
 x
 y

```

---

<div class="post-metadata">

**Author:** ![iHany](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ihany/32/18151_2.png) [@iHany](https://discourse.julialang.org/u/iHany)\
**Post date:** [May 8, 2021, 6:33am UTC](https://discourse.julialang.org/t/generation-of-multivariate-polynomial-basis-with-given-degree/60757/3 "2021-05-08T06:33:20Z")

</div>

Well, I don’t wanna define `polyvar` objects in this case.

I actually find a way as follows:

```julia
using Combinatorics, Transducers

"""
n ∈ N: length of array, i.e., x ∈ Rⁿ
d ∈ N: degree
"""
function polynomial_basis(n, d; with_bias=true)
    _n = with_bias ? n+1 : n
    exponents = multiexponents(_n, d)
    return function (x)
        _x = with_bias ? [x..., 1] : x
        exponents |> Map(exponent -> prod(_x.^exponent)) |> collect
    end
end

```

---

<div class="post-metadata">

**Author:** ![abulak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abulak/32/28314_2.png) [@abulak](https://discourse.julialang.org/u/abulak)\
**Post date:** [May 8, 2021, 6:49am UTC](https://discourse.julialang.org/t/generation-of-multivariate-polynomial-basis-with-given-degree/60757/4 "2021-05-08T06:49:14Z")

</div>

so you don’t want a polynomial basis, but a function which evaluates such basis at `x`?

`MultivariatePolynomials` or `DynamicPolynomials` are more about creating and manipulating polynomial objects

---

<div class="post-metadata">

**Author:** ![kylebeggs](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kylebeggs/32/43348_2.png) [@kylebeggs](https://discourse.julialang.org/u/kylebeggs)\
**Post date:** [January 24, 2023, 2:22pm UTC](https://discourse.julialang.org/t/generation-of-multivariate-polynomial-basis-with-given-degree/60757/5 "2023-01-24T14:22:07Z")

</div>

For anyone in the future, here is a type-stable version that is also 2x faster:

```julia
using Combinatorics, Transducers

"""
n ∈ N: length of array, i.e., x ∈ Rⁿ
d ∈ N: degree
"""
function polynomial_basis(n, d; with_bias=true)
    _n = with_bias ? n+1 : n
    exponents = multiexponents(_n, d)
    return function (x)
        _x = with_bias ? vcat(x, one(eltype(x))) : x
        exponents |> Map(exponent -> prod(_x.^exponent)) |> collect
    end
end

```
