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.
Files changed (289) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +10 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +152 -0
  5. data/ext/longfellow/CMakeLists.txt +76 -0
  6. data/ext/longfellow/extconf.rb +77 -0
  7. data/lib/longfellow/attribute.rb +65 -0
  8. data/lib/longfellow/c.rb +105 -0
  9. data/lib/longfellow/errors.rb +78 -0
  10. data/lib/longfellow/version.rb +5 -0
  11. data/lib/longfellow/zk_spec.rb +40 -0
  12. data/lib/longfellow.rb +162 -0
  13. data/sig/longfellow.rbs +74 -0
  14. data/vendor/longfellow-zk/LICENSE +203 -0
  15. data/vendor/longfellow-zk/lib/algebra/blas.h +121 -0
  16. data/vendor/longfellow-zk/lib/algebra/bogorng.h +68 -0
  17. data/vendor/longfellow-zk/lib/algebra/compare.h +40 -0
  18. data/vendor/longfellow-zk/lib/algebra/convolution.h +219 -0
  19. data/vendor/longfellow-zk/lib/algebra/crt.cc +42 -0
  20. data/vendor/longfellow-zk/lib/algebra/crt.h +299 -0
  21. data/vendor/longfellow-zk/lib/algebra/crt_convolution.h +114 -0
  22. data/vendor/longfellow-zk/lib/algebra/crt_test.cc +371 -0
  23. data/vendor/longfellow-zk/lib/algebra/fft.h +104 -0
  24. data/vendor/longfellow-zk/lib/algebra/fft_interpolation.h +304 -0
  25. data/vendor/longfellow-zk/lib/algebra/fft_interpolation_test.cc +168 -0
  26. data/vendor/longfellow-zk/lib/algebra/fft_test.cc +257 -0
  27. data/vendor/longfellow-zk/lib/algebra/fp.h +59 -0
  28. data/vendor/longfellow-zk/lib/algebra/fp2.h +240 -0
  29. data/vendor/longfellow-zk/lib/algebra/fp24.h +342 -0
  30. data/vendor/longfellow-zk/lib/algebra/fp24_6.h +305 -0
  31. data/vendor/longfellow-zk/lib/algebra/fp24_6_test.cc +197 -0
  32. data/vendor/longfellow-zk/lib/algebra/fp2_test.cc +280 -0
  33. data/vendor/longfellow-zk/lib/algebra/fp_generic.h +533 -0
  34. data/vendor/longfellow-zk/lib/algebra/fp_p128.h +91 -0
  35. data/vendor/longfellow-zk/lib/algebra/fp_p256.h +68 -0
  36. data/vendor/longfellow-zk/lib/algebra/fp_p256k1.h +123 -0
  37. data/vendor/longfellow-zk/lib/algebra/fp_p384.h +65 -0
  38. data/vendor/longfellow-zk/lib/algebra/fp_p521.h +62 -0
  39. data/vendor/longfellow-zk/lib/algebra/fp_test.cc +522 -0
  40. data/vendor/longfellow-zk/lib/algebra/hash.h +39 -0
  41. data/vendor/longfellow-zk/lib/algebra/interpolation.h +117 -0
  42. data/vendor/longfellow-zk/lib/algebra/interpolation_test.cc +74 -0
  43. data/vendor/longfellow-zk/lib/algebra/limb.h +153 -0
  44. data/vendor/longfellow-zk/lib/algebra/limb_test.cc +75 -0
  45. data/vendor/longfellow-zk/lib/algebra/nat.cc +32 -0
  46. data/vendor/longfellow-zk/lib/algebra/nat.h +212 -0
  47. data/vendor/longfellow-zk/lib/algebra/nat_test.cc +183 -0
  48. data/vendor/longfellow-zk/lib/algebra/nussbaumer.h +400 -0
  49. data/vendor/longfellow-zk/lib/algebra/nussbaumer_test.cc +138 -0
  50. data/vendor/longfellow-zk/lib/algebra/nussbaumerfp2_test.cc +139 -0
  51. data/vendor/longfellow-zk/lib/algebra/permutations.h +79 -0
  52. data/vendor/longfellow-zk/lib/algebra/poly.h +240 -0
  53. data/vendor/longfellow-zk/lib/algebra/poly_test.cc +123 -0
  54. data/vendor/longfellow-zk/lib/algebra/reed_solomon.h +150 -0
  55. data/vendor/longfellow-zk/lib/algebra/reed_solomon_extension.h +108 -0
  56. data/vendor/longfellow-zk/lib/algebra/reed_solomon_extension_test.cc +76 -0
  57. data/vendor/longfellow-zk/lib/algebra/reed_solomon_test.cc +473 -0
  58. data/vendor/longfellow-zk/lib/algebra/rfft.h +400 -0
  59. data/vendor/longfellow-zk/lib/algebra/rfft_test.cc +102 -0
  60. data/vendor/longfellow-zk/lib/algebra/static_string.h +29 -0
  61. data/vendor/longfellow-zk/lib/algebra/sysdep.h +495 -0
  62. data/vendor/longfellow-zk/lib/algebra/sysdep_test.cc +41 -0
  63. data/vendor/longfellow-zk/lib/algebra/twiddle.h +59 -0
  64. data/vendor/longfellow-zk/lib/algebra/utility.h +86 -0
  65. data/vendor/longfellow-zk/lib/algebra/utility_test.cc +86 -0
  66. data/vendor/longfellow-zk/lib/arrays/affine.h +56 -0
  67. data/vendor/longfellow-zk/lib/arrays/affine_test.cc +220 -0
  68. data/vendor/longfellow-zk/lib/arrays/dense.h +210 -0
  69. data/vendor/longfellow-zk/lib/arrays/eq.h +75 -0
  70. data/vendor/longfellow-zk/lib/arrays/eqs.h +137 -0
  71. data/vendor/longfellow-zk/lib/arrays/eqs_test.cc +151 -0
  72. data/vendor/longfellow-zk/lib/arrays/sparse.h +192 -0
  73. data/vendor/longfellow-zk/lib/cbor/host_decoder.h +323 -0
  74. data/vendor/longfellow-zk/lib/cbor/host_decoder_test.cc +541 -0
  75. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor.h +594 -0
  76. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_byte_decoder.h +150 -0
  77. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_byte_decoder_test.cc +147 -0
  78. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_constants.h +27 -0
  79. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_pluck.h +110 -0
  80. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_pluck_test.cc +55 -0
  81. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_test.cc +174 -0
  82. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_testing.h +98 -0
  83. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_witness.h +312 -0
  84. data/vendor/longfellow-zk/lib/circuits/cbor_parser/mso2_test.cc +662 -0
  85. data/vendor/longfellow-zk/lib/circuits/cbor_parser/mso_test.cc +485 -0
  86. data/vendor/longfellow-zk/lib/circuits/cbor_parser/scan.h +104 -0
  87. data/vendor/longfellow-zk/lib/circuits/cbor_parser/scan_test.cc +137 -0
  88. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor.h +640 -0
  89. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_byte_decoder.h +150 -0
  90. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_byte_decoder_test.cc +147 -0
  91. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_constants.h +27 -0
  92. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_testing.h +99 -0
  93. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_witness.h +319 -0
  94. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/lexer_test.cc +120 -0
  95. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/mdoc_examples_test.cc +89 -0
  96. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_circuit_test.cc +506 -0
  97. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_size_test.cc +79 -0
  98. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_test.cc +473 -0
  99. data/vendor/longfellow-zk/lib/circuits/compiler/canonicalization_test.cc +185 -0
  100. data/vendor/longfellow-zk/lib/circuits/compiler/circuit_dump.h +65 -0
  101. data/vendor/longfellow-zk/lib/circuits/compiler/compiler.h +471 -0
  102. data/vendor/longfellow-zk/lib/circuits/compiler/compiler_test.cc +110 -0
  103. data/vendor/longfellow-zk/lib/circuits/compiler/node.h +176 -0
  104. data/vendor/longfellow-zk/lib/circuits/compiler/pdqhash.h +127 -0
  105. data/vendor/longfellow-zk/lib/circuits/compiler/schedule.h +435 -0
  106. data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_circuit.h +371 -0
  107. data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_external_test.cc +246 -0
  108. data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_test.cc +587 -0
  109. data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_witness.h +201 -0
  110. data/vendor/longfellow-zk/lib/circuits/logic/bit_adder.h +140 -0
  111. data/vendor/longfellow-zk/lib/circuits/logic/bit_adder_test.cc +64 -0
  112. data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker.h +247 -0
  113. data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_constants.h +35 -0
  114. data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_encoder.h +72 -0
  115. data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_test.cc +183 -0
  116. data/vendor/longfellow-zk/lib/circuits/logic/compiler_backend.h +62 -0
  117. data/vendor/longfellow-zk/lib/circuits/logic/counter.h +171 -0
  118. data/vendor/longfellow-zk/lib/circuits/logic/counter_test.cc +102 -0
  119. data/vendor/longfellow-zk/lib/circuits/logic/evaluation_backend.h +94 -0
  120. data/vendor/longfellow-zk/lib/circuits/logic/logic.h +1232 -0
  121. data/vendor/longfellow-zk/lib/circuits/logic/logic_circuit_test.cc +310 -0
  122. data/vendor/longfellow-zk/lib/circuits/logic/logic_test.cc +521 -0
  123. data/vendor/longfellow-zk/lib/circuits/logic/memcmp.h +68 -0
  124. data/vendor/longfellow-zk/lib/circuits/logic/memcmp_test.cc +148 -0
  125. data/vendor/longfellow-zk/lib/circuits/logic/polynomial.h +94 -0
  126. data/vendor/longfellow-zk/lib/circuits/logic/polynomial_test.cc +62 -0
  127. data/vendor/longfellow-zk/lib/circuits/logic/routing.h +445 -0
  128. data/vendor/longfellow-zk/lib/circuits/logic/routing_test.cc +241 -0
  129. data/vendor/longfellow-zk/lib/circuits/logic/unary.h +55 -0
  130. data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker.h +77 -0
  131. data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker_constants.h +37 -0
  132. data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker_test.cc +53 -0
  133. data/vendor/longfellow-zk/lib/circuits/logic/unary_size_test.cc +69 -0
  134. data/vendor/longfellow-zk/lib/circuits/logic/unary_test.cc +62 -0
  135. data/vendor/longfellow-zk/lib/circuits/mac/mac_circuit.h +193 -0
  136. data/vendor/longfellow-zk/lib/circuits/mac/mac_circuit_test.cc +223 -0
  137. data/vendor/longfellow-zk/lib/circuits/mac/mac_reference.h +72 -0
  138. data/vendor/longfellow-zk/lib/circuits/mac/mac_witness.h +94 -0
  139. data/vendor/longfellow-zk/lib/circuits/mdoc/circuit_maker.cc +242 -0
  140. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_attribute_ids.h +311 -0
  141. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_attribute_test.cc +64 -0
  142. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_circuit_id.cc +85 -0
  143. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_constants.h +85 -0
  144. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_decompress.cc +41 -0
  145. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_decompress.h +27 -0
  146. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_examples.h +5232 -0
  147. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_generate_circuit.cc +199 -0
  148. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_hash.h +554 -0
  149. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_signature.h +143 -0
  150. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_signature_test.cc +444 -0
  151. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_test_attributes.h +157 -0
  152. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_witness.h +863 -0
  153. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk.cc +693 -0
  154. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk.h +216 -0
  155. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk_test.cc +724 -0
  156. data/vendor/longfellow-zk/lib/circuits/mdoc/zk_spec.cc +100 -0
  157. data/vendor/longfellow-zk/lib/circuits/mdoc/zk_spec_test.cc +155 -0
  158. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_circuit.h +330 -0
  159. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_circuit_test.cc +607 -0
  160. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_io.h +26 -0
  161. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_witness.cc +163 -0
  162. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_witness.h +47 -0
  163. data/vendor/longfellow-zk/lib/circuits/sha/sha256_constants.cc +34 -0
  164. data/vendor/longfellow-zk/lib/circuits/sha/sha256_constants.h +27 -0
  165. data/vendor/longfellow-zk/lib/circuits/sha/sha256_test_values.h +389 -0
  166. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/ptrcred.h +171 -0
  167. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small.h +218 -0
  168. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_examples.h +118 -0
  169. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_io.h +25 -0
  170. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_test.cc +208 -0
  171. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_witness.h +130 -0
  172. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode.h +508 -0
  173. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_circuit_test.cc +95 -0
  174. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_test.cc +119 -0
  175. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_util.cc +47 -0
  176. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_util.h +29 -0
  177. data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_circuit.h +231 -0
  178. data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_circuit_test.cc +428 -0
  179. data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_witness.h +102 -0
  180. data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt.h +190 -0
  181. data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_constants.h +26 -0
  182. data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_test.cc +559 -0
  183. data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_witness.h +315 -0
  184. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f.h +411 -0
  185. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_io.h +32 -0
  186. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_test.cc +364 -0
  187. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_witness.h +278 -0
  188. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation.h +146 -0
  189. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_constants.h +25 -0
  190. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_test.cc +315 -0
  191. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_witness.h +136 -0
  192. data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr.h +250 -0
  193. data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr_test.cc +333 -0
  194. data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr_witness.h +152 -0
  195. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44.h +903 -0
  196. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_circuit_test.cc +274 -0
  197. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_eval_test.cc +440 -0
  198. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_examples.cc +8851 -0
  199. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_examples.h +93 -0
  200. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_types.cc +24 -0
  201. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_types.h +118 -0
  202. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_witness.h +453 -0
  203. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_witness_test.cc +49 -0
  204. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref.cc +458 -0
  205. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref.h +150 -0
  206. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test.cc +398 -0
  207. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors.inc +3618 -0
  208. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors_pkdecode.inc +689 -0
  209. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors_sigdecode.inc +1501 -0
  210. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/sigdecode_test_vectors.inc +540 -0
  211. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_circuit.h +394 -0
  212. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_circuit_test.cc +577 -0
  213. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_constants.h +90 -0
  214. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_witness.cc +174 -0
  215. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_witness.h +140 -0
  216. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_circuit.h +351 -0
  217. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_circuit_test.cc +466 -0
  218. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference.cc +207 -0
  219. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference.h +59 -0
  220. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference_test.cc +153 -0
  221. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_round_constants.cc +39 -0
  222. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_round_constants.h +29 -0
  223. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_slicing.h +31 -0
  224. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_witness.cc +83 -0
  225. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_witness.h +72 -0
  226. data/vendor/longfellow-zk/lib/circuits/tests/sha3/shake_test_vectors.h +477 -0
  227. data/vendor/longfellow-zk/lib/ec/elliptic_curve.h +596 -0
  228. data/vendor/longfellow-zk/lib/ec/elliptic_curve_test.cc +548 -0
  229. data/vendor/longfellow-zk/lib/ec/p256.cc +36 -0
  230. data/vendor/longfellow-zk/lib/ec/p256.h +60 -0
  231. data/vendor/longfellow-zk/lib/ec/p256k1.cc +34 -0
  232. data/vendor/longfellow-zk/lib/ec/p256k1.h +60 -0
  233. data/vendor/longfellow-zk/lib/gf2k/gf2_128.h +503 -0
  234. data/vendor/longfellow-zk/lib/gf2k/gf2_128_bench.cc +48 -0
  235. data/vendor/longfellow-zk/lib/gf2k/gf2_128_test.cc +416 -0
  236. data/vendor/longfellow-zk/lib/gf2k/gf2poly.h +74 -0
  237. data/vendor/longfellow-zk/lib/gf2k/lch14.h +242 -0
  238. data/vendor/longfellow-zk/lib/gf2k/lch14_bench.cc +75 -0
  239. data/vendor/longfellow-zk/lib/gf2k/lch14_reed_solomon.h +127 -0
  240. data/vendor/longfellow-zk/lib/gf2k/lch14_reed_solomon_test.cc +110 -0
  241. data/vendor/longfellow-zk/lib/gf2k/lch14_test.cc +246 -0
  242. data/vendor/longfellow-zk/lib/gf2k/sysdep.h +329 -0
  243. data/vendor/longfellow-zk/lib/ligero/ligero_param.h +449 -0
  244. data/vendor/longfellow-zk/lib/ligero/ligero_prover.h +354 -0
  245. data/vendor/longfellow-zk/lib/ligero/ligero_test.cc +136 -0
  246. data/vendor/longfellow-zk/lib/ligero/ligero_transcript.h +67 -0
  247. data/vendor/longfellow-zk/lib/ligero/ligero_verifier.h +272 -0
  248. data/vendor/longfellow-zk/lib/merkle/merkle_commitment.h +104 -0
  249. data/vendor/longfellow-zk/lib/merkle/merkle_tree.h +216 -0
  250. data/vendor/longfellow-zk/lib/merkle/merkle_tree_test.cc +240 -0
  251. data/vendor/longfellow-zk/lib/proto/circuit.h +354 -0
  252. data/vendor/longfellow-zk/lib/proto/circuit_test.cc +202 -0
  253. data/vendor/longfellow-zk/lib/random/random.h +119 -0
  254. data/vendor/longfellow-zk/lib/random/random_test.cc +189 -0
  255. data/vendor/longfellow-zk/lib/random/secure_random_engine.h +37 -0
  256. data/vendor/longfellow-zk/lib/random/transcript.h +193 -0
  257. data/vendor/longfellow-zk/lib/random/transcript_test.cc +344 -0
  258. data/vendor/longfellow-zk/lib/sumcheck/circuit.h +148 -0
  259. data/vendor/longfellow-zk/lib/sumcheck/circuit_id.h +71 -0
  260. data/vendor/longfellow-zk/lib/sumcheck/equad.h +126 -0
  261. data/vendor/longfellow-zk/lib/sumcheck/hquad.h +115 -0
  262. data/vendor/longfellow-zk/lib/sumcheck/prover.h +59 -0
  263. data/vendor/longfellow-zk/lib/sumcheck/prover_layers.h +362 -0
  264. data/vendor/longfellow-zk/lib/sumcheck/quad.h +227 -0
  265. data/vendor/longfellow-zk/lib/sumcheck/quad_builder.h +211 -0
  266. data/vendor/longfellow-zk/lib/sumcheck/quad_test.cc +169 -0
  267. data/vendor/longfellow-zk/lib/sumcheck/sumcheck_test.cc +324 -0
  268. data/vendor/longfellow-zk/lib/sumcheck/testing.h +69 -0
  269. data/vendor/longfellow-zk/lib/sumcheck/transcript_sumcheck.h +85 -0
  270. data/vendor/longfellow-zk/lib/sumcheck/verifier.h +84 -0
  271. data/vendor/longfellow-zk/lib/sumcheck/verifier_layers.h +221 -0
  272. data/vendor/longfellow-zk/lib/testing/test_main.cc +50 -0
  273. data/vendor/longfellow-zk/lib/util/ceildiv.h +164 -0
  274. data/vendor/longfellow-zk/lib/util/ceildiv_test.cc +152 -0
  275. data/vendor/longfellow-zk/lib/util/crc64.h +45 -0
  276. data/vendor/longfellow-zk/lib/util/crypto.cc +39 -0
  277. data/vendor/longfellow-zk/lib/util/crypto.h +108 -0
  278. data/vendor/longfellow-zk/lib/util/log.cc +110 -0
  279. data/vendor/longfellow-zk/lib/util/log.h +33 -0
  280. data/vendor/longfellow-zk/lib/util/panic.h +40 -0
  281. data/vendor/longfellow-zk/lib/util/readbuffer.h +67 -0
  282. data/vendor/longfellow-zk/lib/util/serialization.h +54 -0
  283. data/vendor/longfellow-zk/lib/zk/zk_common.h +455 -0
  284. data/vendor/longfellow-zk/lib/zk/zk_proof.h +378 -0
  285. data/vendor/longfellow-zk/lib/zk/zk_prover.h +202 -0
  286. data/vendor/longfellow-zk/lib/zk/zk_test.cc +340 -0
  287. data/vendor/longfellow-zk/lib/zk/zk_testing.h +154 -0
  288. data/vendor/longfellow-zk/lib/zk/zk_verifier.h +109 -0
  289. 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_