From a8eb03329478b48a8eed3eb65913e48226e47ee9 Mon Sep 17 00:00:00 2001 From: Youssef El Housni Date: Wed, 8 Jan 2025 10:13:52 -0500 Subject: [PATCH] perf(emulated): small perf on doubleAndAdd (#1386) --- internal/stats/latest_stats.csv | 6 +++--- std/algebra/emulated/sw_emulated/point.go | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/internal/stats/latest_stats.csv b/internal/stats/latest_stats.csv index 45f69ecb5..e54404e66 100644 --- a/internal/stats/latest_stats.csv +++ b/internal/stats/latest_stats.csv @@ -216,7 +216,7 @@ scalar_mul_G1_bn254,bls24_315,groth16,0,0 scalar_mul_G1_bn254,bls24_317,groth16,0,0 scalar_mul_G1_bn254,bw6_761,groth16,0,0 scalar_mul_G1_bn254,bw6_633,groth16,0,0 -scalar_mul_G1_bn254,bn254,plonk,220594,207103 +scalar_mul_G1_bn254,bn254,plonk,220030,206539 scalar_mul_G1_bn254,bls12_377,plonk,0,0 scalar_mul_G1_bn254,bls12_381,plonk,0,0 scalar_mul_G1_bn254,bls24_315,plonk,0,0 @@ -230,7 +230,7 @@ scalar_mul_P256,bls24_315,groth16,0,0 scalar_mul_P256,bls24_317,groth16,0,0 scalar_mul_P256,bw6_761,groth16,0,0 scalar_mul_P256,bw6_633,groth16,0,0 -scalar_mul_P256,bn254,plonk,294014,274427 +scalar_mul_P256,bn254,plonk,293762,274175 scalar_mul_P256,bls12_377,plonk,0,0 scalar_mul_P256,bls12_381,plonk,0,0 scalar_mul_P256,bls24_315,plonk,0,0 @@ -244,7 +244,7 @@ scalar_mul_secp256k1,bls24_315,groth16,0,0 scalar_mul_secp256k1,bls24_317,groth16,0,0 scalar_mul_secp256k1,bw6_761,groth16,0,0 scalar_mul_secp256k1,bw6_633,groth16,0,0 -scalar_mul_secp256k1,bn254,plonk,223354,209690 +scalar_mul_secp256k1,bn254,plonk,222782,209118 scalar_mul_secp256k1,bls12_377,plonk,0,0 scalar_mul_secp256k1,bls12_381,plonk,0,0 scalar_mul_secp256k1,bls24_315,plonk,0,0 diff --git a/std/algebra/emulated/sw_emulated/point.go b/std/algebra/emulated/sw_emulated/point.go index 6defe337e..aef54a391 100644 --- a/std/algebra/emulated/sw_emulated/point.go +++ b/std/algebra/emulated/sw_emulated/point.go @@ -376,7 +376,8 @@ func (c *Curve[B, S]) doubleAndAdd(p, q *AffinePoint[B]) *AffinePoint[B] { mone := c.baseApi.NewElement(-1) // compute λ1 = (q.y-p.y)/(q.x-p.x) yqyp := c.baseApi.Sub(&q.Y, &p.Y) - xqxp := c.baseApi.Sub(&q.X, &p.X) + xpn := c.baseApi.Neg(&p.X) + xqxp := c.baseApi.Add(&q.X, xpn) λ1 := c.baseApi.Div(yqyp, xqxp) // compute x2 = λ1²-p.x-q.x @@ -386,7 +387,7 @@ func (c *Curve[B, S]) doubleAndAdd(p, q *AffinePoint[B]) *AffinePoint[B] { // compute -λ2 = λ1+2*p.y/(x2-p.x) ypyp := c.baseApi.MulConst(&p.Y, big.NewInt(2)) - x2xp := c.baseApi.Sub(x2, &p.X) + x2xp := c.baseApi.Add(x2, xpn) λ2 := c.baseApi.Div(ypyp, x2xp) λ2 = c.baseApi.Add(λ1, λ2) @@ -394,7 +395,7 @@ func (c *Curve[B, S]) doubleAndAdd(p, q *AffinePoint[B]) *AffinePoint[B] { x3 := c.baseApi.Eval([][]*emulated.Element[B]{{λ2, λ2}, {mone, &p.X}, {mone, x2}}, []int{1, 1, 1}) // compute y3 = -λ2*(x3 - p.x)-p.y - y3 := c.baseApi.Eval([][]*emulated.Element[B]{{λ2, c.baseApi.Sub(x3, &p.X)}, {mone, &p.Y}}, []int{1, 1}) + y3 := c.baseApi.Eval([][]*emulated.Element[B]{{λ2, c.baseApi.Add(x3, xpn)}, {mone, &p.Y}}, []int{1, 1}) return &AffinePoint[B]{ X: *c.baseApi.Reduce(x3),