Skip to content

Commit

Permalink
e12:: mul_by01234, mul_034_by_034 optimisation
Browse files Browse the repository at this point in the history
  • Loading branch information
feltroidprime committed Aug 25, 2023
1 parent 17c129b commit 2e15059
Show file tree
Hide file tree
Showing 3 changed files with 183 additions and 12 deletions.
18 changes: 10 additions & 8 deletions src/bn254/towers/e12.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -130,11 +130,13 @@ namespace e12 {
let x04 = e2.add(c4, d4);
let x03 = e2.add(c3, d3);

let tmp = e2.add(c3, c4);
let x34 = e2.add(d3, d4);
let x34 = e2.mul(x34, tmp);
let x34 = e2.sub(x34, x3);
let x34 = e2.sub(x34, x4);
// let tmp = e2.add(c3, c4);
// let x34 = e2.add(d3, d4);
// let x34 = e2.mul(x34, tmp);
// let x34 = e2.sub(x34, x3);
// let x34 = e2.sub(x34, x4);

let x34 = e2.add_add_mul_sub3_sub3(c3, c4, d3, d4, x3, x4);

let zC0B0 = e2.mul_by_non_residue(x4);
let zC0B0 = e2.add(zC0B0, one);
Expand All @@ -158,9 +160,9 @@ namespace e12 {
func mul_by_01234{range_check_ptr}(z: E12*, x: E12*) -> E12* {
alloc_locals;
let (__fp__, _) = get_fp_and_pc();
let a = e6.add(z.c0, z.c1);
let b = e6.add(x.c0, x.c1);
let a = e6.mul(a, b);
// let a = e6.add(z.c0, z.c1);
// let b = e6.add(x.c0, x.c1);
let a = e6.add_add_mul(z.c0, z.c1, x.c0, x.c1);
let b = e6.mul(z.c0, x.c0);
let c = e6.mul_by_01(z.c1, x.c1.b0, x.c1.b1);
let z1 = e6.sub(a, b);
Expand Down
78 changes: 77 additions & 1 deletion src/bn254/towers/e2.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,8 @@ namespace e2 {
local res: E2 = E2(a0, a1);
return &res;
}
func add_add_mul_sub_sub{range_check_ptr}(
// Computes (add_left0 + add0_right) * (add1_left + add1_right) - sub0_right - sub1_right
func add_add_mul_sub5_sub5{range_check_ptr}(
add0_left: E2*,
add0_right: E2*,
add1_left: E2*,
Expand Down Expand Up @@ -594,6 +595,81 @@ namespace e2 {
local res: E2 = E2(res_a0, res_a1);
return &res;
}
// Computes (add_left0 + add0_right) * (add1_left + add1_right) - sub0_right - sub1_right
func add_add_mul_sub3_sub3{range_check_ptr}(
add0_left: E2*,
add0_right: E2*,
add1_left: E2*,
add1_right: E2*,
sub0_right: E2*,
sub1_right: E2*,
) -> E2* {
alloc_locals;
let (__fp__, _) = get_fp_and_pc();

// Add a and b = mul_left
tempvar mul_left_a0: BigInt3 = BigInt3(
add0_left.a0.d0 + add0_right.a0.d0,
add0_left.a0.d1 + add0_right.a0.d1,
add0_left.a0.d2 + add0_right.a0.d2,
);
tempvar mul_left_a1: BigInt3 = BigInt3(
add0_left.a1.d0 + add0_right.a1.d0,
add0_left.a1.d1 + add0_right.a1.d1,
add0_left.a1.d2 + add0_right.a1.d2,
);

tempvar mul_right_a0: BigInt3 = BigInt3(
add1_left.a0.d0 + add1_right.a0.d0,
add1_left.a0.d1 + add1_right.a0.d1,
add1_left.a0.d2 + add1_right.a0.d2,
);
tempvar mul_right_a1: BigInt3 = BigInt3(
add1_left.a1.d0 + add1_right.a1.d0,
add1_left.a1.d1 + add1_right.a1.d1,
add1_left.a1.d2 + add1_right.a1.d2,
);

// Mul mul_left and mul_right
let (a) = bigint_mul(
BigInt3(
mul_left_a0.d0 + mul_left_a1.d0,
mul_left_a0.d1 + mul_left_a1.d1,
mul_left_a0.d2 + mul_left_a1.d2,
),
BigInt3(
mul_right_a0.d0 + mul_right_a1.d0,
mul_right_a0.d1 + mul_right_a1.d1,
mul_right_a0.d2 + mul_right_a1.d2,
),
);
let (b) = bigint_mul(mul_left_a0, mul_right_a0);
let (c) = bigint_mul(mul_left_a1, mul_right_a1);

let res_a0 = reduce_5(
UnreducedBigInt5(
d0=b.d0 - c.d0 - sub0_right.a0.d0 - sub1_right.a0.d0,
d1=b.d1 - c.d1 - sub0_right.a0.d1 - sub1_right.a0.d1,
d2=b.d2 - c.d2 - sub0_right.a0.d2 - sub1_right.a0.d2,
d3=b.d3 - c.d3,
d4=b.d4 - c.d4,
),
);

let res_a1 = reduce_5(
UnreducedBigInt5(
d0=a.d0 - b.d0 - c.d0 - sub0_right.a1.d0 - sub1_right.a1.d0,
d1=a.d1 - b.d1 - c.d1 - sub0_right.a1.d1 - sub1_right.a1.d1,
d2=a.d2 - b.d2 - c.d2 - sub0_right.a1.d2 - sub1_right.a1.d2,
d3=a.d3 - b.d3 - c.d3,
d4=a.d4 - b.d4 - c.d4,
),
);

// End :
local res: E2 = E2(res_a0, res_a1);
return &res;
}

func add_add_mul_sub_sub_mulnr_add{range_check_ptr}(
add0_left: E2*,
Expand Down
99 changes: 96 additions & 3 deletions src/bn254/towers/e6.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ namespace e6 {
local res: E6 = E6(c0, c1, c2);
return &res;
}

// Computes (sub_left - sub_right) * mul_right + add_right
func sub_mul_add_add{range_check_ptr}(
sub_left: E6*, sub_right: E6*, mul_right: E6*, add1_right: E6*, add2_right: E6*
) -> E6* {
Expand Down Expand Up @@ -229,6 +229,99 @@ namespace e6 {
return &res;
}

// Computes (add0_left + add0_right) * (add1_left + add1_right)
func add_add_mul{range_check_ptr}(
add0_left: E6*, add0_right: E6*, add1_left: E6*, add1_right: E6*
) -> E6* {
alloc_locals;
let (__fp__, _) = get_fp_and_pc();
local mul_left_b0_a0: BigInt3 = BigInt3(
add0_left.b0.a0.d0 + add0_right.b0.a0.d0,
add0_left.b0.a0.d1 + add0_right.b0.a0.d1,
add0_left.b0.a0.d2 + add0_right.b0.a0.d2,
);
local mul_left_b0_a1: BigInt3 = BigInt3(
add0_left.b0.a1.d0 + add0_right.b0.a1.d0,
add0_left.b0.a1.d1 + add0_right.b0.a1.d1,
add0_left.b0.a1.d2 + add0_right.b0.a1.d2,
);
local mul_left_b1_a0: BigInt3 = BigInt3(
add0_left.b1.a0.d0 + add0_right.b1.a0.d0,
add0_left.b1.a0.d1 + add0_right.b1.a0.d1,
add0_left.b1.a0.d2 + add0_right.b1.a0.d2,
);
local mul_left_b1_a1: BigInt3 = BigInt3(
add0_left.b1.a1.d0 + add0_right.b1.a1.d0,
add0_left.b1.a1.d1 + add0_right.b1.a1.d1,
add0_left.b1.a1.d2 + add0_right.b1.a1.d2,
);
local mul_left_b2_a0: BigInt3 = BigInt3(
add0_left.b2.a0.d0 + add0_right.b2.a0.d0,
add0_left.b2.a0.d1 + add0_right.b2.a0.d1,
add0_left.b2.a0.d2 + add0_right.b2.a0.d2,
);
local mul_left_b2_a1: BigInt3 = BigInt3(
add0_left.b2.a1.d0 + add0_right.b2.a1.d0,
add0_left.b2.a1.d1 + add0_right.b2.a1.d1,
add0_left.b2.a1.d2 + add0_right.b2.a1.d2,
);
local mul_left_b0: E2 = E2(&mul_left_b0_a0, &mul_left_b0_a1);
local mul_left_b1: E2 = E2(&mul_left_b1_a0, &mul_left_b1_a1);
local mul_left_b2: E2 = E2(&mul_left_b2_a0, &mul_left_b2_a1);

local mul_right_b0_a0: BigInt3 = BigInt3(
add1_left.b0.a0.d0 + add1_right.b0.a0.d0,
add1_left.b0.a0.d1 + add1_right.b0.a0.d1,
add1_left.b0.a0.d2 + add1_right.b0.a0.d2,
);
local mul_right_b0_a1: BigInt3 = BigInt3(
add1_left.b0.a1.d0 + add1_right.b0.a1.d0,
add1_left.b0.a1.d1 + add1_right.b0.a1.d1,
add1_left.b0.a1.d2 + add1_right.b0.a1.d2,
);
local mul_right_b1_a0: BigInt3 = BigInt3(
add1_left.b1.a0.d0 + add1_right.b1.a0.d0,
add1_left.b1.a0.d1 + add1_right.b1.a0.d1,
add1_left.b1.a0.d2 + add1_right.b1.a0.d2,
);
local mul_right_b1_a1: BigInt3 = BigInt3(
add1_left.b1.a1.d0 + add1_right.b1.a1.d0,
add1_left.b1.a1.d1 + add1_right.b1.a1.d1,
add1_left.b1.a1.d2 + add1_right.b1.a1.d2,
);
local mul_right_b2_a0: BigInt3 = BigInt3(
add1_left.b2.a0.d0 + add1_right.b2.a0.d0,
add1_left.b2.a0.d1 + add1_right.b2.a0.d1,
add1_left.b2.a0.d2 + add1_right.b2.a0.d2,
);
local mul_right_b2_a1: BigInt3 = BigInt3(
add1_left.b2.a1.d0 + add1_right.b2.a1.d0,
add1_left.b2.a1.d1 + add1_right.b2.a1.d1,
add1_left.b2.a1.d2 + add1_right.b2.a1.d2,
);
local mul_right_b0: E2 = E2(&mul_right_b0_a0, &mul_right_b0_a1);
local mul_right_b1: E2 = E2(&mul_right_b1_a0, &mul_right_b1_a1);
local mul_right_b2: E2 = E2(&mul_right_b2_a0, &mul_right_b2_a1);

let t0 = e2.mul_unreduced(&mul_left_b0, &mul_right_b0);
let t1 = e2.mul_unreduced(&mul_left_b1, &mul_right_b1);
let t2 = e2.mul_unreduced(&mul_left_b2, &mul_right_b2);

let c0 = e2.add_add_mul_sub_sub_mulnr_add(
&mul_right_b1, &mul_right_b2, &mul_left_b1, &mul_left_b2, t1, t2, t0
);
let c1 = e2.add_add_mul_sub_sub_addmulnr(
&mul_left_b0, &mul_left_b1, &mul_right_b0, &mul_right_b1, t0, t1, t2
);
let c2 = e2.add_add_mul_sub_sub_add(
&mul_left_b0, &mul_left_b2, &mul_right_b0, &mul_right_b2, t0, t2, t1
);

// End :
local res: E6 = E6(c0, c1, c2);
return &res;
}

func inv{range_check_ptr}(x: E6*) -> E6* {
alloc_locals;
let (__fp__, _) = get_fp_and_pc();
Expand Down Expand Up @@ -522,7 +615,7 @@ namespace e6 {

let t0 = e2.add_mul_sub_mulnr_add(&x_b1, &x_b2, b1, b, a);
let t2 = e2.add_mul_sub_add(&x_b0, &x_b2, &b0, a, b);
let t1 = e2.add_add_mul_sub_sub(&x_b0, &x_b1, &b0, b1, a, b);
let t1 = e2.add_add_mul_sub5_sub5(&x_b0, &x_b1, &b0, b1, a, b);

local res: E6 = E6(t0, t1, t2);
return &res;
Expand Down Expand Up @@ -613,7 +706,7 @@ namespace e6 {
// let t1 = e2.sub(t1, a);
// let t1 = e2.sub(t1, b);

let t1 = e2.add_add_mul_sub_sub(x.b0, x.b1, b0, b1, a, b);
let t1 = e2.add_add_mul_sub5_sub5(x.b0, x.b1, b0, b1, a, b);

local res: E6 = E6(t0, t1, t2);
return &res;
Expand Down

0 comments on commit 2e15059

Please sign in to comment.