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,242 @@
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_GF2K_LCH14_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_GF2K_LCH14_H_
17
+
18
+ #include <stdio.h>
19
+
20
+ #include <vector>
21
+
22
+ #include "util/panic.h"
23
+
24
+ // The algorithm from [LCH14] following [DP24, Algorithm 2]
25
+ //
26
+ // [LCH14] Sian-Jheng Lin, Wei-Ho Chung, and Yunghsiang S. Han: Novel
27
+ // Polynomial Basis and Its Application to Reed-Solomon Erasure Codes,
28
+ // https://arxiv.org/pdf/1404.3458
29
+
30
+ // [DP24] Benjamin E. Diamond and Jim Posen, Polylogarithmic Proofs
31
+ // for Multilinears over Binary Towers, https://eprint.iacr.org/2024/504
32
+
33
+ namespace proofs {
34
+
35
+ template <class Field>
36
+ class LCH14 {
37
+ using Elt = typename Field::Elt;
38
+
39
+ // only works in binary fields
40
+ static_assert(Field::kCharacteristicTwo);
41
+
42
+ public:
43
+ static constexpr size_t kSubFieldBits = Field::kSubFieldBits;
44
+
45
+ explicit LCH14(const Field &F) : f_(F) {
46
+ // Compute W_i(\beta_j) for all i, j.
47
+
48
+ // We store the unnormalized W_[i][j] = W_i(\beta_j)
49
+ // in the same memory as the normalized \hat{W}_i(\beta_j), since
50
+ // the unnormalized values are not needed after normalization.
51
+
52
+ // In an attempt to improve clarity, we syntactically distinguish
53
+ // the unnormalized array W from the normalized array w_hat_,
54
+ // but one must be mindful that the two names alias to the
55
+ // same memory locations.
56
+ auto W = w_hat_;
57
+
58
+ // Base case: W_0(X) = X
59
+ for (size_t j = 0; j < kSubFieldBits; ++j) {
60
+ W[0][j] = f_.beta(j);
61
+ }
62
+
63
+ // Inductive case: W_{i+1}(X) = W_i(X)(W_i(X)+W_i(\beta_i))
64
+ for (size_t i = 0; i + 1 < kSubFieldBits; ++i) {
65
+ for (size_t j = 0; j < kSubFieldBits; ++j) {
66
+ W[i + 1][j] = f_.mulf(W[i][j], f_.addf(W[i][j], W[i][i]));
67
+ }
68
+ }
69
+
70
+ // normalized \hat{W}_i(\beta j)
71
+ for (size_t i = 0; i < kSubFieldBits; ++i) {
72
+ Elt scale = f_.invertf(W[i][i]);
73
+ for (size_t j = 0; j < kSubFieldBits; ++j) {
74
+ w_hat_[i][j] = f_.mulf(scale, W[i][j]);
75
+ }
76
+ }
77
+ }
78
+
79
+ // Computation of a single twiddle factor.
80
+ // Implicit in [LCH14, III.E], explicit in [DP24, Algorithm 2].
81
+ Elt twiddle(size_t i, size_t u) const {
82
+ Elt t = f_.zero();
83
+ for (size_t k = 0; u != 0; ++k, u >>= 1) {
84
+ if (u & 1) {
85
+ f_.add(t, w_hat_[i][k]);
86
+ }
87
+ }
88
+ return t;
89
+ }
90
+
91
+ // linear-time computation of all twiddles at the same time
92
+ void twiddles(size_t i, size_t l, size_t coset, Elt tw[]) const {
93
+ tw[0] = twiddle(i, coset);
94
+ for (size_t k = 0; (i + 1) + k < l; ++k) {
95
+ Elt shift = w_hat_[i][(i + 1) + k];
96
+ for (size_t u = 0; u < (k1 << k); ++u) {
97
+ tw[u + (k1 << k)] = f_.addf(tw[u], shift);
98
+ }
99
+ }
100
+ }
101
+
102
+ size_t ntwiddles(size_t l) const { return k1 << (l - 1); }
103
+
104
+ // Notation from [DP24, Algorithm 2], except that we hardcode R=0
105
+ // and add the coset parameter.
106
+ void FFT(size_t l, size_t coset, Elt B[/* n = (1 << l) */]) const {
107
+ check(l <= kSubFieldBits, "l <= kSubFieldBits");
108
+
109
+ if (l > 0) {
110
+ // space for twiddle factors
111
+ std::vector<Elt> tw(ntwiddles(l));
112
+
113
+ for (size_t i = l; i-- > 0;) {
114
+ size_t s = k1 << i;
115
+ twiddles(i, l, coset, &tw[0]);
116
+ for (size_t u = 0; (u << (i + 1)) < (k1 << l); ++u) {
117
+ Elt twu = tw[u];
118
+ for (size_t v = 0; v < s; ++v) {
119
+ butterfly_fwd(B, (u << (i + 1)) + v, s, twu);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ void IFFT(size_t l, size_t coset, Elt B[/* n = (1 << l) */]) const {
127
+ check(l <= kSubFieldBits, "l <= kSubFieldBits");
128
+
129
+ if (l > 0) {
130
+ // space for twiddle factors
131
+ std::vector<Elt> tw(ntwiddles(l));
132
+
133
+ for (size_t i = 0; i < l; ++i) {
134
+ size_t s = k1 << i;
135
+ twiddles(i, l, coset, &tw[0]);
136
+ for (size_t u = 0; (u << (i + 1)) < (k1 << l); ++u) {
137
+ Elt twu = tw[u];
138
+ for (size_t v = 0; v < s; ++v) {
139
+ butterfly_bwd(B, (u << (i + 1)) + v, s, twu);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ void BidirectionalFFT(size_t l, size_t k, Elt B[/* n = (1 << l) */]) const {
147
+ check(l <= kSubFieldBits, "l <= kSubFieldBits");
148
+ bidir_recur(/*i=*/l, /*coset=*/0, k, B);
149
+ }
150
+
151
+ // debug access to w_hat_
152
+ Elt WHat_DEBUG(size_t i, size_t j) const { return w_hat_[i][j]; }
153
+
154
+ private:
155
+ // avoid writing static_cast<size_t>(1) all the time.
156
+ static constexpr size_t k1 = 1;
157
+
158
+ const Field &f_;
159
+
160
+ // precomputed [i][j] -> \hat{W}(\beta_j)
161
+ Elt w_hat_[kSubFieldBits][kSubFieldBits];
162
+
163
+ // The algorithm described in Joris van der Hoeven, "The Truncated
164
+ // Fourier Transform and Applications". This implementation is
165
+ // based on the pseudo-code from the followup paper "Notes on the
166
+ // Truncated Fourier Transform", also by Joris van der Hoeven.
167
+ //
168
+ // Van der Hoeven considers the classic multiplicative FFT;
169
+ // here we port the algorithm to the [LCH14] adaptive FFT.
170
+
171
+ // Here we call the algorithm the "Bidirectional FFT", because
172
+ // the algorithm takes a set of points in the "time" domain
173
+ // and the complementary set of points in the "frequency" domain,
174
+ // and it flips time and frequency, so the algorithm can be
175
+ // used to compute the forward and backward transforms, as well
176
+ // as combinations of the two.
177
+ //
178
+ // The literature on the truncated Fourier transforms assumes that
179
+ // the complementary set of points are implicitly set to zero, and
180
+ // the main problem is how to avoid storing the zeroes. Our main
181
+ // problem is not time or space efficiency, but polynomial
182
+ // interpolation. Given k evaluations of a polynomial of degree <k,
183
+ // compute the other evaluations up to n=2^l. So we care about both
184
+ // the unknown nonzero coefficients and the unknown n-k evaluations.
185
+ void bidir_recur(size_t i, size_t coset, size_t k,
186
+ Elt B[/* n = (1 << i) */]) const {
187
+ if (i-- > 0) {
188
+ size_t s = k1 << i;
189
+ Elt twu = twiddle(i, coset);
190
+
191
+ if (k < s) {
192
+ for (size_t uv = k; uv < s; ++uv) {
193
+ butterfly_fwd(B, uv, s, twu);
194
+ }
195
+
196
+ bidir_recur(i, coset, k, B);
197
+
198
+ for (size_t uv = 0; uv < k; ++uv) {
199
+ butterfly_diag(B, uv, s, twu);
200
+ }
201
+
202
+ FFT(i, coset + s, B + s);
203
+ } else /* k >= s */ {
204
+ IFFT(i, coset, B);
205
+
206
+ for (size_t uv = k - s; uv < s; ++uv) {
207
+ butterfly_diag(B, uv, s, twu);
208
+ }
209
+
210
+ bidir_recur(i, coset + s, k - s, B + s);
211
+
212
+ for (size_t uv = 0; uv < k - s; ++uv) {
213
+ butterfly_bwd(B, uv, s, twu);
214
+ }
215
+ }
216
+ }
217
+ }
218
+
219
+ inline void butterfly_fwd(Elt B[], size_t uv, size_t s,
220
+ const Elt &twu) const {
221
+ f_.add(B[uv], f_.mulf(twu, B[uv + s]));
222
+ f_.add(B[uv + s], B[uv]);
223
+ }
224
+
225
+ inline void butterfly_bwd(Elt B[], size_t uv, size_t s,
226
+ const Elt &twu) const {
227
+ f_.sub(B[uv + s], B[uv]);
228
+ f_.sub(B[uv], f_.mulf(twu, B[uv + s]));
229
+ }
230
+
231
+ // forward at [uv + s], backward at [uv]
232
+ inline void butterfly_diag(Elt B[], size_t uv, size_t s,
233
+ const Elt &twu) const {
234
+ Elt b1 = B[uv + s];
235
+ f_.add(B[uv + s], B[uv]);
236
+ f_.sub(B[uv], f_.mulf(twu, b1));
237
+ }
238
+ };
239
+
240
+ } // namespace proofs
241
+
242
+ #endif // PRIVACY_PROOFS_ZK_LIB_GF2K_LCH14_H_
@@ -0,0 +1,75 @@
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 <cstddef>
16
+ #include <vector>
17
+
18
+ #include "gf2k/gf2_128.h"
19
+ #include "gf2k/lch14.h"
20
+ #include "third_party/benchmark/include/benchmark/benchmark.h"
21
+
22
+ namespace proofs {
23
+ using Field = GF2_128<5>; // use 32-bit subfield for large FFTs
24
+ using Elt = Field::Elt;
25
+ static const Field F;
26
+ static const LCH14<Field> FFT(F);
27
+
28
+ void BM_LCH14_FFT(benchmark::State& state) {
29
+ size_t l = state.range(0);
30
+ size_t N = 1 << l;
31
+ std::vector<Elt> A(N);
32
+ for (size_t i = 0; i < N; ++i) {
33
+ A[i] = F.x();
34
+ }
35
+
36
+ for (auto _ : state) {
37
+ FFT.FFT(l, /*coset=*/0, A.data());
38
+ }
39
+ }
40
+
41
+ BENCHMARK(BM_LCH14_FFT)->DenseRange(2, 20);
42
+
43
+ void BM_LCH14_IFFT(benchmark::State& state) {
44
+ size_t l = state.range(0);
45
+ size_t N = 1 << l;
46
+ std::vector<Elt> A(N);
47
+ for (size_t i = 0; i < N; ++i) {
48
+ A[i] = F.x();
49
+ }
50
+
51
+ for (auto _ : state) {
52
+ FFT.IFFT(l, /*coset=*/0, A.data());
53
+ }
54
+ }
55
+
56
+ BENCHMARK(BM_LCH14_IFFT)->DenseRange(2, 20);
57
+
58
+ void BM_LCH14_BidirectionalFFT(benchmark::State& state) {
59
+ size_t l = state.range(0);
60
+ size_t N = 1 << l;
61
+ std::vector<Elt> A(N);
62
+ for (size_t i = 0; i < N; ++i) {
63
+ A[i] = F.x();
64
+ }
65
+
66
+ for (auto _ : state) {
67
+ FFT.BidirectionalFFT(l, /*k=*/N - 1, A.data());
68
+ }
69
+ }
70
+
71
+ BENCHMARK(BM_LCH14_BidirectionalFFT)->DenseRange(2, 20);
72
+
73
+ } // namespace proofs
74
+
75
+ BENCHMARK_MAIN();
@@ -0,0 +1,127 @@
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_GF2K_LCH14_REED_SOLOMON_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_GF2K_LCH14_REED_SOLOMON_H_
17
+
18
+ #include <stdio.h>
19
+
20
+ #include <algorithm>
21
+ #include <memory>
22
+ #include <vector>
23
+
24
+ #include "gf2k/lch14.h"
25
+
26
+ namespace proofs {
27
+
28
+ template <class Field>
29
+ class LCH14ReedSolomon {
30
+ using Elt = typename Field::Elt;
31
+
32
+ // only works in binary fields
33
+ static_assert(Field::kCharacteristicTwo);
34
+
35
+ public:
36
+ // We interpolate N points, assumed to be the evaluations at
37
+ // F.of_scalar(i), 0 <= i < N, of a polynomial of degree <N, to M
38
+ // points 0 <= i < M. (Thus, the M points include the N points
39
+ // we started with.)
40
+ //
41
+ // In principle we don't need to know N and M at construction time,
42
+ // but we require N and M for compatibility of the interface with
43
+ // the ReedSolomon class over prime fields.
44
+ LCH14ReedSolomon(size_t n, size_t m, const Field& F)
45
+ : f_(F), n_(n), m_(m), fft_(F) {}
46
+
47
+ // Y[i] is expected to be defined for 0 <= i < N, and this
48
+ // routine fills it for 0 <= i < M
49
+ void interpolate(Elt y[/*m*/]) const {
50
+ // determine the FFT size
51
+ size_t l = 0;
52
+ size_t fftn = 1;
53
+ while (fftn < n_) {
54
+ fftn <<= 1;
55
+ ++l;
56
+ }
57
+
58
+ // "coefficients" in the LCH14 novel polynomial basis
59
+ std::vector<Elt> C(fftn);
60
+
61
+ // compute the "coefficients" under the assumption
62
+ // that we know n_ evaluations and that the higher-order
63
+ // (fftn - n_) "coefficients" are zero.
64
+ for (size_t i = 0; i < n_; ++i) {
65
+ C[i] = y[i];
66
+ }
67
+ for (size_t i = n_; i < fftn; ++i) {
68
+ C[i] = f_.zero();
69
+ }
70
+ fft_.BidirectionalFFT(l, /*k=*/n_, &C[0]);
71
+
72
+ // fill in the missing evaluations in the first coset, since we
73
+ // already have the missing evaluations in C[[n_, (1<<l))]
74
+ for (size_t i = n_; i < std::min(m_, fftn); ++i) {
75
+ y[i] = C[i];
76
+ }
77
+
78
+ // revert C to pure coefficients for later use
79
+ for (size_t i = n_; i < fftn; ++i) {
80
+ C[i] = f_.zero();
81
+ }
82
+
83
+ // all remaining cosets:
84
+ for (size_t coset = 1; (coset << l) < m_; ++coset) {
85
+ size_t b = (coset << l);
86
+ if (b + fftn <= m_) {
87
+ // if the coset fits completely within Y[],
88
+ // copy the coefficients into Y and transform in place
89
+ for (size_t i = 0; i < fftn; ++i) {
90
+ y[i + b] = C[i];
91
+ }
92
+ fft_.FFT(l, b, &y[b]);
93
+ } else {
94
+ // Partial fit. Transform C and copy the output.
95
+ fft_.FFT(l, b, &C[0]);
96
+ for (size_t i = 0; i + b < m_; ++i) {
97
+ y[i + b] = C[i];
98
+ }
99
+ // Now we have destroyed C, but this is ok because
100
+ // this is the last iteration
101
+ }
102
+ }
103
+ }
104
+
105
+ private:
106
+ const Field& f_;
107
+ size_t n_;
108
+ size_t m_;
109
+ LCH14<Field> fft_;
110
+ };
111
+
112
+ template <class Field>
113
+ class LCH14ReedSolomonFactory {
114
+ public:
115
+ explicit LCH14ReedSolomonFactory(const Field& f) : f_(f) {}
116
+
117
+ std::unique_ptr<LCH14ReedSolomon<Field>> make(size_t n, size_t m) const {
118
+ return std::make_unique<LCH14ReedSolomon<Field>>(n, m, f_);
119
+ }
120
+
121
+ private:
122
+ const Field& f_;
123
+ };
124
+
125
+ } // namespace proofs
126
+
127
+ #endif // PRIVACY_PROOFS_ZK_LIB_GF2K_LCH14_REED_SOLOMON_H_
@@ -0,0 +1,110 @@
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 "gf2k/lch14_reed_solomon.h"
16
+
17
+ #include <cstddef>
18
+ #include <vector>
19
+
20
+ #include "algebra/bogorng.h"
21
+ #include "gf2k/gf2_128.h"
22
+ #include "benchmark/benchmark.h"
23
+ #include "gtest/gtest.h"
24
+
25
+ namespace proofs {
26
+ namespace {
27
+
28
+ using Field = GF2_128<5>;
29
+ using Elt = Field::Elt;
30
+ static const Field F;
31
+
32
+ // slow evaluation in the monomial basis
33
+ static Elt eval_monomial(size_t n, const Elt M[/*n*/], const Elt& x) {
34
+ Elt e{};
35
+
36
+ for (size_t i = n; i-- > 0;) {
37
+ e = F.addf(M[i], F.mulf(e, x));
38
+ }
39
+ return e;
40
+ }
41
+
42
+ TEST(LCH14, ReedSolomon) {
43
+ std::vector<size_t> test_m = {1, 7, 8, 9, 63, 64, 65, 99, 128};
44
+ LCH14ReedSolomonFactory<Field> rs_factory(F);
45
+
46
+ for (size_t m : test_m) {
47
+ for (size_t n = 1; n < m; ++n) {
48
+ auto rs = rs_factory.make(n, m);
49
+ std::vector<Elt> M(n); // monomial basis
50
+ std::vector<Elt> Y(m);
51
+
52
+ for (size_t i = 0; i < n; ++i) {
53
+ M[i] = F.of_scalar(i * i + 42 + (m + 11) * (n + 22));
54
+ }
55
+
56
+ // produce N points
57
+ for (size_t i = 0; i < n; ++i) {
58
+ Y[i] = eval_monomial(n, &M[0], F.of_scalar(i));
59
+ }
60
+
61
+ rs->interpolate(&Y[0]);
62
+
63
+ for (size_t i = 0; i < m; ++i) {
64
+ EXPECT_EQ(Y[i], eval_monomial(n, &M[0], F.of_scalar(i)));
65
+ }
66
+ }
67
+ }
68
+ }
69
+ } // namespace
70
+
71
+ namespace bench {
72
+ void BM_ReedSolomon_gf128(benchmark::State& state) {
73
+ size_t n = state.range(0);
74
+ if (4 * n < 1 << 16) {
75
+ using Field = GF2_128<4>;
76
+ using Elt = Field::Elt;
77
+ static const Field F;
78
+ LCH14ReedSolomonFactory<Field> rs_factory(F);
79
+ Bogorng<Field> rng(&F);
80
+ auto rs = rs_factory.make(n, n * 4);
81
+
82
+ std::vector<Elt> L2(n + n * 4);
83
+ for (size_t i = 0; i < n; ++i) {
84
+ L2[i] = rng.next();
85
+ }
86
+ for (auto _ : state) {
87
+ rs->interpolate(&L2[0]);
88
+ }
89
+ } else {
90
+ using Field = GF2_128<5>;
91
+ using Elt = Field::Elt;
92
+ static const Field F;
93
+ LCH14ReedSolomonFactory<Field> rs_factory(F);
94
+ Bogorng<Field> rng(&F);
95
+ auto rs = rs_factory.make(n, n * 4);
96
+
97
+ std::vector<Elt> L2(n + n * 4);
98
+ for (size_t i = 0; i < n; ++i) {
99
+ L2[i] = rng.next();
100
+ }
101
+ for (auto _ : state) {
102
+ rs->interpolate(&L2[0]);
103
+ }
104
+ }
105
+ }
106
+
107
+ BENCHMARK(BM_ReedSolomon_gf128)->RangeMultiplier(4)->Range(1 << 10, 1 << 20);
108
+
109
+ } // namespace bench
110
+ } // namespace proofs