def inverse_helper(shift, normalized): FFT = interpolate.Psi(B4, 4, B4(shift)) Polynomial.set_psi(FFT) f = Polynomial(convert([15, 12, 3, 6])) return Polynomial( FFT.inverse(FFT.transform(f.coeffs, f.msb, normalized), f.msb, normalized)), f
def brute_X(i, omega): omega = conv(omega) num = i bit = 0 # current position in binary expansion result = B4(1) while num > 0: if num % 2 == 1: # if current bit has a 1 result *= FFT.eval_s(bit, omega) # s_bit(omega) bit += 1 num //= 2 return result
def test_add(): f = Polynomial([B4(15), B4(12), B4(3), B4(6)]) g = Polynomial([B4(15), B4(12), B4(3), B4(6)]) assert (f + g == Polynomial([B4(0), B4(0), B4(0), B4(0)]))
def test_eval_p(): expected = [ B4(1), B4(1), B4(6), B4(6), B4(7), B4(7), B4(1), B4(1), B4(1), B4(1), B4(6), B4(6), B4(7), B4(7), B4(1), B4(1) ] assert ([FFT.eval_p(i) for i in range(16)] == expected)
def convert(items): return [B4(x) for x in items]
import pytest import numpy as np import interpolate from ff_factory import B4 from model.poly import Polynomial FFT = interpolate.Psi(B4, 4, B4(0)) Polynomial.set_psi(FFT) f = Polynomial([B4(15), B4(12), B4(3), B4(6)]) #### Interpolation def interpolation_helper(shift, normalized): FFT = interpolate.Psi(B4, 4, B4(shift)) Polynomial.set_psi(FFT) f = Polynomial(convert([15, 12, 3, 6])) return list(FFT.transform(f.coeffs, f.msb, normalized)) def convert(items): return [B4(x) for x in items] def test_normalized_interpolation_beta_0(): # should be f(0), f(1), f(2), f(3) (f normalized) assert (interpolation_helper(0, True) == convert([15, 3, 11, 1])) def test_normalized_interpolation_beta_7(): # should be f(7), f(6), f(5), f(4) (f normalized) assert (interpolation_helper(7, True) == convert([3, 14, 4, 15]))
def eval(omega, *args): omega = conv(omega) result = B4(0) for i in range(len(args)): result += args[i] * brute_X(i, omega) return result
def conv(omega): return omega if isinstance(omega, B4) else B4(omega)
from interpolate import * from model.poly import Polynomial import numpy as np from ff_factory import B4 from functools import reduce import operator FFT = Psi(B4, 4, B4(0)) Polynomial.set_psi(FFT) f = Polynomial(np.array([B4(15), B4(12), B4(3), B4(6)])) evals = FFT.transform(f.coeffs, f.msb, normalized=True) print('FFT', evals) print('IFFT', FFT.inverse(evals, f.msb, normalized=True)) g = np.zeros(5, dtype=B4) g[4] = B4(15) g = Polynomial(g) print('f, g', f, g) print('f * g', (f * g).coeffs) print(~B4(6)) print(f + g) def conv(omega): return omega if isinstance(omega, B4) else B4(omega) def brute_X(i, omega): omega = conv(omega)