Let's have the polynomial
p(x)=a0+a1⋅x+...+an−1⋅xn−1
and the domain
{1,ω,ω2,...,ωn−1}.
That means we are only interested in the evaluations of the polynomial
at the points of this domain. This is the case for example in
Plonk.
For a polynomial, FFT
enables us to efficiently move between the coefficient form and its evaluations (between
aande).
Switching between the two forms is useful because it enables
for example a simple division of polynomials − it takes time to divide
a polynomial by a polynomial, but if we only do it at the points
of our domain, there are only
n
simple divisions (dividing a field element by a field element).
So, if we need to divide
p
by the polynomial
xn−1,
we just divide the values in the vector
e
by the values
1n−1,ωn−1,ω2n−1,...,ω(n−1)n−1.
Not really.
The element
ω
is of the order
n,
so for every integer
i
it holds:
ωin−1=0
We cannot divide by zero.
We can get around this problem though, we just need to
move into the coset domain.
Now we can divide
p(z),p(zw),p(zw2),...,p(zwn−1)
by the values
zn−1,znωn−1,znω2n−1,...,znωn−1−1
because these values are not zero.
We obtain the polynomial
xn−1p(x)
evaluated at
n
points:
z,zω,zω2,...,zωn−1.
Now, we can use the FFT to switch back to the coefficient form of
xn−1p(x).
We can make things even more efficient by choosing
z
such that
z3=1.
This way we operate with only three values:
z,z2,1.
For example,
az
becomes: