inverse works

This commit is contained in:
Dmitry Vagner 2022-12-20 00:47:57 -08:00
parent 7788a29f4a
commit c246297158
4 changed files with 34 additions and 70 deletions

View File

@ -971,44 +971,3 @@
%mstore_kernel_general
// stack:
%endmacro
%macro assert_eq_fp12_unit
// stack: ptr
DUP1 %mload_kernel_code
// stack: x00, ptr
%assert_eq_const(1)
// stack: ptr
DUP1 %add_const(01) %mload_kernel_code
// stack: x01, ptr
%assert_eq_const(0)
DUP1 %add_const(02) %mload_kernel_code
// stack: x02, ptr
%assert_eq_const(0)
DUP1 %add_const(03) %mload_kernel_code
// stack: x03, ptr
%assert_eq_const(0)
DUP1 %add_const(04) %mload_kernel_code
// stack: x04, ptr
%assert_eq_const(0)
DUP1 %add_const(05) %mload_kernel_code
// stack: x05, ptr
%assert_eq_const(0)
DUP1 %add_const(06) %mload_kernel_code
// stack: x06, ptr
%assert_eq_const(0)
DUP1 %add_const(07) %mload_kernel_code
// stack: x07, ptr
%assert_eq_const(0)
DUP1 %add_const(08) %mload_kernel_code
// stack: x08, ptr
%assert_eq_const(0)
DUP1 %add_const(09) %mload_kernel_code
// stack: x09, ptr
%assert_eq_const(0)
DUP1 %add_const(10) %mload_kernel_code
// stack: x10, ptr
%assert_eq_const(0)
DUP1 %add_const(11) %mload_kernel_code
// stack: x11, ptr
%assert_eq_const(0)
%endmacro

View File

@ -21,9 +21,15 @@
// stack: x^-1
%endmacro
global test_inverse_fp12:
// stack: ptr, f, ptr, inv, retdest
%store_fp12
// stack: ptr, inv, retdest
%jump(inverse_fp12)
global inverse_fp12:
// stack: ptr, inv, retdest
// DUP1 %load_fp12
DUP1 %load_fp12
// stack: f, ptr, inv, retdest
DUP14
// stack: inv, f, ptr, inv, retdest
@ -40,9 +46,6 @@ global inverse_fp12:
PROVER_INPUT(ffe::bn254_base::ext_inv1)
PROVER_INPUT(ffe::bn254_base::ext_inv0)
// stack: f^-1, inv, f, ptr, inv, retdest
%jump(0xdeadbeef)
DUP13
// stack: inv, f^-1, inv, f, ptr, inv, retdest
%store_fp12
@ -56,11 +59,21 @@ global inverse_fp12:
%jump(mul_fp12)
global check_inv:
// stack: 200, ptr, inv, retdest
%assert_eq_fp12_unit
%load_fp12
// stack: unit?, ptr, inv, retdest
%assert_eq_const(1)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
%assert_eq_const(0)
// stack: ptr, inv, retdest
%pop2
// stack: retdest
%jump(0xdeadbeef)
// SWAP1
// stack: retdest, inv
// JUMP
JUMP

View File

@ -661,27 +661,20 @@ fn test_mul_fp12() -> Result<()> {
fn test_inv_fp12() -> Result<()> {
let ptr = U256::from(100);
let inv = U256::from(200);
let f: Vec<U256> = gen_fp12().into_iter().flatten().flatten().collect();
let f: Fp12 = gen_fp12();
let flat_f: Vec<U256> = f.into_iter().flatten().flatten().collect();
let mut stack: Vec<U256> = flat_f.clone();
stack.extend(vec![ptr, inv]);
stack.reverse();
let initial_offset = KERNEL.global_labels["test_inverse_fp12"];
let g = inv_fp12(f);
let one = mul_fp12(f, g);
println!("ONE? {:#?}", one);
let mut initial_stack = vec![ptr];
initial_stack.extend(f);
initial_stack.extend(vec![ptr, inv, U256::from_str("0xdeadbeef").unwrap()]);
initial_stack.reverse();
let mut expected: Vec<U256> = g.into_iter().flatten().flatten().collect();
expected.extend(vec![inv]);
expected.extend(flat_f);
expected.extend(vec![ptr, inv]);
expected.reverse();
let output: Vec<U256> = run_interpreter(initial_offset, initial_stack)?
.stack()
.to_vec();
let initial_offset = KERNEL.global_labels["inverse_fp12"];
let output: Vec<U256> = run_interpreter(initial_offset, stack)?.stack().to_vec();
assert_eq!(output, expected);
assert_eq!(output, vec![]);
Ok(())
}

View File

@ -237,7 +237,6 @@ impl EvmField {
}
fn ext_inv(&self, xs: Vec<U256>, offset: usize) -> [U256; 12] {
let f0 = xs.clone().into_iter().nth(offset).unwrap();
let f1 = xs.clone().into_iter().nth(offset + 1).unwrap();
let f2 = xs.clone().into_iter().nth(offset + 2).unwrap();
@ -261,8 +260,8 @@ impl EvmField {
let g = inv_fp12(f);
[
g[0][0][0], g[0][0][1], g[0][1][0], g[0][1][1], g[0][2][0], g[0][2][1],
g[1][0][0], g[1][0][1], g[1][1][0], g[1][1][1], g[1][2][0], g[1][2][1],
g[0][0][0], g[0][0][1], g[0][1][0], g[0][1][1], g[0][2][0], g[0][2][1], g[1][0][0],
g[1][0][1], g[1][1][0], g[1][1][1], g[1][2][0], g[1][2][1],
]
}