def get_points(n, galois_field): if n in cache: return cache[n] x = list(range(1, n + 1)) y = [randint(0, galois_field.modulus - 1) for i in range(1, n + 1)] points = list(zip(x, y)) omega = get_omega(galois_field, n, 1) cache[n] = x, y, points, omega return x, y, points, omega
def test_interp_extrap_cpp(galois_field, polynomial): d = randint(210, 300) y = [galois_field.random().value for i in range(d)] n = len(y) n = n if n & n - 1 == 0 else 2**n.bit_length() ys = y + [0] * (n - len(y)) omega = get_omega(galois_field, 2 * n) values = polynomial.interp_extrap_cpp(ys, omega) for a, b in zip(ys, values[0:201:2]): # verify only 100 points assert a == b
def test_interpolate_fft(galois_field, polynomial): d = randint(210, 300) y = [galois_field.random().value for i in range(d)] n = len(y) n = n if n & n - 1 == 0 else 2**n.bit_length() ys = y + [galois_field(0)] * (n - len(y)) omega = get_omega(galois_field, n) poly = polynomial.interpolate_fft(ys, omega) for i, a in zip(range(1, 201, 2), ys[1:201:2]): # verify only 100 points assert poly(pow(omega, i)) == a
def test_evaluate_fft(galois_field, polynomial): d = randint(210, 300) coeffs = [galois_field.random().value for i in range(d)] poly = polynomial(coeffs) # random polynomial of degree d n = len(poly.coeffs) n = n if n & n - 1 == 0 else 2**n.bit_length() omega = get_omega(galois_field, n) fft_result = poly.evaluate_fft(omega, n) assert len(fft_result) == n for i, a in zip(range(1, 201, 2), fft_result[1:201:2]): # verify only 100 points assert poly(pow(omega, i)) == a
def test_fft_decode(galois_field, polynomial): d = randint(210, 300) coeffs = [galois_field.random().value for i in range(d)] poly = polynomial(coeffs) n = d n = n if n & n - 1 == 0 else 2**n.bit_length() omega2 = get_omega(galois_field, 2 * n) omega = omega2**2 # Create shares and erasures zs = list(range(n)) shuffle(zs) zs = zs[:d] ys = list(poly.evaluate_fft(omega, n)) ys = [ys[i] for i in zs] as_, ais_ = fnt_decode_step1(polynomial, zs, omega2, n) prec_ = fnt_decode_step2(polynomial, zs, ys, as_, ais_, omega2, n) print("Prec_(X):", prec_) print("P(X):", poly) assert prec_.coeffs == poly.coeffs