Skip to content

Instantly share code, notes, and snippets.

@LCamel
Last active May 27, 2023 12:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LCamel/e3dd35efa52338d89c13d913c6be5d42 to your computer and use it in GitHub Desktop.
Save LCamel/e3dd35efa52338d89c13d913c6be5d42 to your computer and use it in GitHub Desktop.
PickOne experiments
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
} */
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)
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)
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)
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