Skip to content

Commit 9bb4153

Browse files
authored
Merge pull request #1085 from Consensys/perf/ec-arithmetic-2chain
Perf: optimize scalar multiplication for 2-chains
2 parents ce0186e + 2d17ac1 commit 9bb4153

File tree

16 files changed

+970
-422
lines changed

16 files changed

+970
-422
lines changed

internal/stats/latest.stats

0 Bytes
Binary file not shown.

std/algebra/emulated/sw_emulated/point.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ func (c *Curve[B, S]) scalarMulGLV(Q *AffinePoint[B], s *emulated.Element[S], op
582582
// B1 = Q+Φ(Q)
583583
// B2 = -Q-Φ(Q)
584584
// B3 = Q-Φ(Q)
585-
// B4 = -(Q)
585+
// B4 = -Q+Φ(Q)
586586
//
587587
// If we extend this by merging two iterations, we need to look up P and P'
588588
// both from {B1, B2, B3, B4} and compute:

std/algebra/native/fields_bls12377/e12_pairing.go

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,17 @@ func (e *E12) Square034(api frontend.API, x E12) *E12 {
2222

2323
c0.B0.Sub(api, x.C0.B0, x.C1.B0)
2424
c0.B1.Neg(api, x.C1.B1)
25-
c0.B2 = E2{0, 0}
2625

2726
c3.B0 = x.C0.B0
2827
c3.B1.Neg(api, x.C1.B0)
2928
c3.B2.Neg(api, x.C1.B1)
3029

3130
c2.Mul0By01(api, x.C0.B0, x.C1.B0, x.C1.B1)
32-
c3.MulBy01(api, c0.B0, c0.B1).Add(api, c3, c2)
33-
e.C1.B0.Add(api, c2.B0, c2.B0)
34-
e.C1.B1.Add(api, c2.B1, c2.B1)
31+
c3.MulBy01(api, c0.B0, c0.B1)
32+
c3.B0.Add(api, c3.B0, c2.B0)
33+
c3.B1.Add(api, c3.B1, c2.B1)
34+
e.C1.B0.MulByFp(api, c2.B0, 2)
35+
e.C1.B1.MulByFp(api, c2.B1, 2)
3536

3637
e.C0.B0 = c3.B0
3738
e.C0.B1.Add(api, c3.B1, c2.B0)
@@ -49,8 +50,7 @@ func (e *E12) MulBy034(api frontend.API, c3, c4 E2) *E12 {
4950
b := e.C1
5051

5152
b.MulBy01(api, c3, c4)
52-
53-
c3.Add(api, E2{A0: 1, A1: 0}, c3)
53+
c3.A0 = api.Add(1, c3.A0)
5454
d.Add(api, e.C0, e.C1)
5555
d.MulBy01(api, c3, c4)
5656

@@ -81,17 +81,19 @@ func Mul034By034(api frontend.API, d3, d4, c3, c4 E2) *[5]E2 {
8181
}
8282

8383
func Mul01234By034(api frontend.API, x [5]E2, z3, z4 E2) *E12 {
84-
var a, b, z1, z0, one E6
85-
var zero E2
86-
zero.SetZero()
87-
one.SetOne()
84+
var a, b, z1, z0 E6
8885
c0 := &E6{B0: x[0], B1: x[1], B2: x[2]}
89-
c1 := &E6{B0: x[3], B1: x[4], B2: zero}
90-
a.Add(api, one, E6{B0: z3, B1: z4, B2: zero})
91-
b.Add(api, *c0, *c1)
92-
a.Mul(api, a, b)
86+
a.B0.A0 = api.Add(z3.A0, 1)
87+
a.B0.A1 = z3.A1
88+
a.B1 = z4
89+
a.B2.A0 = 0
90+
a.B2.A1 = 0
91+
b.B0.Add(api, c0.B0, x[3])
92+
b.B1.Add(api, c0.B1, x[4])
93+
b.B2 = c0.B2
94+
b.MulBy01(api, a.B0, a.B1)
9395
c := *Mul01By01(api, z3, z4, x[3], x[4])
94-
z1.Sub(api, a, *c0)
96+
z1.Sub(api, b, *c0)
9597
z1.Sub(api, z1, c)
9698
z0.MulByNonResidue(api, c)
9799
z0.Add(api, z0, *c0)
@@ -103,12 +105,11 @@ func Mul01234By034(api frontend.API, x [5]E2, z3, z4 E2) *E12 {
103105

104106
func (e *E12) MulBy01234(api frontend.API, x [5]E2) *E12 {
105107
var a, b, c, z1, z0 E6
106-
var zero E2
107-
zero.SetZero()
108108
c0 := &E6{B0: x[0], B1: x[1], B2: x[2]}
109-
c1 := &E6{B0: x[3], B1: x[4], B2: zero}
110109
a.Add(api, e.C0, e.C1)
111-
b.Add(api, *c0, *c1)
110+
b.B0.Add(api, x[0], x[3])
111+
b.B1.Add(api, x[1], x[4])
112+
b.B2 = x[2]
112113
a.Mul(api, a, b)
113114
b.Mul(api, e.C0, *c0)
114115
c = e.C1

std/algebra/native/fields_bls12377/e2.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ func (e *E2) Add(api frontend.API, e1, e2 E2) *E2 {
6868

6969
// Double e2 elmt
7070
func (e *E2) Double(api frontend.API, e1 E2) *E2 {
71-
e.A0 = api.Add(e1.A0, e1.A0)
72-
e.A1 = api.Add(e1.A1, e1.A1)
71+
e.A0 = api.Mul(e1.A0, 2)
72+
e.A1 = api.Mul(e1.A1, 2)
7373
return e
7474
}
7575

0 commit comments

Comments
 (0)