longfellow 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +152 -0
- data/ext/longfellow/CMakeLists.txt +76 -0
- data/ext/longfellow/extconf.rb +77 -0
- data/lib/longfellow/attribute.rb +65 -0
- data/lib/longfellow/c.rb +105 -0
- data/lib/longfellow/errors.rb +78 -0
- data/lib/longfellow/version.rb +5 -0
- data/lib/longfellow/zk_spec.rb +40 -0
- data/lib/longfellow.rb +162 -0
- data/sig/longfellow.rbs +74 -0
- data/vendor/longfellow-zk/LICENSE +203 -0
- data/vendor/longfellow-zk/lib/algebra/blas.h +121 -0
- data/vendor/longfellow-zk/lib/algebra/bogorng.h +68 -0
- data/vendor/longfellow-zk/lib/algebra/compare.h +40 -0
- data/vendor/longfellow-zk/lib/algebra/convolution.h +219 -0
- data/vendor/longfellow-zk/lib/algebra/crt.cc +42 -0
- data/vendor/longfellow-zk/lib/algebra/crt.h +299 -0
- data/vendor/longfellow-zk/lib/algebra/crt_convolution.h +114 -0
- data/vendor/longfellow-zk/lib/algebra/crt_test.cc +371 -0
- data/vendor/longfellow-zk/lib/algebra/fft.h +104 -0
- data/vendor/longfellow-zk/lib/algebra/fft_interpolation.h +304 -0
- data/vendor/longfellow-zk/lib/algebra/fft_interpolation_test.cc +168 -0
- data/vendor/longfellow-zk/lib/algebra/fft_test.cc +257 -0
- data/vendor/longfellow-zk/lib/algebra/fp.h +59 -0
- data/vendor/longfellow-zk/lib/algebra/fp2.h +240 -0
- data/vendor/longfellow-zk/lib/algebra/fp24.h +342 -0
- data/vendor/longfellow-zk/lib/algebra/fp24_6.h +305 -0
- data/vendor/longfellow-zk/lib/algebra/fp24_6_test.cc +197 -0
- data/vendor/longfellow-zk/lib/algebra/fp2_test.cc +280 -0
- data/vendor/longfellow-zk/lib/algebra/fp_generic.h +533 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p128.h +91 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p256.h +68 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p256k1.h +123 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p384.h +65 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p521.h +62 -0
- data/vendor/longfellow-zk/lib/algebra/fp_test.cc +522 -0
- data/vendor/longfellow-zk/lib/algebra/hash.h +39 -0
- data/vendor/longfellow-zk/lib/algebra/interpolation.h +117 -0
- data/vendor/longfellow-zk/lib/algebra/interpolation_test.cc +74 -0
- data/vendor/longfellow-zk/lib/algebra/limb.h +153 -0
- data/vendor/longfellow-zk/lib/algebra/limb_test.cc +75 -0
- data/vendor/longfellow-zk/lib/algebra/nat.cc +32 -0
- data/vendor/longfellow-zk/lib/algebra/nat.h +212 -0
- data/vendor/longfellow-zk/lib/algebra/nat_test.cc +183 -0
- data/vendor/longfellow-zk/lib/algebra/nussbaumer.h +400 -0
- data/vendor/longfellow-zk/lib/algebra/nussbaumer_test.cc +138 -0
- data/vendor/longfellow-zk/lib/algebra/nussbaumerfp2_test.cc +139 -0
- data/vendor/longfellow-zk/lib/algebra/permutations.h +79 -0
- data/vendor/longfellow-zk/lib/algebra/poly.h +240 -0
- data/vendor/longfellow-zk/lib/algebra/poly_test.cc +123 -0
- data/vendor/longfellow-zk/lib/algebra/reed_solomon.h +150 -0
- data/vendor/longfellow-zk/lib/algebra/reed_solomon_extension.h +108 -0
- data/vendor/longfellow-zk/lib/algebra/reed_solomon_extension_test.cc +76 -0
- data/vendor/longfellow-zk/lib/algebra/reed_solomon_test.cc +473 -0
- data/vendor/longfellow-zk/lib/algebra/rfft.h +400 -0
- data/vendor/longfellow-zk/lib/algebra/rfft_test.cc +102 -0
- data/vendor/longfellow-zk/lib/algebra/static_string.h +29 -0
- data/vendor/longfellow-zk/lib/algebra/sysdep.h +495 -0
- data/vendor/longfellow-zk/lib/algebra/sysdep_test.cc +41 -0
- data/vendor/longfellow-zk/lib/algebra/twiddle.h +59 -0
- data/vendor/longfellow-zk/lib/algebra/utility.h +86 -0
- data/vendor/longfellow-zk/lib/algebra/utility_test.cc +86 -0
- data/vendor/longfellow-zk/lib/arrays/affine.h +56 -0
- data/vendor/longfellow-zk/lib/arrays/affine_test.cc +220 -0
- data/vendor/longfellow-zk/lib/arrays/dense.h +210 -0
- data/vendor/longfellow-zk/lib/arrays/eq.h +75 -0
- data/vendor/longfellow-zk/lib/arrays/eqs.h +137 -0
- data/vendor/longfellow-zk/lib/arrays/eqs_test.cc +151 -0
- data/vendor/longfellow-zk/lib/arrays/sparse.h +192 -0
- data/vendor/longfellow-zk/lib/cbor/host_decoder.h +323 -0
- data/vendor/longfellow-zk/lib/cbor/host_decoder_test.cc +541 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor.h +594 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_byte_decoder.h +150 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_byte_decoder_test.cc +147 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_constants.h +27 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_pluck.h +110 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_pluck_test.cc +55 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_test.cc +174 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_testing.h +98 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_witness.h +312 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/mso2_test.cc +662 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/mso_test.cc +485 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/scan.h +104 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/scan_test.cc +137 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor.h +640 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_byte_decoder.h +150 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_byte_decoder_test.cc +147 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_constants.h +27 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_testing.h +99 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_witness.h +319 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/lexer_test.cc +120 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/mdoc_examples_test.cc +89 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_circuit_test.cc +506 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_size_test.cc +79 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_test.cc +473 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/canonicalization_test.cc +185 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/circuit_dump.h +65 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/compiler.h +471 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/compiler_test.cc +110 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/node.h +176 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/pdqhash.h +127 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/schedule.h +435 -0
- data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_circuit.h +371 -0
- data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_external_test.cc +246 -0
- data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_test.cc +587 -0
- data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_witness.h +201 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_adder.h +140 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_adder_test.cc +64 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker.h +247 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_constants.h +35 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_encoder.h +72 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_test.cc +183 -0
- data/vendor/longfellow-zk/lib/circuits/logic/compiler_backend.h +62 -0
- data/vendor/longfellow-zk/lib/circuits/logic/counter.h +171 -0
- data/vendor/longfellow-zk/lib/circuits/logic/counter_test.cc +102 -0
- data/vendor/longfellow-zk/lib/circuits/logic/evaluation_backend.h +94 -0
- data/vendor/longfellow-zk/lib/circuits/logic/logic.h +1232 -0
- data/vendor/longfellow-zk/lib/circuits/logic/logic_circuit_test.cc +310 -0
- data/vendor/longfellow-zk/lib/circuits/logic/logic_test.cc +521 -0
- data/vendor/longfellow-zk/lib/circuits/logic/memcmp.h +68 -0
- data/vendor/longfellow-zk/lib/circuits/logic/memcmp_test.cc +148 -0
- data/vendor/longfellow-zk/lib/circuits/logic/polynomial.h +94 -0
- data/vendor/longfellow-zk/lib/circuits/logic/polynomial_test.cc +62 -0
- data/vendor/longfellow-zk/lib/circuits/logic/routing.h +445 -0
- data/vendor/longfellow-zk/lib/circuits/logic/routing_test.cc +241 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary.h +55 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker.h +77 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker_constants.h +37 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker_test.cc +53 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_size_test.cc +69 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_test.cc +62 -0
- data/vendor/longfellow-zk/lib/circuits/mac/mac_circuit.h +193 -0
- data/vendor/longfellow-zk/lib/circuits/mac/mac_circuit_test.cc +223 -0
- data/vendor/longfellow-zk/lib/circuits/mac/mac_reference.h +72 -0
- data/vendor/longfellow-zk/lib/circuits/mac/mac_witness.h +94 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/circuit_maker.cc +242 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_attribute_ids.h +311 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_attribute_test.cc +64 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_circuit_id.cc +85 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_constants.h +85 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_decompress.cc +41 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_decompress.h +27 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_examples.h +5232 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_generate_circuit.cc +199 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_hash.h +554 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_signature.h +143 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_signature_test.cc +444 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_test_attributes.h +157 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_witness.h +863 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk.cc +693 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk.h +216 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk_test.cc +724 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/zk_spec.cc +100 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/zk_spec_test.cc +155 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_circuit.h +330 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_circuit_test.cc +607 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_io.h +26 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_witness.cc +163 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_witness.h +47 -0
- data/vendor/longfellow-zk/lib/circuits/sha/sha256_constants.cc +34 -0
- data/vendor/longfellow-zk/lib/circuits/sha/sha256_constants.h +27 -0
- data/vendor/longfellow-zk/lib/circuits/sha/sha256_test_values.h +389 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/ptrcred.h +171 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small.h +218 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_examples.h +118 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_io.h +25 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_test.cc +208 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_witness.h +130 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode.h +508 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_circuit_test.cc +95 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_test.cc +119 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_util.cc +47 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_util.h +29 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_circuit.h +231 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_circuit_test.cc +428 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_witness.h +102 -0
- data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt.h +190 -0
- data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_constants.h +26 -0
- data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_test.cc +559 -0
- data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_witness.h +315 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f.h +411 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_io.h +32 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_test.cc +364 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_witness.h +278 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation.h +146 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_constants.h +25 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_test.cc +315 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_witness.h +136 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr.h +250 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr_test.cc +333 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr_witness.h +152 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44.h +903 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_circuit_test.cc +274 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_eval_test.cc +440 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_examples.cc +8851 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_examples.h +93 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_types.cc +24 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_types.h +118 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_witness.h +453 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_witness_test.cc +49 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref.cc +458 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref.h +150 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test.cc +398 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors.inc +3618 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors_pkdecode.inc +689 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors_sigdecode.inc +1501 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/sigdecode_test_vectors.inc +540 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_circuit.h +394 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_circuit_test.cc +577 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_constants.h +90 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_witness.cc +174 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_witness.h +140 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_circuit.h +351 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_circuit_test.cc +466 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference.cc +207 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference.h +59 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference_test.cc +153 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_round_constants.cc +39 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_round_constants.h +29 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_slicing.h +31 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_witness.cc +83 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_witness.h +72 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/shake_test_vectors.h +477 -0
- data/vendor/longfellow-zk/lib/ec/elliptic_curve.h +596 -0
- data/vendor/longfellow-zk/lib/ec/elliptic_curve_test.cc +548 -0
- data/vendor/longfellow-zk/lib/ec/p256.cc +36 -0
- data/vendor/longfellow-zk/lib/ec/p256.h +60 -0
- data/vendor/longfellow-zk/lib/ec/p256k1.cc +34 -0
- data/vendor/longfellow-zk/lib/ec/p256k1.h +60 -0
- data/vendor/longfellow-zk/lib/gf2k/gf2_128.h +503 -0
- data/vendor/longfellow-zk/lib/gf2k/gf2_128_bench.cc +48 -0
- data/vendor/longfellow-zk/lib/gf2k/gf2_128_test.cc +416 -0
- data/vendor/longfellow-zk/lib/gf2k/gf2poly.h +74 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14.h +242 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14_bench.cc +75 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14_reed_solomon.h +127 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14_reed_solomon_test.cc +110 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14_test.cc +246 -0
- data/vendor/longfellow-zk/lib/gf2k/sysdep.h +329 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_param.h +449 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_prover.h +354 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_test.cc +136 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_transcript.h +67 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_verifier.h +272 -0
- data/vendor/longfellow-zk/lib/merkle/merkle_commitment.h +104 -0
- data/vendor/longfellow-zk/lib/merkle/merkle_tree.h +216 -0
- data/vendor/longfellow-zk/lib/merkle/merkle_tree_test.cc +240 -0
- data/vendor/longfellow-zk/lib/proto/circuit.h +354 -0
- data/vendor/longfellow-zk/lib/proto/circuit_test.cc +202 -0
- data/vendor/longfellow-zk/lib/random/random.h +119 -0
- data/vendor/longfellow-zk/lib/random/random_test.cc +189 -0
- data/vendor/longfellow-zk/lib/random/secure_random_engine.h +37 -0
- data/vendor/longfellow-zk/lib/random/transcript.h +193 -0
- data/vendor/longfellow-zk/lib/random/transcript_test.cc +344 -0
- data/vendor/longfellow-zk/lib/sumcheck/circuit.h +148 -0
- data/vendor/longfellow-zk/lib/sumcheck/circuit_id.h +71 -0
- data/vendor/longfellow-zk/lib/sumcheck/equad.h +126 -0
- data/vendor/longfellow-zk/lib/sumcheck/hquad.h +115 -0
- data/vendor/longfellow-zk/lib/sumcheck/prover.h +59 -0
- data/vendor/longfellow-zk/lib/sumcheck/prover_layers.h +362 -0
- data/vendor/longfellow-zk/lib/sumcheck/quad.h +227 -0
- data/vendor/longfellow-zk/lib/sumcheck/quad_builder.h +211 -0
- data/vendor/longfellow-zk/lib/sumcheck/quad_test.cc +169 -0
- data/vendor/longfellow-zk/lib/sumcheck/sumcheck_test.cc +324 -0
- data/vendor/longfellow-zk/lib/sumcheck/testing.h +69 -0
- data/vendor/longfellow-zk/lib/sumcheck/transcript_sumcheck.h +85 -0
- data/vendor/longfellow-zk/lib/sumcheck/verifier.h +84 -0
- data/vendor/longfellow-zk/lib/sumcheck/verifier_layers.h +221 -0
- data/vendor/longfellow-zk/lib/testing/test_main.cc +50 -0
- data/vendor/longfellow-zk/lib/util/ceildiv.h +164 -0
- data/vendor/longfellow-zk/lib/util/ceildiv_test.cc +152 -0
- data/vendor/longfellow-zk/lib/util/crc64.h +45 -0
- data/vendor/longfellow-zk/lib/util/crypto.cc +39 -0
- data/vendor/longfellow-zk/lib/util/crypto.h +108 -0
- data/vendor/longfellow-zk/lib/util/log.cc +110 -0
- data/vendor/longfellow-zk/lib/util/log.h +33 -0
- data/vendor/longfellow-zk/lib/util/panic.h +40 -0
- data/vendor/longfellow-zk/lib/util/readbuffer.h +67 -0
- data/vendor/longfellow-zk/lib/util/serialization.h +54 -0
- data/vendor/longfellow-zk/lib/zk/zk_common.h +455 -0
- data/vendor/longfellow-zk/lib/zk/zk_proof.h +378 -0
- data/vendor/longfellow-zk/lib/zk/zk_prover.h +202 -0
- data/vendor/longfellow-zk/lib/zk/zk_test.cc +340 -0
- data/vendor/longfellow-zk/lib/zk/zk_testing.h +154 -0
- data/vendor/longfellow-zk/lib/zk/zk_verifier.h +109 -0
- metadata +347 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Copyright 2026 Google LLC.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
#include "algebra/nussbaumer.h"
|
|
16
|
+
|
|
17
|
+
#include <stddef.h>
|
|
18
|
+
|
|
19
|
+
#include <vector>
|
|
20
|
+
|
|
21
|
+
#include "algebra/bogorng.h"
|
|
22
|
+
#include "algebra/fp.h"
|
|
23
|
+
#include "gtest/gtest.h"
|
|
24
|
+
|
|
25
|
+
namespace proofs {
|
|
26
|
+
namespace {
|
|
27
|
+
|
|
28
|
+
using Field = Fp<4>;
|
|
29
|
+
using Elt = Field::Elt;
|
|
30
|
+
|
|
31
|
+
static const Field F(
|
|
32
|
+
"21888242871839275222246405745257275088548364400416034343698204186575808495"
|
|
33
|
+
"617");
|
|
34
|
+
|
|
35
|
+
static void ref_negacyclic(size_t n, Elt z[/*n*/], const Elt x[/*n*/],
|
|
36
|
+
const Elt y[/*n*/]) {
|
|
37
|
+
for (size_t k = 0; k < n; ++k) {
|
|
38
|
+
Elt s = F.zero();
|
|
39
|
+
for (size_t j = 0; j <= k; ++j) {
|
|
40
|
+
F.add(s, F.mulf(x[j], y[k - j]));
|
|
41
|
+
}
|
|
42
|
+
for (size_t j = k + 1; j < n; ++j) {
|
|
43
|
+
F.sub(s, F.mulf(x[j], y[n + k - j]));
|
|
44
|
+
}
|
|
45
|
+
z[k] = s;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static void ref_linear(size_t n, Elt z[/*2*n*/], const Elt x[/*n*/],
|
|
50
|
+
const Elt y[/*n*/]) {
|
|
51
|
+
// Really k<2*n-1, but we round up for consistency. z[2*n-1] is
|
|
52
|
+
// set to 0.
|
|
53
|
+
for (size_t k = 0; k < 2 * n; ++k) {
|
|
54
|
+
Elt s = F.zero();
|
|
55
|
+
for (size_t j = 0; j <= k; ++j) {
|
|
56
|
+
if (j < n && (k - j) < n) {
|
|
57
|
+
F.add(s, F.mulf(x[j], y[k - j]));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
z[k] = s;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// "middle-product" variant z[k] = sum_j x[n+k-j]*y[j]
|
|
65
|
+
static void ref_middle(size_t n, Elt z[/*n*/], const Elt x[/*2*n*/],
|
|
66
|
+
const Elt y[/*n*/]) {
|
|
67
|
+
for (size_t k = 0; k < n; ++k) {
|
|
68
|
+
Elt s = F.zero();
|
|
69
|
+
for (size_t j = 0; j < n; ++j) {
|
|
70
|
+
F.add(s, F.mulf(x[n + k - j], y[j]));
|
|
71
|
+
}
|
|
72
|
+
z[k] = s;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
constexpr size_t max_n = 1u << 12;
|
|
77
|
+
|
|
78
|
+
TEST(Nussbaumer, NegaCyclic) {
|
|
79
|
+
Bogorng<Field> rng(&F);
|
|
80
|
+
|
|
81
|
+
for (size_t n = 1; n < max_n; n *= 2) {
|
|
82
|
+
std::vector<Elt> x(n);
|
|
83
|
+
std::vector<Elt> y(n);
|
|
84
|
+
std::vector<Elt> z(n);
|
|
85
|
+
std::vector<Elt> zr(n);
|
|
86
|
+
for (size_t i = 0; i < n; ++i) {
|
|
87
|
+
x[i] = rng.next();
|
|
88
|
+
y[i] = rng.next();
|
|
89
|
+
}
|
|
90
|
+
Nussbaumer<Field>::negacyclic(n, z.data(), x.data(), y.data(), F);
|
|
91
|
+
ref_negacyclic(n, zr.data(), x.data(), y.data());
|
|
92
|
+
for (size_t i = 0; i < n; ++i) {
|
|
93
|
+
EXPECT_EQ(z[i], zr[i]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
TEST(Nussbaumer, Linear) {
|
|
99
|
+
Bogorng<Field> rng(&F);
|
|
100
|
+
for (size_t n = 1; n < max_n; n *= 2) {
|
|
101
|
+
std::vector<Elt> x(n);
|
|
102
|
+
std::vector<Elt> y(n);
|
|
103
|
+
std::vector<Elt> z(2 * n);
|
|
104
|
+
std::vector<Elt> zr(2 * n);
|
|
105
|
+
for (size_t i = 0; i < n; ++i) {
|
|
106
|
+
x[i] = rng.next();
|
|
107
|
+
y[i] = rng.next();
|
|
108
|
+
}
|
|
109
|
+
ref_linear(n, zr.data(), x.data(), y.data());
|
|
110
|
+
Nussbaumer<Field>::linear(n, z.data(), x.data(), y.data(), F);
|
|
111
|
+
for (size_t i = 0; i < 2 * n; ++i) {
|
|
112
|
+
EXPECT_EQ(z[i], zr[i]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
TEST(Nussbaumer, Middle) {
|
|
118
|
+
Bogorng<Field> rng(&F);
|
|
119
|
+
for (size_t n = 1; n < max_n; n *= 2) {
|
|
120
|
+
std::vector<Elt> x(2 * n);
|
|
121
|
+
std::vector<Elt> y(n);
|
|
122
|
+
std::vector<Elt> z(n);
|
|
123
|
+
std::vector<Elt> zr(n);
|
|
124
|
+
for (size_t i = 0; i < n; ++i) {
|
|
125
|
+
x[i] = rng.next();
|
|
126
|
+
x[i + n] = rng.next();
|
|
127
|
+
y[i] = rng.next();
|
|
128
|
+
}
|
|
129
|
+
ref_middle(n, zr.data(), x.data(), y.data());
|
|
130
|
+
Nussbaumer<Field>::middle(n, z.data(), x.data(), y.data(), F);
|
|
131
|
+
for (size_t i = 0; i < n; ++i) {
|
|
132
|
+
EXPECT_EQ(z[i], zr[i]);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
} // namespace
|
|
138
|
+
} // namespace proofs
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Copyright 2026 Google LLC.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
#include <stddef.h>
|
|
16
|
+
|
|
17
|
+
#include <vector>
|
|
18
|
+
|
|
19
|
+
#include "algebra/bogorng.h"
|
|
20
|
+
#include "algebra/fp.h"
|
|
21
|
+
#include "algebra/fp2.h"
|
|
22
|
+
#include "algebra/nussbaumer.h"
|
|
23
|
+
#include "gtest/gtest.h"
|
|
24
|
+
|
|
25
|
+
namespace proofs {
|
|
26
|
+
namespace {
|
|
27
|
+
|
|
28
|
+
using Field0 = Fp<1>;
|
|
29
|
+
// 2^61-1
|
|
30
|
+
static const Field0 F0("2305843009213693951");
|
|
31
|
+
|
|
32
|
+
using Field = Fp2<Field0>;
|
|
33
|
+
using Elt = Field::Elt;
|
|
34
|
+
static const Field F(F0);
|
|
35
|
+
|
|
36
|
+
static void ref_negacyclic(size_t n, Elt z[/*n*/], const Elt x[/*n*/],
|
|
37
|
+
const Elt y[/*n*/]) {
|
|
38
|
+
for (size_t k = 0; k < n; ++k) {
|
|
39
|
+
Elt s = F.zero();
|
|
40
|
+
for (size_t j = 0; j <= k; ++j) {
|
|
41
|
+
F.add(s, F.mulf(x[j], y[k - j]));
|
|
42
|
+
}
|
|
43
|
+
for (size_t j = k + 1; j < n; ++j) {
|
|
44
|
+
F.sub(s, F.mulf(x[j], y[n + k - j]));
|
|
45
|
+
}
|
|
46
|
+
z[k] = s;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static void ref_linear(size_t n, Elt z[/*2*n*/], const Elt x[/*n*/],
|
|
51
|
+
const Elt y[/*n*/]) {
|
|
52
|
+
// Really k<2*n-1, but we round up for consistency. z[2*n-1] is
|
|
53
|
+
// set to 0.
|
|
54
|
+
for (size_t k = 0; k < 2 * n; ++k) {
|
|
55
|
+
Elt s = F.zero();
|
|
56
|
+
for (size_t j = 0; j <= k; ++j) {
|
|
57
|
+
if (j < n && (k - j) < n) {
|
|
58
|
+
F.add(s, F.mulf(x[j], y[k - j]));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
z[k] = s;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// "middle-product" variant z[k] = sum_j x[n+k-j]*y[j]
|
|
66
|
+
static void ref_middle(size_t n, Elt z[/*n*/], const Elt x[/*2*n*/],
|
|
67
|
+
const Elt y[/*n*/]) {
|
|
68
|
+
for (size_t k = 0; k < n; ++k) {
|
|
69
|
+
Elt s = F.zero();
|
|
70
|
+
for (size_t j = 0; j < n; ++j) {
|
|
71
|
+
F.add(s, F.mulf(x[n + k - j], y[j]));
|
|
72
|
+
}
|
|
73
|
+
z[k] = s;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
constexpr size_t max_n = 1u << 12;
|
|
78
|
+
|
|
79
|
+
TEST(Nussbaumer, NegaCyclic) {
|
|
80
|
+
Bogorng<Field> rng(&F);
|
|
81
|
+
|
|
82
|
+
for (size_t n = 1; n < max_n; n *= 2) {
|
|
83
|
+
std::vector<Elt> x(n);
|
|
84
|
+
std::vector<Elt> y(n);
|
|
85
|
+
std::vector<Elt> z(n);
|
|
86
|
+
std::vector<Elt> zr(n);
|
|
87
|
+
for (size_t i = 0; i < n; ++i) {
|
|
88
|
+
x[i] = rng.next();
|
|
89
|
+
y[i] = rng.next();
|
|
90
|
+
}
|
|
91
|
+
Nussbaumer<Field>::negacyclic(n, z.data(), x.data(), y.data(), F);
|
|
92
|
+
ref_negacyclic(n, zr.data(), x.data(), y.data());
|
|
93
|
+
for (size_t i = 0; i < n; ++i) {
|
|
94
|
+
EXPECT_EQ(z[i], zr[i]);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
TEST(Nussbaumer, Linear) {
|
|
100
|
+
Bogorng<Field> rng(&F);
|
|
101
|
+
for (size_t n = 1; n < max_n; n *= 2) {
|
|
102
|
+
std::vector<Elt> x(n);
|
|
103
|
+
std::vector<Elt> y(n);
|
|
104
|
+
std::vector<Elt> z(2 * n);
|
|
105
|
+
std::vector<Elt> zr(2 * n);
|
|
106
|
+
for (size_t i = 0; i < n; ++i) {
|
|
107
|
+
x[i] = rng.next();
|
|
108
|
+
y[i] = rng.next();
|
|
109
|
+
}
|
|
110
|
+
ref_linear(n, zr.data(), x.data(), y.data());
|
|
111
|
+
Nussbaumer<Field>::linear(n, z.data(), x.data(), y.data(), F);
|
|
112
|
+
for (size_t i = 0; i < 2 * n; ++i) {
|
|
113
|
+
EXPECT_EQ(z[i], zr[i]);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
TEST(Nussbaumer, Middle) {
|
|
119
|
+
Bogorng<Field> rng(&F);
|
|
120
|
+
for (size_t n = 1; n < max_n; n *= 2) {
|
|
121
|
+
std::vector<Elt> x(2 * n);
|
|
122
|
+
std::vector<Elt> y(n);
|
|
123
|
+
std::vector<Elt> z(n);
|
|
124
|
+
std::vector<Elt> zr(n);
|
|
125
|
+
for (size_t i = 0; i < n; ++i) {
|
|
126
|
+
x[i] = rng.next();
|
|
127
|
+
x[i + n] = rng.next();
|
|
128
|
+
y[i] = rng.next();
|
|
129
|
+
}
|
|
130
|
+
ref_middle(n, zr.data(), x.data(), y.data());
|
|
131
|
+
Nussbaumer<Field>::middle(n, z.data(), x.data(), y.data(), F);
|
|
132
|
+
for (size_t i = 0; i < n; ++i) {
|
|
133
|
+
EXPECT_EQ(z[i], zr[i]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
} // namespace
|
|
139
|
+
} // namespace proofs
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright 2026 Google LLC.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
#ifndef PRIVACY_PROOFS_ZK_LIB_ALGEBRA_PERMUTATIONS_H_
|
|
16
|
+
#define PRIVACY_PROOFS_ZK_LIB_ALGEBRA_PERMUTATIONS_H_
|
|
17
|
+
|
|
18
|
+
#include <stddef.h>
|
|
19
|
+
|
|
20
|
+
#include <utility>
|
|
21
|
+
|
|
22
|
+
namespace proofs {
|
|
23
|
+
|
|
24
|
+
template <class Elt>
|
|
25
|
+
class Permutations {
|
|
26
|
+
public:
|
|
27
|
+
static void bitrev(Elt A[/*n*/], size_t n) {
|
|
28
|
+
size_t revi = 0;
|
|
29
|
+
for (size_t i = 0; i < n - 1; ++i) {
|
|
30
|
+
if (i < revi) {
|
|
31
|
+
std::swap(A[i], A[revi]);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
bitrev_increment(&revi, n);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* X[i] = X[(i+shift) mod N] */
|
|
39
|
+
/* We now use the notation X{N} to denote that X consists of N
|
|
40
|
+
elements. We have X = [A{SHIFT} B{N-SHIFT}]. We want
|
|
41
|
+
X' = [B A] = rev[rev(A) rev(B)], where rev(A) reverses
|
|
42
|
+
array A in-place.
|
|
43
|
+
*/
|
|
44
|
+
static void rotate(Elt* x, size_t n, size_t shift) {
|
|
45
|
+
if (shift > 0) {
|
|
46
|
+
reverse(x, 0, shift);
|
|
47
|
+
reverse(x, shift, n);
|
|
48
|
+
reverse(x, 0, n);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static void unrotate(Elt* x, size_t n, size_t shift) {
|
|
53
|
+
if (shift > 0) {
|
|
54
|
+
reverse(x, 0, n);
|
|
55
|
+
reverse(x, shift, n);
|
|
56
|
+
reverse(x, 0, shift);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private:
|
|
61
|
+
static void bitrev_increment(size_t* j, size_t bit) {
|
|
62
|
+
do {
|
|
63
|
+
bit >>= 1;
|
|
64
|
+
*j ^= bit;
|
|
65
|
+
} while (!(*j & bit));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// reverse x[i,j)
|
|
69
|
+
static void reverse(Elt* x, size_t i, size_t j) {
|
|
70
|
+
while (i + 1 < j) {
|
|
71
|
+
--j;
|
|
72
|
+
std::swap(x[i], x[j]);
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
} // namespace proofs
|
|
78
|
+
|
|
79
|
+
#endif // PRIVACY_PROOFS_ZK_LIB_ALGEBRA_PERMUTATIONS_H_
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// Copyright 2026 Google LLC.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
#ifndef PRIVACY_PROOFS_ZK_LIB_ALGEBRA_POLY_H_
|
|
16
|
+
#define PRIVACY_PROOFS_ZK_LIB_ALGEBRA_POLY_H_
|
|
17
|
+
|
|
18
|
+
#include <cstddef>
|
|
19
|
+
|
|
20
|
+
namespace proofs {
|
|
21
|
+
|
|
22
|
+
// This file defines templates for fixed-size N-tuples of field elements that
|
|
23
|
+
// can be interpreted as polynomial coefficients and/or values and/or Newton
|
|
24
|
+
// expansion. These polynomials handle the main operations of the sumcheck
|
|
25
|
+
// protocol.
|
|
26
|
+
|
|
27
|
+
// The Poly template represents a full polynomial stored as N evaluation points.
|
|
28
|
+
// It supports interpolation at an arbitrary point in the Field.
|
|
29
|
+
template <size_t N, class Field>
|
|
30
|
+
class Poly {
|
|
31
|
+
public:
|
|
32
|
+
static const size_t kN = N;
|
|
33
|
+
using Elt = typename Field::Elt;
|
|
34
|
+
using T = Poly;
|
|
35
|
+
|
|
36
|
+
// the N-tuple itself
|
|
37
|
+
Elt t_[N];
|
|
38
|
+
|
|
39
|
+
Elt& operator[](size_t i) { return t_[i]; }
|
|
40
|
+
const Elt& operator[](size_t i) const { return t_[i]; }
|
|
41
|
+
|
|
42
|
+
T& add(const T& y, const Field& F) {
|
|
43
|
+
for (size_t i = 0; i < N; ++i) {
|
|
44
|
+
F.add(t_[i], y[i]);
|
|
45
|
+
}
|
|
46
|
+
return *this;
|
|
47
|
+
}
|
|
48
|
+
T& sub(const T& y, const Field& F) {
|
|
49
|
+
for (size_t i = 0; i < N; ++i) {
|
|
50
|
+
F.sub(t_[i], y[i]);
|
|
51
|
+
}
|
|
52
|
+
return *this;
|
|
53
|
+
}
|
|
54
|
+
T& mul(const T& y, const Field& F) {
|
|
55
|
+
for (size_t i = 0; i < N; ++i) {
|
|
56
|
+
F.mul(t_[i], y[i]);
|
|
57
|
+
}
|
|
58
|
+
return *this;
|
|
59
|
+
}
|
|
60
|
+
T& mul_scalar(const Elt& y, const Field& F) {
|
|
61
|
+
for (size_t i = 0; i < N; ++i) {
|
|
62
|
+
F.mul(t_[i], y);
|
|
63
|
+
}
|
|
64
|
+
return *this;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static T extend(const Poly<2, Field>& f, const Field& F) {
|
|
68
|
+
T g;
|
|
69
|
+
g[0] = f[0];
|
|
70
|
+
g[1] = f[1];
|
|
71
|
+
Elt df = F.subf(f[1], f[0]);
|
|
72
|
+
|
|
73
|
+
if (Field::kCharacteristicTwo) {
|
|
74
|
+
// Assume poly_evaluation_point[0] = 0, poly_evaluation_point[1] = 1,
|
|
75
|
+
// and the rest are arbitrary.
|
|
76
|
+
for (size_t i = 2; i < N; ++i) {
|
|
77
|
+
g[i] = F.addf(g[0], F.mulf(F.poly_evaluation_point(i), df));
|
|
78
|
+
}
|
|
79
|
+
} else {
|
|
80
|
+
// Assume that poly_evaluation_point[] form an arithmetic
|
|
81
|
+
// progression.
|
|
82
|
+
for (size_t i = 2; i < N; ++i) {
|
|
83
|
+
g[i] = F.addf(g[i - 1], df);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return g;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// convert Lagrange basis -> Newton forward differences for the
|
|
91
|
+
// special case of evaluation points 0, 1, 2, ..., N-1.
|
|
92
|
+
// See interpolation.h for the general case of interpolation.
|
|
93
|
+
void newton_of_lagrange(const Field& F) {
|
|
94
|
+
for (size_t i = 1; i < N; i++) {
|
|
95
|
+
for (size_t k = N; k-- > i;) {
|
|
96
|
+
F.sub(t_[k], t_[k - 1]);
|
|
97
|
+
F.mul(t_[k], F.newton_denominator(k, i));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Evaluate f(x) for a polynomial in the Newton forward-difference
|
|
103
|
+
// basis.
|
|
104
|
+
Elt eval_newton(const Elt& x, const Field& F) const {
|
|
105
|
+
// Newton interpolation formula
|
|
106
|
+
Elt e = t_[N - 1];
|
|
107
|
+
for (size_t i = N - 1; i-- > 0;) {
|
|
108
|
+
F.mul(e, F.subf(x, F.poly_evaluation_point(i)));
|
|
109
|
+
F.add(e, t_[i]);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return e;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
Elt eval_lagrange(const Elt& x, const Field& F) const {
|
|
116
|
+
T tmp(*this); // do not clobber *this
|
|
117
|
+
tmp.newton_of_lagrange(F);
|
|
118
|
+
return tmp.eval_newton(x, F);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Evaluate f(r) given a polynomial in the standard basis
|
|
122
|
+
// f(x)=t_[i]*x^i.
|
|
123
|
+
Elt eval_monomial(const Elt& x, const Field& F) const {
|
|
124
|
+
// Horner's algorithm
|
|
125
|
+
Elt e = t_[N - 1];
|
|
126
|
+
for (size_t i = N - 1; i-- > 0;) {
|
|
127
|
+
F.mul(e, x);
|
|
128
|
+
F.add(e, t_[i]);
|
|
129
|
+
}
|
|
130
|
+
return e;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Interpolation via explicit dot product.
|
|
134
|
+
//
|
|
135
|
+
// The combination P.newton_of_lagrange().eval_newton(..., R, ...)
|
|
136
|
+
// evaluates P at R given the Lagrange basis [P(0), P(1), ..., P(N-1)].
|
|
137
|
+
//
|
|
138
|
+
// On the contrary, this class computes a V(R) such that P(R) =
|
|
139
|
+
// dot(V(R), [P(0), P(1), ..., P(N-1)]) and the caller computes the
|
|
140
|
+
// inner product, either explicitly or via an inner-product
|
|
141
|
+
// argument. The construction is pure linear algebra: express the
|
|
142
|
+
// Lagrange basis P = [P(0), P(1), ..., P(N-1)]^T as I * P where I
|
|
143
|
+
// is the identity matrix, and interpolate the rows of I
|
|
144
|
+
// via newton_of_lagrange().eval_newton(). Since newton_of_lagrange()
|
|
145
|
+
// is O(N^2) and eval_newton() is O(N), pre-compute the eval_newton()
|
|
146
|
+
// of all rows.
|
|
147
|
+
class dot_interpolation {
|
|
148
|
+
// identity_[k] contains the Newton basis of the polynomial P(x) such
|
|
149
|
+
// that P(k) = 1 and P(i) = 0 for i != k and 0 <= i < N.
|
|
150
|
+
T identity_[N];
|
|
151
|
+
|
|
152
|
+
public:
|
|
153
|
+
explicit dot_interpolation(const Field& F) {
|
|
154
|
+
for (size_t k = 0; k < N; ++k) {
|
|
155
|
+
for (size_t i = 0; i < N; ++i) {
|
|
156
|
+
identity_[k][i] = (i == k) ? F.one() : F.zero();
|
|
157
|
+
}
|
|
158
|
+
identity_[k].newton_of_lagrange(F);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// return V such that P(r) = V^T [P(0), P(1), ..., P(N-1)]
|
|
163
|
+
T coef(const Elt& x, const Field& F) const {
|
|
164
|
+
T c;
|
|
165
|
+
for (size_t k = 0; k < N; ++k) {
|
|
166
|
+
c[k] = identity_[k].eval_newton(x, F);
|
|
167
|
+
}
|
|
168
|
+
return c;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// In SumcheckPoly, the p(1) is not computed in the add, sub, mul, mul_scalar
|
|
174
|
+
// methods because it is implied by context. This optimization is used in the
|
|
175
|
+
// inner-loop of the sumcheck prover. A convenience method is provided to
|
|
176
|
+
// convert to a Poly object for use outside the inner-loop.
|
|
177
|
+
template <size_t N, class Field>
|
|
178
|
+
class SumcheckPoly {
|
|
179
|
+
public:
|
|
180
|
+
static const size_t kN = N;
|
|
181
|
+
using Elt = typename Field::Elt;
|
|
182
|
+
using T = SumcheckPoly;
|
|
183
|
+
|
|
184
|
+
// the N-tuple itself
|
|
185
|
+
Elt t_[N];
|
|
186
|
+
|
|
187
|
+
SumcheckPoly() = default;
|
|
188
|
+
|
|
189
|
+
explicit SumcheckPoly(const Poly<N, Field>& p) {
|
|
190
|
+
for (size_t i = 0; i < N; ++i) {
|
|
191
|
+
t_[i] = p[i];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
Elt& operator[](size_t i) { return t_[i]; }
|
|
196
|
+
const Elt& operator[](size_t i) const { return t_[i]; }
|
|
197
|
+
|
|
198
|
+
T& add(const T& y, const Field& F) {
|
|
199
|
+
F.add(t_[0], y[0]);
|
|
200
|
+
for (size_t i = 2; i < N; ++i) {
|
|
201
|
+
F.add(t_[i], y[i]);
|
|
202
|
+
}
|
|
203
|
+
return *this;
|
|
204
|
+
}
|
|
205
|
+
T& sub(const T& y, const Field& F) {
|
|
206
|
+
F.sub(t_[0], y[0]);
|
|
207
|
+
for (size_t i = 2; i < N; ++i) {
|
|
208
|
+
F.sub(t_[i], y[i]);
|
|
209
|
+
}
|
|
210
|
+
return *this;
|
|
211
|
+
}
|
|
212
|
+
T& mul(const T& y, const Field& F) {
|
|
213
|
+
F.mul(t_[0], y[0]);
|
|
214
|
+
for (size_t i = 2; i < N; ++i) {
|
|
215
|
+
F.mul(t_[i], y[i]);
|
|
216
|
+
}
|
|
217
|
+
return *this;
|
|
218
|
+
}
|
|
219
|
+
T& mul_scalar(const Elt& y, const Field& F) {
|
|
220
|
+
F.mul(t_[0], y);
|
|
221
|
+
for (size_t i = 2; i < N; ++i) {
|
|
222
|
+
F.mul(t_[i], y);
|
|
223
|
+
}
|
|
224
|
+
return *this;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Convert to a Poly object by providing the p(1) explicitly.
|
|
228
|
+
Poly<N, Field> to_poly(const Elt& p1) const {
|
|
229
|
+
Poly<N, Field> p;
|
|
230
|
+
for (size_t i = 0; i < N; ++i) {
|
|
231
|
+
p[i] = t_[i];
|
|
232
|
+
}
|
|
233
|
+
p[1] = p1;
|
|
234
|
+
return p;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
} // namespace proofs
|
|
239
|
+
|
|
240
|
+
#endif // PRIVACY_PROOFS_ZK_LIB_ALGEBRA_POLY_H_
|