def BU(A, B, P): #radix-2 butterfly unit tmp_ay = np.zeros((1, 2), dtype=int) #tmp_array tmp_a = Mod.AddMod(A, B, P) tmp_b = Mod.SubMod(A, B, P) tmp_ay[0][0] = tmp_a #a+b tmp_ay[0][1] = tmp_b #a-b return tmp_ay
def NTT(x,ROU,prime,n,inverse): #output is a numpy array IN = Mod.InvMod(n,prime) # calculate inverse multiplication of n x = x % prime y_list = [] for i in range(n): acm = 0 #accumlation for j in range(n): exp = Mod.MulMod(i,j,n) #calculates power of i*j tmp = Mod.ExpMod(ROU,exp,prime) #calculates w^(i*j) tmp = Mod.MulMod(x[j],tmp,prime) #calculate x[j]w^(ij) acm = Mod.AddMod(acm,tmp,prime) y_list.append(acm) y = np.array(y_list) if(inverse == 1): y = y * IN y = y % prime return y