2023-10-25 18:12:26 +02:00
|
|
|
pragma circom 2.0.0;
|
|
|
|
|
|
2024-03-12 09:50:13 +01:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
function FloorLog2(n) {
|
|
|
|
|
return (n==0) ? -1 : (1 + FloorLog2(n>>1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function CeilLog2(n) {
|
|
|
|
|
return (n==0) ? 0 : (1 + FloorLog2(n-1));
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-25 18:12:26 +02:00
|
|
|
//------------------------------------------------------------------------------
|
2024-02-12 12:10:28 +01:00
|
|
|
// decompose an n-bit number into bits (least significant bit first)
|
2023-10-25 18:12:26 +02:00
|
|
|
|
|
|
|
|
template ToBits(n) {
|
|
|
|
|
signal input inp;
|
|
|
|
|
signal output out[n];
|
|
|
|
|
|
|
|
|
|
var sum = 0;
|
|
|
|
|
for(var i=0; i<n; i++) {
|
|
|
|
|
out[i] <-- (inp >> i) & 1;
|
|
|
|
|
out[i] * (1-out[i]) === 0;
|
|
|
|
|
sum += (1<<i) * out[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inp === sum;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
// check equality to zero; that is, compute `(inp==0) ? 1 : 0`
|
|
|
|
|
|
|
|
|
|
template IsZero() {
|
|
|
|
|
signal input inp;
|
|
|
|
|
signal output out;
|
|
|
|
|
|
|
|
|
|
// guess the inverse
|
|
|
|
|
signal inv;
|
|
|
|
|
inv <-- (inp != 0) ? (1/inp) : 0 ;
|
|
|
|
|
|
|
|
|
|
// if `inp==0`, then by definition `out==1`
|
|
|
|
|
// if `out==0`, then the inverse must must exist, so `inp!=0`
|
|
|
|
|
out <== 1 - inp * inv;
|
|
|
|
|
|
|
|
|
|
// enfore that either `inp` or `out` must be zero
|
2024-02-08 13:40:44 +01:00
|
|
|
inp*out === 0;
|
2023-10-25 18:12:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2024-02-08 13:40:44 +01:00
|
|
|
// check equality of two field elements; that is, computes `(A==B) ? 1 : 0`
|
2023-10-25 18:12:26 +02:00
|
|
|
|
|
|
|
|
template IsEqual() {
|
|
|
|
|
signal input A,B;
|
|
|
|
|
signal output out;
|
|
|
|
|
|
|
|
|
|
component isz = IsZero();
|
2023-11-28 12:32:36 +01:00
|
|
|
isz.inp <== A - B;
|
2023-10-25 18:12:26 +02:00
|
|
|
isz.out ==> out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|