github.com/consensys/gnark@v0.11.0/internal/backend/circuits/div.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 divCircuit struct {
    11  	A, B frontend.Variable
    12  	C    frontend.Variable `gnark:",public"`
    13  }
    14  
    15  func (circuit *divCircuit) Define(api frontend.API) error {
    16  	c := api.DivUnchecked(circuit.A, circuit.B)
    17  	d := api.DivUnchecked(2387287246, circuit.B)
    18  	e := api.DivUnchecked(circuit.A, 987342642)
    19  	api.AssertIsEqual(c, circuit.C)
    20  	api.AssertIsEqual(d, circuit.C)
    21  	api.AssertIsEqual(e, circuit.C)
    22  	return nil
    23  }
    24  
    25  func init() {
    26  
    27  	var good, bad divCircuit
    28  
    29  	a := big.NewInt(2387287246)
    30  	b := big.NewInt(987342642)
    31  	m := ecc.BN254.ScalarField()
    32  	var c big.Int
    33  	c.ModInverse(b, m).Mul(&c, a)
    34  	c.Mod(&c, m)
    35  
    36  	// good.A = a
    37  	good.A = a
    38  	good.B = b
    39  	good.C = c
    40  
    41  	// bad.A = a
    42  	bad.A = a
    43  	bad.B = b
    44  	bad.C = 1
    45  
    46  	addEntry("div", &divCircuit{}, &good, &bad, []ecc.ID{ecc.BN254})
    47  }