76 return reference_step_iter(s1, s2, s3, u0, u1, u2, u3);
81TEST(Poseidon2QuadClosedForm, ForwardVandermondeLhsMatchesWeightedSum)
87 { QuadParams::D2, QuadParams::D3, QuadParams::D4 },
88 { QuadParams::D2 * QuadParams::D2, QuadParams::D3 * QuadParams::D3, QuadParams::D4 * QuadParams::D4 } }
90 for (
size_t k = 0; k < 3; ++k) {
91 for (
size_t i = 0; i < 7; ++i) {
92 FF expected = weights[k][0] * QuadParams::tables.closed_form[1][i] +
93 weights[k][1] * QuadParams::tables.closed_form[2][i] +
94 weights[k][2] * QuadParams::tables.closed_form[3][i];
95 EXPECT_EQ(QuadParams::tables.forward_vandermonde_lhs[k][i], expected) <<
"row " << k <<
" col " << i;
100TEST(Poseidon2QuadClosedForm, MatchesStepIteration)
102 for (
int trial = 0; trial < 100; ++trial) {
111 Out ref = reference_from_wires(w_r, w_o, w_4, u0, u1, u2, u3);
112 Out cf = closed_form(w_r, w_o, w_4, u0, u1, u2, u3);
114 EXPECT_EQ(ref.out_0, cf.out_0) <<
"trial " << trial;
115 EXPECT_EQ(ref.out_1, cf.out_1) <<
"trial " << trial;
116 EXPECT_EQ(ref.out_2, cf.out_2) <<
"trial " << trial;
117 EXPECT_EQ(ref.out_3, cf.out_3) <<
"trial " << trial;
127TEST(Poseidon2QuadClosedForm, TerminalU3CoefIsOne)
129 EXPECT_EQ(QuadParams::tables.closed_form[QuadParams::OUT_1][QuadParams::U_3],
FF(1));
130 EXPECT_EQ(QuadParams::tables.closed_form[QuadParams::OUT_2][QuadParams::U_3],
FF(1));
131 EXPECT_EQ(QuadParams::tables.closed_form[QuadParams::OUT_3][QuadParams::U_3],
FF(1));
141TEST(Poseidon2QuadClosedForm, MatchesStepIterationOnEdgeCases)
144 const FF one =
FF(1);
145 const FF neg_one = -
FF(1);
150 FF w_r, w_o, w_4, u0, u1, u2, u3;
154 {
"all_zero", zero, zero, zero, zero, zero, zero, zero },
155 {
"all_one", one, one, one, one, one, one, one },
156 {
"all_neg_one", neg_one, neg_one, neg_one, neg_one, neg_one, neg_one, neg_one },
157 {
"p_half", p_half, p_half, p_half, p_half, p_half, p_half, p_half },
158 {
"u0_zero", one, one, one, zero, one, one, one },
159 {
"u3_zero", one, one, one, one, one, one, zero },
171 for (
const auto& t : trials) {
172 Out ref = reference_from_wires(t.w_r, t.w_o, t.w_4, t.u0, t.u1, t.u2, t.u3);
173 Out cf = closed_form(t.w_r, t.w_o, t.w_4, t.u0, t.u1, t.u2, t.u3);
175 EXPECT_EQ(ref.out_0, cf.out_0) <<
"trial " << t.name;
176 EXPECT_EQ(ref.out_1, cf.out_1) <<
"trial " << t.name;
177 EXPECT_EQ(ref.out_2, cf.out_2) <<
"trial " << t.name;
178 EXPECT_EQ(ref.out_3, cf.out_3) <<
"trial " << t.name;