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

     1  package circuits
     2  
     3  import (
     4  	"github.com/consensys/gnark/frontend"
     5  )
     6  
     7  type expCircuit struct {
     8  	X, E frontend.Variable
     9  	Y    frontend.Variable `gnark:",public"`
    10  }
    11  
    12  func (circuit *expCircuit) Define(api frontend.API) error {
    13  	o := frontend.Variable(1)
    14  	b := api.ToBinary(circuit.E, 4)
    15  
    16  	var i int
    17  	for i < len(b) {
    18  		o = api.Mul(o, o)
    19  		mu := api.Mul(o, circuit.X)
    20  		o = api.Select(b[len(b)-1-i], mu, o)
    21  		i++
    22  	}
    23  	api.AssertIsEqual(circuit.Y, o)
    24  	return nil
    25  }
    26  
    27  func init() {
    28  	var circuit, good, bad expCircuit
    29  
    30  	good.X = (2)
    31  	good.E = (12)
    32  	good.Y = (4096)
    33  
    34  	bad.X = (2)
    35  	bad.E = (11)
    36  	bad.Y = (4096)
    37  
    38  	addEntry("expo", &circuit, &good, &bad, nil)
    39  }