Skip to content

Instantly share code, notes, and snippets.

@namrapatel
Last active May 14, 2025 17:58
Show Gist options
  • Select an option

  • Save namrapatel/78b2c0485b9c28935c8c7d0d3c3390c4 to your computer and use it in GitHub Desktop.

Select an option

Save namrapatel/78b2c0485b9c28935c8c7d0d3c3390c4 to your computer and use it in GitHub Desktop.
Variable Length Subarray selection in Circom
pragma circom 2.1.2;
include "circomlib/comparators.circom";
template CalculateTotal(N) {
signal input in[N];
signal output out;
signal outs[N];
outs[0] <== in[0];
for (var i=1; i < N; i++) {
outs[i] <== outs[i - 1] + in[i];
}
out <== outs[N - 1];
}
template AtIndex(N) {
signal input array[N];
signal input index;
signal output out;
component result = CalculateTotal(N);
for (var i = 0; i < N; i++) {
// Check if i == index
var isEqual = IsEqual()([i, index]);
// Pass the element in as non-zero value if isEqual == true
result.in[i] <== isEqual * array[i];
}
out <== result.out; // Return the
}
template VarSubarray() {
signal input in[1000];
signal input start;
signal input end;
signal output out[1000];
// Select the elements at the indexes between start and end, and 0-pad the rest
component selections[1000];
component rangeChecks[1000];
// Change to i < lengthOfSelectionYourWant for speed
for(var i = 0; i < 1000; i++) {
// Check that start + i < diff
rangeChecks[i] = LessThan(10);
rangeChecks[i].in[0] <== start + i;
rangeChecks[i].in[1] <== end;
// Get the element at index: start + i
selections[i] = AtIndex(1000);
selections[i].array <== in;
selections[i].index <== start + i;
// If we are out of (end - start) range, out[i] <== 0
// If we are in the range, out[i] <== our selection
out[i] <== selections[i].out * rangeChecks[i].out;
}
// Require that start >= 0
component startCheck = GreaterEqThan(10);
startCheck.in[0] <== start;
startCheck.in[1] <== 0;
startCheck.out === 1;
// Require that end < 1000
component endCheck = LessThan(10);
endCheck.in[0] <== end;
endCheck.in[1] <== 1000;
endCheck.out === 1;
}
component main { public [ in, start, end ] } = VarSubarray();
/* INPUT = {
"in": ["5", "4", "8", "9", "6", "2", "1", "6", "6", "2", "5", "1", "1", "4", "5", "3", "1", "4", "8", "9", "2", "4", "8", "5", "7", "5", "2", "2", "8", "9", "8", "4", "7", "5", "9", "2", "3", "9", "7", "6", "7", "3", "6", "2", "9", "4", "4", "6", "9", "8", "7", "2", "8", "4", "5", "3", "1", "8", "4", "9", "4", "3", "3", "9", "7", "1", "5", "5", "6", "3", "7", "5", "4", "6", "6", "1", "2", "1", "8", "6", "9", "4", "8", "2", "3", "1", "1", "7", "9", "4", "9", "6", "1", "7", "2", "9", "6", "5", "1", "4", "7", "9", "5", "3", "4", "6", "6", "9", "7", "6", "6", "3", "6", "1", "7", "6", "7", "6", "8", "9", "3", "7", "4", "3", "9", "7", "2", "8", "7", "8", "6", "9", "3", "2", "1", "6", "8", "3", "5", "7", "2", "6", "3", "1", "2", "9", "6", "7", "6", "2", "4", "4", "1", "1", "6", "3", "5", "7", "1", "1", "9", "9", "8", "7", "3", "3", "3", "3", "6", "6", "9", "9", "7", "1", "9", "6", "5", "8", "9", "8", "5", "5", "8", "1", "6", "8", "4", "8", "2", "2", "7", "2", "5", "3", "4", "2", "9", "8", "4", "2", "1", "8", "8", "5", "3", "4", "7", "1", "1", "5", "7", "3", "6", "1", "5", "1", "1", "1", "2", "7", "5", "5", "2", "3", "8", "7", "3", "9", "8", "1", "7", "1", "3", "5", "2", "7", "5", "4", "2", "8", "3", "1", "9", "1", "9", "7", "9", "6", "2", "4", "2", "7", "6", "9", "1", "3", "1", "9", "9", "2", "8", "9", "1", "4", "7", "4", "2", "7", "7", "1", "7", "7", "9", "5", "9", "1", "1", "2", "8", "6", "6", "7", "8", "6", "6", "3", "1", "7", "3", "3", "8", "5", "8", "1", "9", "7", "6", "2", "5", "2", "8", "1", "4", "8", "8", "5", "6", "4", "2", "5", "7", "2", "7", "7", "7", "3", "7", "9", "8", "7", "2", "9", "1", "7", "9", "3", "6", "9", "7", "7", "8", "9", "6", "2", "7", "4", "2", "6", "7", "3", "5", "6", "5", "2", "3", "4", "2", "6", "5", "7", "5", "6", "4", "2", "1", "9", "2", "6", "2", "4", "4", "7", "7", "7", "6", "5", "9", "4", "3", "6", "6", "9", "6", "5", "7", "6", "3", "8", "4", "4", "4", "2", "4", "1", "3", "7", "7", "1", "3", "1", "6", "7", "7", "8", "5", "4", "4", "1", "3", "3", "3", "8", "1", "8", "9", "4", "2", "4", "7", "5", "5", "8", "7", "2", "2", "9", "7", "1", "9", "6", "3", "2", "7", "7", "7", "6", "3", "1", "6", "6", "6", "4", "1", "7", "7", "3", "9", "2", "1", "5", "7", "7", "1", "3", "6", "2", "1", "2", "1", "4", "5", "3", "2", "1", "7", "1", "6", "9", "1", "9", "3", "7", "4", "7", "5", "8", "1", "6", "9", "7", "6", "7", "4", "8", "9", "9", "3", "1", "7", "6", "5", "6", "1", "5", "5", "8", "9", "1", "4", "4", "6", "8", "8", "8", "2", "8", "6", "6", "2", "7", "7", "5", "5", "1", "3", "6", "7", "3", "1", "3", "1", "9", "6", "6", "4", "3", "8", "2", "9", "4", "6", "5", "4", "8", "5", "4", "7", "9", "2", "1", "9", "6", "3", "8", "5", "7", "7", "9", "2", "3", "1", "3", "1", "2", "7", "6", "1", "5", "5", "6", "7", "3", "5", "8", "3", "2", "5", "1", "1", "5", "3", "2", "7", "2", "6", "1", "4", "8", "6", "1", "7", "3", "5", "8", "6", "3", "9", "1", "6", "1", "8", "8", "4", "4", "6", "2", "2", "9", "4", "8", "9", "6", "1", "8", "7", "9", "2", "7", "5", "6", "1", "3", "3", "7", "4", "9", "4", "9", "1", "3", "3", "1", "1", "7", "2", "4", "5", "5", "4", "6", "6", "9", "4", "7", "6", "4", "3", "5", "9", "2", "9", "9", "1", "8", "1", "5", "7", "9", "3", "5", "1", "8", "7", "7", "4", "4", "6", "7", "2", "1", "8", "4", "6", "1", "8", "6", "6", "7", "9", "5", "7", "7", "4", "6", "8", "6", "8", "3", "1", "7", "3", "3", "1", "6", "9", "9", "9", "4", "8", "7", "1", "9", "1", "7", "5", "7", "3", "7", "7", "9", "7", "6", "5", "3", "6", "6", "4", "6", "9", "9", "7", "8", "8", "7", "8", "2", "3", "8", "2", "6", "5", "9", "8", "6", "3", "2", "5", "5", "4", "3", "2", "4", "3", "9", "2", "2", "5", "2", "7", "4", "7", "6", "9", "7", "8", "5", "2", "9", "4", "9", "9", "3", "4", "3", "7", "4", "9", "9", "8", "2", "8", "8", "5", "4", "4", "5", "7", "1", "4", "1", "4", "4", "8", "4", "9", "2", "2", "2", "8", "2", "1", "1", "8", "3", "7", "6", "5", "1", "7", "6", "8", "3", "3", "6", "3", "3", "2", "2", "1", "8", "6", "4", "9", "6", "8", "4", "5", "7", "5", "1", "4", "1", "6", "6", "4", "8", "5", "6", "6", "5", "9", "8", "1", "7", "5", "4", "4", "7", "2", "2", "3", "2", "7", "5", "4", "5", "1", "5", "7", "8", "3", "7", "8", "1", "2", "4", "4", "5", "6", "4", "1", "1", "8", "9", "8", "4", "1", "1", "7", "1", "9", "5", "1", "5", "9", "3", "9", "5", "5", "4", "7", "8", "4", "7", "3", "7", "1", "7", "9", "5", "9", "5", "3", "8", "3", "9", "8", "1", "8", "6", "5", "6", "9", "7", "2", "9", "5", "2", "6", "7", "6", "5", "1", "8", "2", "4", "4", "8", "4", "2", "5", "3", "5", "8", "2", "4", "1", "8", "4", "3", "4", "8", "3", "8", "7", "6", "7", "4", "8", "1", "9", "4", "7", "5", "7", "7", "8", "4", "2", "6", "3", "2", "8", "9", "2", "7", "1", "2", "1", "5", "9", "9", "5", "3", "7", "7", "1", "3", "9", "3", "8", "7", "7", "2", "2", "5", "4", "1", "5", "1", "5", "8", "8", "2", "4", "4", "1", "5", "4", "2", "1", "3", "5", "6", "1", "7", "2", "1", "1", "2", "7", "5", "5", "6", "4", "3", "4", "8", "7", "3", "9", "7", "4", "1", "2", "5", "8", "8", "4", "7"],
"start": "10",
"end": "20"
} */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment