Last active
May 14, 2025 17:58
-
-
Save namrapatel/78b2c0485b9c28935c8c7d0d3c3390c4 to your computer and use it in GitHub Desktop.
Variable Length Subarray selection in Circom
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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