Exemplo n.º 1
0
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