Skip to content

Commit a4ff7ec

Browse files
committed
G1Projective add double
1 parent f9f88f5 commit a4ff7ec

File tree

1 file changed

+57
-11
lines changed

1 file changed

+57
-11
lines changed

src/circuits/bn254/g1.rs

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,78 @@ impl G1Projective {
77
}
88

99
impl G1Projective {
10+
// http://koclab.cs.ucsb.edu/teaching/ccs130h/2018/09projective.pdf
1011
pub fn add(p: Wires, q: Wires) -> Circuit {
1112
assert_eq!(p.len(), Self::N_BITS);
1213
assert_eq!(q.len(), Self::N_BITS);
1314
let mut circuit = Circuit::empty();
1415

15-
let px = p[0..Fq::N_BITS].to_vec();
16-
let py = p[Fq::N_BITS..2*Fq::N_BITS].to_vec();
17-
let pz = p[2*Fq::N_BITS..3*Fq::N_BITS].to_vec();
18-
let qx = q[0..Fq::N_BITS].to_vec();
19-
let qy = q[Fq::N_BITS..2*Fq::N_BITS].to_vec();
20-
let qz = q[2*Fq::N_BITS..3*Fq::N_BITS].to_vec();
16+
let x1 = p[0..Fq::N_BITS].to_vec();
17+
let y1 = p[Fq::N_BITS..2*Fq::N_BITS].to_vec();
18+
let z1 = p[2*Fq::N_BITS..3*Fq::N_BITS].to_vec();
19+
let x2 = q[0..Fq::N_BITS].to_vec();
20+
let y2 = q[Fq::N_BITS..2*Fq::N_BITS].to_vec();
21+
let z2 = q[2*Fq::N_BITS..3*Fq::N_BITS].to_vec();
2122

22-
todo!();
23+
let z1s = circuit.extend(Fq::square(z1.clone()));
24+
let z2s = circuit.extend(Fq::square(z2.clone()));
25+
let u1 = circuit.extend(Fq::mul(x1.clone(), z2s.clone()));
26+
let u2 = circuit.extend(Fq::mul(x2.clone(), z1s.clone()));
27+
let s1 = circuit.extend(Fq::mul(y1.clone(), z2s.clone()));
28+
let s2 = circuit.extend(Fq::mul(y2.clone(), z1s.clone()));
29+
let r = circuit.extend(Fq::sub(s1.clone(), s2.clone()));
30+
let h = circuit.extend(Fq::sub(u1.clone(), u2.clone()));
31+
let h2 = circuit.extend(Fq::square(h.clone()));
32+
let g = circuit.extend(Fq::mul(h.clone(), h2.clone()));
33+
let v = circuit.extend(Fq::mul(u1.clone(), h2.clone()));
34+
let r2 = circuit.extend(Fq::square(r.clone()));
35+
let r2g = circuit.extend(Fq::add(r2.clone(), g.clone()));
36+
let vd = circuit.extend(Fq::double(v.clone()));
37+
let x3 = circuit.extend(Fq::sub(r2g.clone(), vd.clone()));
38+
let vx3 = circuit.extend(Fq::sub(v.clone(), x3.clone()));
39+
let w = circuit.extend(Fq::mul(r.clone(), vx3.clone()));
40+
let s1g = circuit.extend(Fq::mul(s1.clone(), g.clone()));
41+
let y3 = circuit.extend(Fq::sub(w.clone(), s1g.clone()));
42+
let z1z2 = circuit.extend(Fq::mul(z1.clone(), z2.clone()));
43+
let z3 = circuit.extend(Fq::mul(z1z2.clone(), h.clone()));
2344

45+
circuit.add_wires(x3);
46+
circuit.add_wires(y3);
47+
circuit.add_wires(z3);
48+
2449
circuit
2550
}
2651

2752
pub fn double(p: Wires) -> Circuit {
2853
assert_eq!(p.len(), Self::N_BITS);
2954
let mut circuit = Circuit::empty();
3055

31-
let px = p[0..Fq::N_BITS].to_vec();
32-
let py = p[Fq::N_BITS..2*Fq::N_BITS].to_vec();
33-
let pz = p[2*Fq::N_BITS..3*Fq::N_BITS].to_vec();
56+
let x = p[0..Fq::N_BITS].to_vec();
57+
let y = p[Fq::N_BITS..2*Fq::N_BITS].to_vec();
58+
let z = p[2*Fq::N_BITS..3*Fq::N_BITS].to_vec();
3459

35-
todo!();
60+
let x2 = circuit.extend(Fq::square(x.clone()));
61+
let y2 = circuit.extend(Fq::square(y.clone()));
62+
let m = circuit.extend(Fq::triple(x2.clone()));
63+
let t = circuit.extend(Fq::square(y2.clone()));
64+
let xy2 = circuit.extend(Fq::mul(x.clone(), y2.clone()));
65+
let xy2d = circuit.extend(Fq::double(xy2.clone()));
66+
let s = circuit.extend(Fq::double(xy2d.clone()));
67+
let m2 = circuit.extend(Fq::square(m.clone()));
68+
let sd = circuit.extend(Fq::double(s.clone()));
69+
let xr = circuit.extend(Fq::sub(m2.clone(), sd.clone()));
70+
let sxr = circuit.extend(Fq::sub(s.clone(), xr.clone()));
71+
let msxr = circuit.extend(Fq::mul(m.clone(), sxr.clone()));
72+
let td = circuit.extend(Fq::double(t.clone()));
73+
let tdd = circuit.extend(Fq::double(td.clone()));
74+
let tddd = circuit.extend(Fq::double(tdd.clone()));
75+
let yr = circuit.extend(Fq::sub(msxr.clone(), tddd.clone()));
76+
let yz = circuit.extend(Fq::mul(y.clone(), z.clone()));
77+
let zr = circuit.extend(Fq::double(yz.clone()));
78+
79+
circuit.add_wires(xr);
80+
circuit.add_wires(yr);
81+
circuit.add_wires(zr);
3682

3783
circuit
3884
}

0 commit comments

Comments
 (0)