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
示例#2
0
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]))
示例#7
0
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
示例#8
0
def conv(omega):
    return omega if isinstance(omega, B4) else B4(omega)
示例#9
0
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)