From a3b501cbcb27cd5124305378857f3807b14bc3b8 Mon Sep 17 00:00:00 2001 From: danielsanchezq Date: Mon, 10 Jun 2024 18:22:54 +0200 Subject: [PATCH] Finish implementing fk20 --- da/kzg_rs/fk20.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/da/kzg_rs/fk20.py b/da/kzg_rs/fk20.py index 7326950..d29a421 100644 --- a/da/kzg_rs/fk20.py +++ b/da/kzg_rs/fk20.py @@ -23,25 +23,41 @@ def toeplitz1(global_parameters: List[G1], roots_of_unity: Sequence[int], polyno assert is_power_of_two(len(global_parameters)) roots_of_unity = roots_of_unity[:2*polynomial_degree] vector_x_extended = global_parameters + [G1(0) for _ in range(len(global_parameters))] - vector_x_extended_fft = fft(vector_x_extended, BLS_MODULUS, roots_of_unity) + vector_x_extended_fft = fft(vector_x_extended, roots_of_unity, BLS_MODULUS) return vector_x_extended_fft def toeplitz2(coefficients: List[G1], roots_of_unity: Sequence[int], extended_vector: Sequence[G1]) -> List[G1]: assert is_power_of_two(len(coefficients)) - toeplitz_coefficients_fft = fft(coefficients, BLS_MODULUS, roots_of_unity) + toeplitz_coefficients_fft = fft(coefficients, roots_of_unity, BLS_MODULUS) return [v*c for v, c in zip(extended_vector, toeplitz_coefficients_fft)] -def toeplitz3(h_extended_fft: Sequence[G1], roots_of_unity: Sequence[int]) -> List[G1]: - return ifft(h_extended_fft, BLS_MODULUS, roots_of_unity) +def toeplitz3(h_extended_fft: Sequence[G1], roots_of_unity: Sequence[int], polynomial_degree: int) -> List[G1]: + return ifft(h_extended_fft, roots_of_unity, BLS_MODULUS)[:polynomial_degree] -def fk20_generate_proofs(polynomial: Polynomial) -> List[Proof]: +def fk20_generate_proofs( + polynomial: Polynomial, global_parameters: List[G1], roots_of_unity: Sequence[int] +) -> List[Proof]: + polynomial_degree = len(polynomial) + assert len(roots_of_unity) >= 2 * polynomial_degree + assert len(global_parameters) >= polynomial_degree + assert is_power_of_two(len(polynomial)) + # 1 - Build toeplitz matrix for h values # 1.1 y = dft([s^d-1, s^d-2, ..., s, 1, *[0 for _ in len(polynomial)]]) # 1.2 z = dft([*[0 for _ in len(polynomial)], f1, f2, ..., fd]) # 1.3 u = y * v * roots_of_unity(len(polynomial)*2) + global_parameters = [*global_parameters[polynomial_degree-2::-1], 0] + extended_vector = toeplitz1(global_parameters, roots_of_unity[:polynomial_degree*2], polynomial_degree) # 2 - Build circulant matrix with the polynomial coefficients (reversed N..n, and padded) + toeplitz_coefficients = [ + polynomial.coefficients[-1], *(0 for _ in range(polynomial_degree+1)), *polynomial.coefficients[1:-1] + ] + h_extended_vector = toeplitz2(toeplitz_coefficients, roots_of_unity[:len(extended_vector)], extended_vector) # 3 - Perform fft and nub the tail half as it is padding - pass \ No newline at end of file + h_vector = toeplitz3(h_extended_vector, roots_of_unity[:len(h_extended_vector)], polynomial_degree) + # 4 - proof are the dft of the h vector + proofs = fft(h_vector, roots_of_unity[:polynomial_degree], BLS_MODULUS) + return proofs