I'm reading things about RLWE (Ring Learning With Errors) cryptography, and it relies heavily on polynomial multiplication modulo something. There's this line of code from Microsoft's SEAL RLWE library called
dyadic_product_coeffmod(
u.get() + i * coeff_count, public_key.data().data(j) + i * coeff_count, coeff_count,
coeff_modulus[i], destination.data(j) + i * coeff_count);
It looks like it multiplies 2 polynomials using the dyadic product. However, looking at the code, it looks like it's doing simply $a_i*b_i$ where $a_i$ and $b_i$ are the polynomial coefficients.
What is happening?
PS: the polynomials coefficients might be in RNS form
Best Answer
They are using a number theoretic transform (NTT) and the convolution property to replace polynomial multiplication (convolution of coefficients of the two polynomials you are multiplying) by termwise product in the Fourier domain.
NTT is a special case of Fourier (DFT) https://en.m.wikipedia.org/wiki/Discrete_Fourier_transform_(general). It has no rounding, it is exact, very important here.
Such a transform exists when a primitive root of unity of the right order exists. See p.2 of this paper for an RWLE example.
Edit: Dyadic product is simply the term used in the SEAL manual to denote the termwise product in the Fourier (NTT) domain. So if the NTT coefficients are in the lists $(a(\lambda)),(b(\lambda))$ the dyadic product is the list $(a(\lambda) b(\lambda)).$
This is a somewhat unusual use of that term.