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 }