예제 #1
0
def compute_derivative_of_interpolation_polynomial(
        determinant_of_original_matrix, field_size, i_value, j_value,
        l_iterator, matrix, summation_boundary_t):
    result = 0
    # print("I: {} J: {} L: {} T: {}".format(i_value, j_value, l_iterator, summation_boundary_t))
    for k in range(j_value, summation_boundary_t + 1):
        # print("K: {}".format(k))
        # apply the formula for each k
        #
        k_term = divide((math.factorial(k) % field_size),
                        ((math.factorial(k - j_value)) % field_size),
                        field_size)
        minus_one_term = ((-1)**(l_iterator - 1 + k)) % field_size
        divided_determinant = divide(
            int(determinant(get_minor(matrix, l_iterator - 1, k), field_size)),
            determinant_of_original_matrix, field_size)
        #
        i_term = i_value**(k - j_value)
        former_result = result
        result = (result +
                  (k_term * minus_one_term * divided_determinant * i_term) %
                  field_size) % field_size
        '''
        print(result, "=", former_result, "+(", k_term, "*", minus_one_term, "*([",
              int(determinant(get_minor(matrix, l_iterator - 1, k), field_size)), "/",
              determinant(matrix, field_size), "=", divided_determinant, "])*", i_term, ")")
        '''
    return result
def compute_polynomial(x_values, y_values, k, field_size, print_statements):
    polynomials = []
    for l in range(len(x_values)):
        l_polynomial = []
        for j in range(k):
            l_k_n = 1
            equation = []
            # m: iteration index
            for m in range(k):
                # j: index for this specific lagrange coefficient
                if m != j:
                    # p = divide(x - int(x_values[m]), int(x_values[j]) - int(x_values[m]), field_size) % field_size
                    divisor = divide(1, int(x_values[j]) - int(x_values[m]), field_size)
                    equation.append(([divisor, 1], [(- int(x_values[m]) * divisor) % field_size, 0]))
                    # print("EQ:", equation)
            # print("EQ:", equation)
            try:
                tmp = equation[0]
                # print(tmp)
                for tup in range(1, k-1):
                    tmp = multiply(tmp, equation[tup], field_size)
                tmp = [[(tmp[i][0] * y_values[j]) % field_size, tmp[i][1]] for i in range(len(tmp))]
                # print(tmp)
                l_polynomial.append(tmp)
                # print("-->", l_polynomial)
            except IndexError:
                return -1
    polynomial = sum_polynomials(l_polynomial, field_size)
    if print_statements:
        print("Reconstructed polynomial:", print_function(polynomial, False))
    return polynomial
def lagrange_polynomial(j, k, x_values, x, field_size):
    l_k_n = 1
    # m: iteration index
    for m in range(k):
        # j: index for this specific lagrange coefficient
        if m != j:
            p = divide(x - int(x_values[m]), int(x_values[j]) - int(x_values[m]), field_size) % field_size
            l_k_n = (l_k_n * p) % field_size
    return l_k_n
예제 #4
0
def compute_birkhoff_coefficients_and_polynomials(
        degree_of_function, determinant_of_original_matrix, field_size,
        function_dict, matrix, person_ids, print_statements, vector_of_shares):
    for i, share in enumerate(vector_of_shares):
        # calculate birkhoff interpolation coefficient
        birkhoff_coefficient = (int(share) * (-1)**i * divide(
            (determinant(get_minor(matrix, i, 0), field_size)) % field_size,
            determinant_of_original_matrix, field_size)) % field_size
        # generate a function with the coefficient as scalar
        function_dict[person_ids[i]] = generate_function(
            degree_of_function, birkhoff_coefficient, field_size)
        if print_statements or debug:
            print("Birkhoff Coefficient a_{}_0:".format(i + 1),
                  birkhoff_coefficient, "=", share, "*(-1)**", i, "*",
                  (determinant(get_minor(matrix, i, 0), field_size)) %
                  field_size, '/', determinant_of_original_matrix)
예제 #5
0
def binomial_coefficient(n, k, field_size):
    try:
        if n == k or k == 0:
            return 1
        elif k == 1:
            return n
        else:
            return (int(
                divide((math.factorial(n) % field_size),
                       ((math.factorial(k) % field_size *
                         math.factorial(n - k) % field_size) % field_size),
                       field_size)))
    except ValueError as e:
        print(e)
        raise ValueError(
            "In binomial_coefficient: n must be bigger or equal k;\n{}".format(
                e))
예제 #6
0
def compute_interpolation_constant(i, k, participating_ids, field_size):
    gamma_i = 1
    for j in participating_ids:
        if j != i:
            gamma_i = (gamma_i * divide((k - j) % field_size, (i - j) % field_size, field_size)) % field_size
    return gamma_i