Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GKR Gate Registry #652

Merged
merged 44 commits into from
Mar 26, 2025
Merged
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
9a79951
feat: interpolate
Tabaie Feb 25, 2025
721f563
refactor: GKR gate registry and automatic degree detection for bn254
Tabaie Feb 25, 2025
3e24c87
chore: generify polynomial stuff
Tabaie Feb 25, 2025
ed999a9
chore: generify gkr changes
Tabaie Feb 25, 2025
214d91e
chore: codegen rough edges
Tabaie Feb 25, 2025
8348df6
refactor: rename f to Evaluate
Tabaie Feb 25, 2025
17b431f
fix: poseidon2 permutations
Tabaie Feb 25, 2025
a15b428
refactor: make registerGateOption public
Tabaie Mar 4, 2025
3313753
fix: intKeySBox2 degree
Tabaie Mar 4, 2025
0e61ecb
refactor: rename linearVar to solvableVar
Tabaie Mar 4, 2025
ca2d409
chore: generify linearVar refactor
Tabaie Mar 4, 2025
8cd59b5
fix: IsAdditive allow f to modify input slice
Tabaie Mar 5, 2025
01ad8f3
perf: explicitly assign solvable vars in poseidon2 gkr
Tabaie Mar 5, 2025
d5afd4f
fix: no solvable vars in mul2
Tabaie Mar 6, 2025
5678e1d
revert: remove isLinear
Tabaie Mar 14, 2025
7366adf
perf: Interpolate to use Lagrange rather than Gauss
Tabaie Mar 18, 2025
d372a1e
chore: generify Lagrange interpolation
Tabaie Mar 18, 2025
826a175
revert: gaussian interpolation
Tabaie Mar 18, 2025
5871cdd
revert: adapt test to gaussian method
Tabaie Mar 18, 2025
b1e296b
revert: back to lagrange
Tabaie Mar 18, 2025
a8a4d51
revert: remove interpolate; use FFT instead
Tabaie Mar 18, 2025
e461ff3
fix: use of FFTInverse
Tabaie Mar 18, 2025
a45ed95
chore: generify changes
Tabaie Mar 18, 2025
522ef76
fix: separate fitPoly impl for small rational
Tabaie Mar 18, 2025
892d390
fix: small rational fitPoly interface
Tabaie Mar 18, 2025
282d3f1
revert: restore RegisterGate modifications
Tabaie Mar 18, 2025
cf8775f
chore: only generate gkr for fields with fft
Tabaie Mar 22, 2025
834e426
Merge branch 'master' into refactor/gkr-gate-registry
Tabaie Mar 22, 2025
ffacd69
feat: separate codegen for registry
Tabaie Mar 22, 2025
b584699
feat: adapt codegen for FFT availability
Tabaie Mar 22, 2025
9219476
fix: unused import
Tabaie Mar 22, 2025
dd5838e
refactor: remove setRandom
Tabaie Mar 22, 2025
54bc10f
refactor: register.go
Tabaie Mar 22, 2025
24627ea
refactor: expose degree and solvability detection; unexpose gate removal
Tabaie Mar 22, 2025
be041b0
refactor: remove removeGate
Tabaie Mar 22, 2025
42e24d7
test: failing case (1 + X - Y)
Tabaie Mar 26, 2025
b888122
fix: deg(x-y) = 1 for bn254
Tabaie Mar 26, 2025
96e096a
chore: generify fix with FFT
Tabaie Mar 26, 2025
ebfe2e8
fix: deg(x-y) = 1 for no-fft
Tabaie Mar 26, 2025
f06cbc2
feat: explicit error for zero gates
Tabaie Mar 26, 2025
60bce0c
chore: generify
Tabaie Mar 26, 2025
b69f8ab
refactor: remove "GateName" from name constants
Tabaie Mar 26, 2025
04b802b
docs: gate descriptions
Tabaie Mar 26, 2025
d71194b
refactor: increase increase factor
Tabaie Mar 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
revert: back to lagrange
Tabaie committed Mar 18, 2025
commit b1e296b0ab4edae42fc758ba636aebf3e33a7410
93 changes: 49 additions & 44 deletions internal/generator/polynomial/template/polynomial.go.tmpl
Original file line number Diff line number Diff line change
@@ -302,58 +302,63 @@ func computeLagrangeBasis(domainSize uint8) []Polynomial {
return res
}


