You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

42 lines
1017 B

# Primitive Root of Unity
def get_primitive_root_of_unity(F, n):
# using the method described by Thomas Pornin in
# https://crypto.stackexchange.com/a/63616
q = F.order()
for k in range(q):
if k==0:
continue
g = F(k)
# g = F.random_element()
if g==0:
continue
w = g ^ ((q-1)/n)
if w^(n/2) != 1:
return g, w
# Roots of Unity
def get_nth_roots_of_unity(n, primitive_w):
w = [0]*n
for i in range(n):
w[i] = primitive_w^i
return w
# fft (Fast Fourier Transform) returns:
# - nth roots of unity
# - Vandermonde matrix for the nth roots of unity
# - Inverse Vandermonde matrix
def fft(F, n):
g, primitive_w = get_primitive_root_of_unity(F, n)
w = get_nth_roots_of_unity(n, primitive_w)
ft = matrix(F, n)
for j in range(n):
row = []
for k in range(n):
row.append(primitive_w^(j*k))
ft.set_row(j, row)
ft_inv = ft^-1
return w, ft, ft_inv