/ circuit / misc.circom
misc.circom
 1  
 2  pragma circom 2.2.0;
 3  
 4  //------------------------------------------------------------------------------
 5  
 6  function FloorLog2(n) {
 7    return (n==0) ? -1 : (1 + FloorLog2(n>>1));
 8  }
 9  
10  function CeilLog2(n) {
11    return (n==0) ? 0 : (1 + FloorLog2(n-1));
12  }
13  
14  //------------------------------------------------------------------------------
15  // decompose an n-bit number into bits (least significant bit first)
16  
17  template ToBits(n) {
18    signal input  inp;
19    signal output out[n];
20  
21    var sum = 0;
22    for(var i=0; i<n; i++) {
23      out[i] <-- (inp >> i) & 1;
24      out[i] * (1-out[i]) === 0;
25      sum += (1<<i) * out[i];
26    }
27  
28    inp === sum;
29  }
30  
31  //------------------------------------------------------------------------------
32  // check equality to zero; that is, compute `(inp==0) ? 1 : 0`
33  
34  template IsZero() {
35    signal input  inp;
36    signal output out;
37  
38    // guess the inverse
39    signal inv;
40    inv <-- (inp != 0) ? (1/inp) : 0 ;
41  
42    // if `inp==0`, then by definition `out==1`
43    // if `out==0`, then the inverse must must exist, so `inp!=0`
44    out <== 1 - inp * inv;
45  
46    // enfore that either `inp` or `out` must be zero
47    inp*out === 0;
48  }
49  
50  //------------------------------------------------------------------------------
51  // check equality of two field elements; that is, computes `(A==B) ? 1 : 0`
52  
53  template IsEqual() {
54    signal input  A,B;
55    signal output out;
56  
57    component isz = IsZero();
58    isz.inp <== A - B;
59    isz.out ==> out;
60  }
61  
62  //------------------------------------------------------------------------------