Browse Source

constraint optimizations for assertLeadingZeros

main
Kevin Jue 1 year ago
parent
commit
daad394f73
2 changed files with 7 additions and 8 deletions
  1. +2
    -8
      fri/fri.go
  2. +5
    -0
      goldilocks/base.go

+ 2
- 8
fri/fri.go

@ -75,14 +75,8 @@ func (f *Chip) ToOpenings(c variables.OpeningSet) Openings {
func (f *Chip) assertLeadingZeros(powWitness gl.Variable, friConfig types.FriConfig) { func (f *Chip) assertLeadingZeros(powWitness gl.Variable, friConfig types.FriConfig) {
// Asserts that powWitness'es big-endian bit representation has at least friConfig.ProofOfWorkBits leading zeros. // Asserts that powWitness'es big-endian bit representation has at least friConfig.ProofOfWorkBits leading zeros.
// Note that this is assuming that the Goldilocks field is being used. Specfically that the // Note that this is assuming that the Goldilocks field is being used. Specfically that the
// field is 64 bits long
maxPowWitness := uint64(math.Pow(2, float64(64-friConfig.ProofOfWorkBits))) - 1
// TODO: This does an un-nessary reduce, since powWitness is already range checked to be within GL field.
reducedPowWitness := f.gl.Reduce(powWitness)
// TODO: Can replace with with std.rangecheck.Check. Will probably be less contraints.
f.api.AssertIsLessOrEqual(reducedPowWitness.Limb, frontend.Variable(maxPowWitness))
// field is 64 bits long.
f.gl.RangeCheckWithMaxBits(powWitness, 64-friConfig.ProofOfWorkBits)
} }
func (f *Chip) fromOpeningsAndAlpha( func (f *Chip) fromOpeningsAndAlpha(

+ 5
- 0
goldilocks/base.go

@ -333,6 +333,11 @@ func (p *Chip) RangeCheck(x Variable) {
) )
} }
// This function will assert that the field element x is less than 2^maxNbBits.
func (p *Chip) RangeCheckWithMaxBits(x Variable, maxNbBits uint64) {
p.rangeChecker.Check(x.Limb, int(maxNbBits))
}
func (p *Chip) AssertIsEqual(x, y Variable) { func (p *Chip) AssertIsEqual(x, y Variable) {
p.api.AssertIsEqual(x.Limb, y.Limb) p.api.AssertIsEqual(x.Limb, y.Limb)
} }

Loading…
Cancel
Save