github.com/consensys/gnark@v0.11.0/internal/backend/circuits/select.go (about)

     1  package circuits
     2  
     3  import (
     4  	"math/big"
     5  
     6  	"github.com/consensys/gnark-crypto/ecc"
     7  	"github.com/consensys/gnark/frontend"
     8  )
     9  
    10  type selectCircuit struct {
    11  	A1, A2, B, C frontend.Variable
    12  }
    13  
    14  func (circuit *selectCircuit) Define(api frontend.API) error {
    15  	a := api.Select(circuit.A1, circuit.B, circuit.C)
    16  	b := api.Select(circuit.A2, circuit.B, circuit.C)
    17  	c := api.Select(circuit.A1, circuit.B, 3)
    18  	d := api.Select(circuit.A2, circuit.B, 3)
    19  	e := api.Select(circuit.A1, 4, circuit.C)
    20  	f := api.Select(circuit.A2, 4, circuit.C)
    21  	g := api.Select(circuit.A1, 3, 4)
    22  	h := api.Select(circuit.A2, 3, 4)
    23  	api.AssertIsEqual(a, circuit.B)
    24  	api.AssertIsEqual(b, circuit.C)
    25  	api.AssertIsEqual(c, circuit.B)
    26  	api.AssertIsEqual(d, 3)
    27  	api.AssertIsEqual(e, 4)
    28  	api.AssertIsEqual(f, circuit.C)
    29  	api.AssertIsEqual(g, 3)
    30  	api.AssertIsEqual(h, 4)
    31  	return nil
    32  }
    33  
    34  func init() {
    35  
    36  	var good, bad selectCircuit
    37  
    38  	a := big.NewInt(2387287246)
    39  	b := big.NewInt(987342642)
    40  	m := ecc.BN254.ScalarField()
    41  	var c big.Int
    42  	c.ModInverse(b, m).Mul(&c, a)
    43  
    44  	good.A1 = 1
    45  	good.A2 = 0
    46  	good.B = 12323
    47  	good.C = 83723
    48  
    49  	bad.A1 = 0
    50  	bad.A2 = 1
    51  	bad.B = 12323
    52  	bad.C = 83723
    53  
    54  	addEntry("select", &selectCircuit{}, &good, &bad, []ecc.ID{ecc.BN254})
    55  }