From 7e81d48a317e037e551b3f9fc3b82a34fd493442 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Wed, 21 Jan 2026 13:39:20 +0000 Subject: [PATCH 1/2] feat: unroll loop for adding final fields into state --- src/poseidon2.nr | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/poseidon2.nr b/src/poseidon2.nr index 27b9255..97bcbb9 100644 --- a/src/poseidon2.nr +++ b/src/poseidon2.nr @@ -70,10 +70,23 @@ impl Poseidon2 { } // handle remaining elements after last full RATE-sized chunk - let remainder_start = (in_len / RATE) * RATE; - for j in remainder_start..in_len { - state[j - remainder_start] += input[j]; - } + let num_extra_fields = in_len % RATE; + let remainder_start = in_len - num_extra_fields; + state[0] += if num_extra_fields > 0 { + input[remainder_start] + } else { + 0 + }; + state[1] += if num_extra_fields > 1 { + input[remainder_start + 1] + } else { + 0 + }; + state[2] += if num_extra_fields > 2 { + input[remainder_start + 2] + } else { + 0 + }; } else { let mut states: [[Field; 4]; N / RATE + 1] = [[0; 4]; N / RATE + 1]; states[0] = state; From c92ab8fa07cef647b3a36434404271d3780fe0ba Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Wed, 21 Jan 2026 17:26:33 +0000 Subject: [PATCH 2/2] feat: remove unnecessary state write --- src/poseidon2.nr | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/poseidon2.nr b/src/poseidon2.nr index 97bcbb9..9183560 100644 --- a/src/poseidon2.nr +++ b/src/poseidon2.nr @@ -71,22 +71,13 @@ impl Poseidon2 { // handle remaining elements after last full RATE-sized chunk let num_extra_fields = in_len % RATE; - let remainder_start = in_len - num_extra_fields; - state[0] += if num_extra_fields > 0 { - input[remainder_start] - } else { - 0 - }; - state[1] += if num_extra_fields > 1 { - input[remainder_start + 1] - } else { - 0 - }; - state[2] += if num_extra_fields > 2 { - input[remainder_start + 2] - } else { - 0 - }; + if num_extra_fields != 0 { + let remainder_start = in_len - num_extra_fields; + state[0] += input[remainder_start]; + if num_extra_fields > 1 { + state[1] += input[remainder_start + 1] + } + } } else { let mut states: [[Field; 4]; N / RATE + 1] = [[0; 4]; N / RATE + 1]; states[0] = state;