Last active
May 27, 2023 12:33
-
-
Save LCamel/e3dd35efa52338d89c13d913c6be5d42 to your computer and use it in GitHub Desktop.
PickOne experiments
This file contains 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.4; | |
include "circomlib/multiplexer.circom"; | |
include "circomlib/comparators.circom"; | |
// Pick in[sel] | |
template PickOne(N) { | |
signal input in[N]; | |
signal input sel; | |
signal output out; | |
component mux = Multiplexer(1, N); | |
for (var i = 0; i < N; i++) { mux.inp[i][0] <== in[i]; } | |
mux.sel <== sel; | |
out <== mux.out[0]; | |
} | |
template PickOne2(N) { | |
signal input in[N]; | |
signal input sel; | |
signal output out; | |
component eqs[N]; | |
signal sums[N]; | |
eqs[0] = IsEqual(); | |
eqs[0].in[0] <== 0; | |
eqs[0].in[1] <== sel; | |
sums[0] <== eqs[0].out * in[0]; | |
for (var i = 1; i < N; i++) { | |
eqs[i] = IsEqual(); | |
eqs[i].in[0] <== i; | |
eqs[i].in[1] <== sel; | |
sums[i] <== eqs[i].out * in[i] + sums[i - 1]; | |
} | |
out <== sums[N - 1]; | |
} | |
template Mul() { | |
signal input a; | |
signal input b; | |
signal output out; | |
out <== a * b; | |
} | |
template PickOne3(N) { | |
signal input in[N]; | |
signal input sel; | |
signal output out; | |
var sum = 0; | |
signal picked[N]; | |
for (var i = 0; i < N; i++) { | |
picked[i] <== Mul()(IsEqual()([i, sel]), in[i]); | |
sum += picked[i]; | |
} | |
out <== sum; | |
} | |
template PickOne4(N) { | |
signal input in[N]; | |
signal input sel; | |
signal output out; | |
signal oneAtSel[N]; | |
var oneCount = 0; | |
for (var i = 0; i < N; i++) { | |
oneAtSel[i] <-- (i == sel) ? 1 : 0; // 1 at sel, otherwise 0 | |
oneAtSel[i] * (oneAtSel[i] - 1) === 0; // only 0 or 1 | |
oneCount += oneAtSel[i]; | |
} | |
oneCount === 1; | |
var sum = 0; | |
signal picked[N]; | |
for (var i = 0; i < N; i++) { | |
picked[i] <== oneAtSel[i] * in[i]; | |
sum += picked[i]; | |
} | |
out <== sum; | |
} | |
//component main = PickOne(10); | |
//component main = PickOne2(10); | |
//component main = PickOne3(10); | |
component main = PickOne4(10); | |
/* INPUT = { | |
"in": [ 0, 11, 22, 33, 44, 55, 66, 77, 88, 99 ], | |
"sel": 5 | |
} */ |
This file contains 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
STDOUT: | |
template instances: 4 | |
non-linear constraints: 20 | |
linear constraints: 0 | |
public inputs: 0 | |
public outputs: 1 | |
private inputs: 11 | |
private outputs: 0 | |
wires: 31 | |
labels: 68 | |
Written successfully: ./main.r1cs | |
Written successfully: ./main.sym | |
Written successfully: ./main_js/main.wasm | |
Everything went okay, circom safe | |
Compiled in 4.95s | |
OUTPUT: | |
out = 55 | |
ARTIFACTS: | |
Finished in 6.60s | |
main.wasm (37.55KB) | |
main.js (9.18KB) | |
main.wtns (1.07KB) | |
main.r1cs (3.70KB) | |
main.sym (1.78KB) |
This file contains 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
STDOUT: | |
template instances: 3 | |
non-linear constraints: 30 | |
linear constraints: 0 | |
public inputs: 0 | |
public outputs: 1 | |
private inputs: 11 | |
private outputs: 0 | |
wires: 42 | |
labels: 83 | |
Written successfully: ./main.r1cs | |
Written successfully: ./main.sym | |
Written successfully: ./main_js/main.wasm | |
Everything went okay, circom safe | |
Compiled in 3.42s | |
OUTPUT: | |
out = 55 | |
ARTIFACTS: | |
Finished in 6.35s | |
main.wasm (36.52KB) | |
main.js (9.18KB) | |
main.wtns (1.42KB) | |
main.r1cs (5.02KB) | |
main.sym (2.01KB) |
This file contains 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
STDOUT: | |
template instances: 4 | |
non-linear constraints: 30 | |
linear constraints: 0 | |
public inputs: 0 | |
public outputs: 1 | |
private inputs: 11 | |
private outputs: 0 | |
wires: 42 | |
labels: 123 | |
Written successfully: ./main.r1cs | |
Written successfully: ./main.sym | |
Written successfully: ./main_js/main.wasm | |
Everything went okay, circom safe | |
Compiled in 0.84s | |
OUTPUT: | |
out = 55 | |
ARTIFACTS: | |
Finished in 1.74s | |
main.wasm (37.03KB) | |
main.js (9.18KB) | |
main.wtns (1.42KB) | |
main.r1cs (5.02KB) | |
main.sym (3.90KB) |
This file contains 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
STDOUT: | |
template instances: 1 | |
non-linear constraints: 20 | |
linear constraints: 0 | |
public inputs: 0 | |
public outputs: 1 | |
private inputs: 11 | |
private outputs: 0 | |
wires: 30 | |
labels: 33 | |
Written successfully: ./main.r1cs | |
Written successfully: ./main.sym | |
Written successfully: ./main_js/main.wasm | |
Everything went okay, circom safe | |
Compiled in 3.02s | |
OUTPUT: | |
out = 55 | |
ARTIFACTS: | |
Finished in 3.56s | |
main.wasm (35.11KB) | |
main.js (9.18KB) | |
main.wtns (1.04KB) | |
main.r1cs (3.98KB) | |
main.sym (0.69KB) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment