mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-09 17:23:08 +00:00
fp6 passes randomized tests
This commit is contained in:
parent
b534b221a0
commit
d475ab9368
@ -1,64 +1,99 @@
|
||||
// cost: 159
|
||||
// cost: 156
|
||||
%macro mul_fp6
|
||||
DUP8
|
||||
DUP2
|
||||
MULFP254
|
||||
DUP8
|
||||
DUP4
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP7
|
||||
/// E0 = C0D0 + i9(C1D2 + C2D1)
|
||||
///
|
||||
/// C0D0 = (c0d0 - c0_d0_) + (c0d0_ + c0_d0)i
|
||||
///
|
||||
/// C1D2 = (c1d2 - c1_d2_) + (c1d2_ + c1_d2)i
|
||||
/// C2D1 = (c2d1 - c2_d1_) + (c2d1_ + c2_d1)i
|
||||
///
|
||||
/// CDX = C1D2 + C2D1
|
||||
/// = (c1d2 + c2d1 - c1_d2_ - c2_d1_) + (c1d2_ + c1_d2 + c2d1_ + c2_d1)i
|
||||
///
|
||||
/// i9(CDX) = (9CDX - CDX_) + (CDX + 9CDX_)i
|
||||
///
|
||||
/// E0 = 9CDX - CDX_ + C0D0
|
||||
/// E0_ = 9CDX_ + CDX + C0D0_
|
||||
|
||||
// CDX_ = c1d2_ + c1_d2 + c2d1_ + c2_d1
|
||||
DUP12
|
||||
MULFP254
|
||||
DUP6
|
||||
DUP15
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP5
|
||||
DUP14
|
||||
MULFP254
|
||||
DUP8
|
||||
DUP13
|
||||
MULFP254
|
||||
ADDFP254
|
||||
SUBFP254
|
||||
DUP5
|
||||
DUP15
|
||||
MULFP254
|
||||
DUP7
|
||||
DUP15
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP8
|
||||
DUP14
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP9
|
||||
DUP13
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP11
|
||||
DUP6
|
||||
MULFP254
|
||||
DUP11
|
||||
DUP6
|
||||
MULFP254
|
||||
SUBFP254
|
||||
DUP2
|
||||
DUP4
|
||||
MULFP254
|
||||
DUP12
|
||||
DUP6
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP11
|
||||
DUP7
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP10
|
||||
DUP8
|
||||
MULFP254
|
||||
ADDFP254
|
||||
// C0D0_ = c0d0_ + c0_d0
|
||||
DUP9
|
||||
DUP3
|
||||
MULFP254
|
||||
DUP9
|
||||
DUP5
|
||||
MULFP254
|
||||
ADDFP254
|
||||
// CDX = c1d2 + c2d1 - c1_d2_ - c2_d1_
|
||||
DUP12
|
||||
DUP9
|
||||
MULFP254
|
||||
DUP15
|
||||
DUP8
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP14
|
||||
DUP7
|
||||
MULFP254
|
||||
DUP13
|
||||
DUP10
|
||||
MULFP254
|
||||
ADDFP254
|
||||
SUBFP254
|
||||
// C0D0 = c0d0 - c0_d0_
|
||||
DUP11
|
||||
DUP6
|
||||
MULFP254
|
||||
DUP11
|
||||
DUP6
|
||||
MULFP254
|
||||
SUBFP254
|
||||
// stack: C0D0 , CDX , C0D0_, CDX_
|
||||
DUP4
|
||||
DUP3
|
||||
// stack: CDX , CDX_ , C0D0 , CDX , C0D0_, CDX_
|
||||
PUSH 9
|
||||
MULFP254
|
||||
SUBFP254
|
||||
ADDFP254
|
||||
// stack: 9CDX - CDX_ + C0D0 , CDX , C0D0_, CDX_
|
||||
SWAP15
|
||||
SWAP3
|
||||
SWAP2
|
||||
SWAP1
|
||||
// stack: CDX_ , CDX , C0D0_
|
||||
PUSH 9
|
||||
MULFP254
|
||||
ADDFP254
|
||||
ADDFP254
|
||||
// stack: 9CDX_ + CDX + C0D0_
|
||||
SWAP9
|
||||
|
||||
/// E1 = C0D1 + C1D0 + i9(C2D2)
|
||||
///
|
||||
/// C0D1 = (c0d1 - c0_d1_) + (c0d1_ + c0_d1)i
|
||||
/// C1D0 = (c1d0 - c1_d0_) + (c1d0_ + c1_d0)i
|
||||
///
|
||||
/// C2D2 = (c2d2 - c2_d2_) + (c2d2_ + c2_d2)i
|
||||
/// i9(C2D2) = (9C2D2 - C2D2_) + (C2D2 + 9C2D2_)i
|
||||
///
|
||||
/// E1 = 9C2D2 - C2D2_ + c0d1 + c1d0 - (c0_d1_ + c1_d0_)
|
||||
/// E1_ = C2D2 + 9C2D2_ + c0d1_ + c0_d1 + c1d0_ + c1_d0
|
||||
|
||||
// C2D2_ = c2d2_ + c2_d2
|
||||
DUP13
|
||||
DUP9
|
||||
MULFP254
|
||||
@ -66,6 +101,7 @@
|
||||
DUP9
|
||||
MULFP254
|
||||
ADDFP254
|
||||
// C2D2 = c2d2 - c2_d2_
|
||||
DUP3
|
||||
DUP10
|
||||
MULFP254
|
||||
@ -73,6 +109,8 @@
|
||||
DUP10
|
||||
MULFP254
|
||||
SUBFP254
|
||||
// stack: C2D2, C2D2_
|
||||
// c0d1 + c1d0 - (c0_d1_ + c1_d0_)
|
||||
DUP3
|
||||
DUP9
|
||||
MULFP254
|
||||
@ -80,12 +118,6 @@
|
||||
DUP8
|
||||
MULFP254
|
||||
ADDFP254
|
||||
DUP2
|
||||
DUP4
|
||||
PUSH 9
|
||||
MULFP254
|
||||
SUBFP254
|
||||
SUBFP254
|
||||
DUP12
|
||||
DUP9
|
||||
MULFP254
|
||||
@ -93,13 +125,24 @@
|
||||
DUP8
|
||||
MULFP254
|
||||
ADDFP254
|
||||
SUBFP254
|
||||
// stack: c0d1 + c1d0 - (c0_d1_ + c1_d0_), C2D2, C2D2_
|
||||
DUP3
|
||||
DUP3
|
||||
// stack: C2D2 , C2D2_ , c0d1 + c1d0 - (c0_d1_ + c1_d0_), C2D2, C2D2_
|
||||
PUSH 9
|
||||
MULFP254
|
||||
SUBFP254
|
||||
ADDFP254
|
||||
// stack: 9C2D2 - C2D2_ + c0d1 + c1d0 - (c0_d1_ + c1_d0_), C2D2, C2D2_
|
||||
SWAP13
|
||||
SWAP2
|
||||
SWAP1
|
||||
// stack: C2D2_ , C2D2
|
||||
PUSH 9
|
||||
MULFP254
|
||||
ADDFP254
|
||||
// stack: 9C2D2_ + C2D2
|
||||
// c0d1_ + c0_d1 + c1d0_ + c1_d0
|
||||
DUP11
|
||||
DUP9
|
||||
MULFP254
|
||||
@ -117,6 +160,15 @@
|
||||
ADDFP254
|
||||
ADDFP254
|
||||
SWAP13
|
||||
/// E2 = C0D2 + C1D1 + C2D0
|
||||
///
|
||||
/// C0D2 = (c0d2 - c0_d2_) + (c0d2_ + c0_d2)i
|
||||
/// C1D1 = (c1d1 - c1_d1_) + (c1d1_ + c1_d1)i
|
||||
/// C2D0 = (c2d0 - c2_d0_) + (c2d0_ + c2_d0)i
|
||||
///
|
||||
/// E2 = c0d2 + c1d1 + c2d0 - (c0_d2_ + c1_d1_ + c2_d0_)
|
||||
/// E2_ = c0d2_ + c0_d2 + c1d1_ + c1_d1 + c2d0_ + c2_d0
|
||||
// c0_d2_ + c1_d1_ + c2_d0_
|
||||
DUP3
|
||||
DUP11
|
||||
MULFP254
|
||||
@ -128,6 +180,7 @@
|
||||
DUP8
|
||||
MULFP254
|
||||
ADDFP254
|
||||
// c0d2 + c1d1 + c2d0
|
||||
DUP16
|
||||
DUP7
|
||||
MULFP254
|
||||
@ -139,8 +192,10 @@
|
||||
DUP12
|
||||
MULFP254
|
||||
ADDFP254
|
||||
// stack: c0d2 + c1d1 + c2d0, c0_d2_ + c1_d1_ + c2_d0_
|
||||
SUBFP254
|
||||
SWAP15
|
||||
// c0d2_ + c0_d2 + c1d1_ + c1_d1 + c2d0_ + c2_d0
|
||||
SWAP7
|
||||
MULFP254
|
||||
SWAP7
|
||||
|
||||
@ -1,45 +1,151 @@
|
||||
use anyhow::Result;
|
||||
use ethereum_types::U256;
|
||||
use rand::{thread_rng, Rng};
|
||||
|
||||
use crate::cpu::kernel::aggregator::combined_kernel;
|
||||
use crate::cpu::kernel::interpreter::run_with_kernel;
|
||||
|
||||
fn make_stack(xs: &[u32]) -> Vec<U256> {
|
||||
Vec::from(xs)
|
||||
.iter()
|
||||
.map(|&x| U256::from(x as u32))
|
||||
const P254: u32 = 101;
|
||||
|
||||
fn add_fp2(a: [u32; 2], b: [u32; 2]) -> [u32; 2] {
|
||||
let [a, a_] = a;
|
||||
let [b, b_] = b;
|
||||
[(a + b) % P254, (a_ + b_) % P254]
|
||||
}
|
||||
|
||||
fn add3_fp2(a: [u32; 2], b: [u32; 2], c: [u32; 2]) -> [u32; 2] {
|
||||
let [a, a_] = a;
|
||||
let [b, b_] = b;
|
||||
let [c, c_] = c;
|
||||
[(a + b + c) % P254, (a_ + b_ + c_) % P254]
|
||||
}
|
||||
|
||||
fn sub_fp2(a: [u32; 2], b: [u32; 2]) -> [u32; 2] {
|
||||
let [a, a_] = a;
|
||||
let [b, b_] = b;
|
||||
[(P254 + a - b) % P254, (P254 + a_ - b_) % P254]
|
||||
}
|
||||
|
||||
fn mul_fp2(a: [u32; 2], b: [u32; 2]) -> [u32; 2] {
|
||||
let [a, a_] = a;
|
||||
let [b, b_] = b;
|
||||
[
|
||||
(P254 + (a * b) % P254 - (a_ * b_) % P254) % P254,
|
||||
((a * b_) % P254 + (a_ * b) % P254) % P254,
|
||||
]
|
||||
}
|
||||
|
||||
fn i9(a: [u32; 2]) -> [u32; 2] {
|
||||
let [a, a_] = a;
|
||||
[(9 * a - a_) % P254, (a + 9 * a_) % P254]
|
||||
}
|
||||
|
||||
fn add_fp6(c: [[u32; 2]; 3], d: [[u32; 2]; 3]) -> [[u32; 2]; 3] {
|
||||
let [c0, c1, c2] = c;
|
||||
let [d0, d1, d2] = d;
|
||||
|
||||
let e0 = add_fp2(c0, d0);
|
||||
let e1 = add_fp2(c1, d1);
|
||||
let e2 = add_fp2(c2, d2);
|
||||
[e0, e1, e2]
|
||||
}
|
||||
|
||||
fn sub_fp6(c: [[u32; 2]; 3], d: [[u32; 2]; 3]) -> [[u32; 2]; 3] {
|
||||
let [c0, c1, c2] = c;
|
||||
let [d0, d1, d2] = d;
|
||||
|
||||
let e0 = sub_fp2(c0, d0);
|
||||
let e1 = sub_fp2(c1, d1);
|
||||
let e2 = sub_fp2(c2, d2);
|
||||
[e0, e1, e2]
|
||||
}
|
||||
|
||||
fn mul_fp6(c: [[u32; 2]; 3], d: [[u32; 2]; 3]) -> [[u32; 2]; 3] {
|
||||
let [c0, c1, c2] = c;
|
||||
let [d0, d1, d2] = d;
|
||||
|
||||
let c0d0 = mul_fp2(c0, d0);
|
||||
let c0d1 = mul_fp2(c0, d1);
|
||||
let c0d2 = mul_fp2(c0, d2);
|
||||
let c1d0 = mul_fp2(c1, d0);
|
||||
let c1d1 = mul_fp2(c1, d1);
|
||||
let c1d2 = mul_fp2(c1, d2);
|
||||
let c2d0 = mul_fp2(c2, d0);
|
||||
let c2d1 = mul_fp2(c2, d1);
|
||||
let c2d2 = mul_fp2(c2, d2);
|
||||
let cd12 = add_fp2(c1d2, c2d1);
|
||||
|
||||
[
|
||||
add_fp2(c0d0, i9(cd12)),
|
||||
add3_fp2(c0d1, c1d0, i9(c2d2)),
|
||||
add3_fp2(c0d2, c1d1, c2d0),
|
||||
]
|
||||
}
|
||||
|
||||
fn sh(c: [[u32; 2]; 3]) -> [[u32; 2]; 3] {
|
||||
let [c0, c1, c2] = c;
|
||||
[i9(c2), c0, c1]
|
||||
}
|
||||
|
||||
fn mul_fp12(f: [[[u32; 2]; 3]; 2], g: [[[u32; 2]; 3]; 2]) -> [[[u32; 2]; 3]; 2] {
|
||||
let [f0, f1] = f;
|
||||
let [g0, g1] = g;
|
||||
|
||||
let h0 = mul_fp6(f0, g0);
|
||||
let h1 = mul_fp6(f1, g1);
|
||||
let h01 = mul_fp6(add_fp6(f0, f1), add_fp6(g0, g1));
|
||||
[add_fp6(h0, sh(h1)), sub_fp6(h01, add_fp6(h0, h1))]
|
||||
}
|
||||
|
||||
fn make_stack(xs: Vec<u32>) -> Vec<U256> {
|
||||
xs.iter()
|
||||
.map(|&x| U256::from(x as u32) % P254)
|
||||
.rev()
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn gen_fp6() -> [[u32; 2]; 3] {
|
||||
let mut rng = thread_rng();
|
||||
[
|
||||
[rng.gen_range(0..P254), rng.gen_range(0..P254)],
|
||||
[rng.gen_range(0..P254), rng.gen_range(0..P254)],
|
||||
[rng.gen_range(0..P254), rng.gen_range(0..P254)],
|
||||
]
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_fp6() -> Result<()> {
|
||||
let c = gen_fp6();
|
||||
let d = gen_fp6();
|
||||
let input: Vec<u32> = [c, d].into_iter().flatten().flatten().collect();
|
||||
let output: Vec<u32> = mul_fp6(c, d).into_iter().flatten().collect();
|
||||
|
||||
let kernel = combined_kernel();
|
||||
let initial_offset = kernel.global_labels["test_mul_Fp6"];
|
||||
let initial_stack: Vec<U256> = make_stack(&[1, 1, 0, 0, 1, 0, 3, 0, 0, 1, 0, 0]);
|
||||
let initial_stack: Vec<U256> = make_stack(input);
|
||||
let final_stack: Vec<U256> = run_with_kernel(&kernel, initial_offset, initial_stack)?
|
||||
.stack()
|
||||
.to_vec();
|
||||
let expected: Vec<U256> = make_stack(&[2, 12, 100, 1, 3, 0]);
|
||||
|
||||
let expected = make_stack(output);
|
||||
assert_eq!(final_stack, expected);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_fp12() -> Result<()> {
|
||||
let kernel = combined_kernel();
|
||||
let initial_offset = kernel.global_labels["test_mul_Fp12"];
|
||||
let initial_stack: Vec<U256> = make_stack(&[
|
||||
1, 1, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0,
|
||||
]);
|
||||
let final_stack: Vec<U256> = run_with_kernel(&kernel, initial_offset, initial_stack)?
|
||||
.stack()
|
||||
.to_vec();
|
||||
let expected: Vec<U256> = make_stack(&[5, 5, 9, 0, 5, 3, 17, 12, 100, 1, 3, 0]);
|
||||
// #[test]
|
||||
// fn test_fp12() -> Result<()> {
|
||||
// let kernel = combined_kernel();
|
||||
// let initial_offset = kernel.global_labels["test_mul_Fp12"];
|
||||
// let initial_stack: Vec<U256> = make_stack(&[
|
||||
// 1, 1, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0,
|
||||
// ]);
|
||||
// let final_stack: Vec<U256> = run_with_kernel(&kernel, initial_offset, initial_stack)?
|
||||
// .stack()
|
||||
// .to_vec();
|
||||
// let expected: Vec<U256> = make_stack(&[5, 5, 9, 0, 5, 3, 17, 12, 100, 1, 3, 0]);
|
||||
|
||||
assert_eq!(final_stack, expected);
|
||||
// assert_eq!(final_stack, expected);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
// Ok(())
|
||||
// }
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user