// Interpolate fits a polynomial of degree len(X) - 1 = len(Y) - 1 to the points (X[i], Y[i])
// Note that the runtime is O(len(X)³)
func Interpolate(X, Y []{{.ElementType}}) (Polynomial, error) {
// Returns the evaluation at r
//
// Note that this runs in O(len(X)²).
// When possible, it is better to exploit any structure in the domain
// (i.e. the values in X) to compute the polynomial in linear time.
func Interpolate(X, Y []{{.ElementType}}, r {{.ElementType}}) {{.ElementType}} {
if len(X) != len(Y) {
return nil, errors.New("X and Y must have the same length")
panic("X and Y must have the same length")
}

// solve the system of equations by Gaussian elimination
augmentedRows := make([][]{{.ElementType}}, len(X)) // the last column is the Y values
for i := range augmentedRows {
augmentedRows[i] = make([]{{.ElementType}}, len(X)+1)
augmentedRows[i][0].SetOne()
augmentedRows[i][1].Set(&X[i])
for j := 2; j < len(augmentedRows[i])-1; j++ {
augmentedRows[i][j].Mul(&augmentedRows[i][j-1], &X[i])
}
augmentedRows[i][len(augmentedRows[i])-1].Set(&Y[i])
switch len(X) {
case 0:
return {{.ElementType}}{}
case 1:
return Y[0]
}

// make the upper triangle
for i := range len(augmentedRows) - 1 {
// use row i to eliminate the ith element in all rows below
var negInv {{.ElementType}}
if augmentedRows[i][i].IsZero() {
return nil, errors.New("singular matrix")
}
negInv.Inverse(&augmentedRows[i][i])
negInv.Neg(&negInv)
for j := i + 1; j < len(augmentedRows); j++ {
var c {{.ElementType}}
c.Mul(&augmentedRows[j][i], &negInv)
// augmentedRows[j][i].SetZero() omitted
for k := i + 1; k < len(augmentedRows[i]); k++ {
var t {{.ElementType}}
t.Mul(&augmentedRows[i][k], &c)
augmentedRows[j][k].Add(&augmentedRows[j][k], &t)
// weights[i] = 1 / [(X[i] - X[0]) * (X[i] - X[1]) * ... * (X[i] - X[i-1]) * (X[i] - X[i+1]) * ... * (X[i] - X[n-1])]
weights := make([]{{.ElementType}}, len(X))
for i := range weights {
weights[i].SetOne()
for j := range weights {
if i == j {
continue
}
}
}

// back substitution
res := make(Polynomial, len(X))
for i := len(augmentedRows) - 1; i >= 0; i-- {
res[i] = augmentedRows[i][len(augmentedRows[i])-1]
for j := i + 1; j < len(augmentedRows[i])-1; j++ {
var t {{.ElementType}}
t.Mul(&res[j], &augmentedRows[i][j])
res[i].Sub(&res[i], &t)
t.Sub(&X[i], &X[j])
weights[i].Mul(&weights[i], &t)
}
res[i].Div(&res[i], &augmentedRows[i][i])
}
weights = {{.FieldPackageName}}.BatchInvert(weights)

// prods[i] = (r-X[i+1]) * (r-X[i+2]) * ... (r-X[n-1])
prods := make([]{{.ElementType}}, len(X))
prods[len(X)-1].SetOne()
prods[len(X)-2].Sub(&r, &X[len(X)-1])
for i := len(X) - 3; i >= 0; i-- {
var t {{.ElementType}}
t.Sub(&r, &X[i+1])
prods[i].Mul(&prods[i+1], &t)
}

// at iteration i, prod = (r-X[0]) * (r-X[1]) * ... * (r-X[i-1])
prod := {{.FieldPackageName}}.One()
var res {{.ElementType}}

for i := range X {
var t {{.ElementType}}
t.Mul(&prod, &prods[i]) // t = (r-X[0]) * (r-X[1]) * ... * (r-X[i-1]) * (r-X[i+1]) * ... * (r-X[n-1])
t.Mul(&t, &weights[i]) // t = (r-X[0]) * (r-X[1]) * ... * (r-X[i-1]) * (r-X[i+1]) * ... * (r-X[n-1]) / [(X[i] - X[0]) * (X[i] - X[1]) * ... * (X[i] - X[i-1]) * (X[i] - X[i+1]) * ... * (X[i] - X[n-1])]
// t is now the evaluation of the i'th Lagrange basis at r

return res, nil
t.Mul(&t, &Y[i])
res.Add(&res, &t)

t.Sub(&r, &X[i])
prod.Mul(&prod, &t)
}
return res
}