This commit is contained in:
Dmitry Vagner 2022-12-27 16:00:16 -08:00
parent f1d5c6bfb9
commit 826702a756
3 changed files with 156 additions and 182 deletions

View File

@ -297,19 +297,158 @@ pub fn inv_fp12(f: Fp12) -> Fp12 {
}
pub fn power(f: Fp12) -> Fp12 {
const EXPS4: [(usize, usize, usize); 65] = [
(1, 1, 1),
(1, 1, 0),
(1, 1, 1),
(1, 1, 1),
(0, 0, 0),
(0, 0, 1),
(1, 0, 1),
(0, 1, 0),
(1, 0, 1),
(1, 1, 0),
(1, 0, 1),
(0, 1, 0),
(1, 1, 0),
(1, 1, 0),
(1, 1, 0),
(0, 1, 0),
(0, 1, 0),
(0, 0, 1),
(1, 0, 1),
(1, 1, 0),
(0, 1, 0),
(1, 1, 0),
(1, 1, 0),
(1, 1, 0),
(0, 0, 1),
(0, 0, 1),
(1, 0, 1),
(1, 0, 1),
(1, 1, 0),
(1, 0, 0),
(1, 1, 0),
(0, 1, 0),
(1, 1, 0),
(1, 0, 0),
(0, 1, 0),
(0, 0, 0),
(1, 0, 0),
(1, 0, 0),
(1, 0, 1),
(0, 0, 1),
(0, 1, 1),
(0, 0, 1),
(0, 1, 1),
(0, 1, 1),
(0, 0, 0),
(1, 1, 1),
(1, 0, 1),
(1, 0, 1),
(0, 1, 1),
(1, 0, 1),
(0, 1, 1),
(0, 1, 1),
(1, 1, 0),
(1, 1, 0),
(1, 1, 0),
(1, 0, 0),
(0, 0, 1),
(1, 0, 0),
(0, 0, 1),
(1, 0, 1),
(1, 1, 0),
(1, 1, 1),
(0, 1, 1),
(0, 1, 0),
(1, 1, 1),
];
const EXPS2: [(usize, usize); 62] = [
(1, 0),
(1, 1),
(0, 0),
(1, 0),
(1, 0),
(1, 1),
(1, 0),
(1, 1),
(1, 0),
(0, 1),
(0, 1),
(1, 1),
(1, 1),
(0, 0),
(1, 1),
(0, 0),
(0, 0),
(0, 1),
(0, 1),
(1, 1),
(1, 1),
(1, 1),
(0, 1),
(1, 1),
(0, 0),
(1, 1),
(1, 0),
(1, 1),
(0, 0),
(1, 1),
(1, 1),
(1, 0),
(0, 0),
(0, 1),
(0, 0),
(1, 1),
(0, 1),
(0, 0),
(1, 0),
(0, 1),
(0, 1),
(1, 0),
(0, 1),
(0, 0),
(0, 0),
(0, 0),
(0, 1),
(1, 0),
(1, 1),
(0, 1),
(1, 1),
(1, 0),
(0, 1),
(0, 0),
(1, 0),
(0, 1),
(1, 0),
(1, 1),
(1, 0),
(1, 1),
(0, 1),
(1, 1),
];
const EXPS0: [usize; 65] = [
0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0,
0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1,
0, 0, 1, 1, 0,
];
let mut sq: Fp12 = f;
let mut y0: Fp12 = embed_fp12(U256::one());
let mut y2: Fp12 = embed_fp12(U256::one());
let mut y4: Fp12 = embed_fp12(U256::one());
for (a, b, c) in EXPS4 {
if a {
if a != 0 {
y4 = mul_fp12(y4, sq);
}
if b {
if b != 0 {
y2 = mul_fp12(y2, sq);
}
if c {
if c != 0 {
y0 = mul_fp12(y0, sq);
}
sq = mul_fp12(sq, sq);
@ -317,10 +456,10 @@ pub fn power(f: Fp12) -> Fp12 {
y4 = mul_fp12(y4, sq);
for (a, b) in EXPS2 {
if a {
if a != 0 {
y2 = mul_fp12(y2, sq);
}
if b {
if b != 0 {
y0 = mul_fp12(y0, sq);
}
sq = mul_fp12(sq, sq);
@ -328,7 +467,7 @@ pub fn power(f: Fp12) -> Fp12 {
y2 = mul_fp12(y2, sq);
for a in EXPS0 {
if a {
if a != 0 {
y0 = mul_fp12(y0, sq);
}
sq = mul_fp12(sq, sq);
@ -490,147 +629,6 @@ fn frob_z(n: usize) -> Fp2 {
}
}
const EXPS4: [(bool, bool, bool); 65] = [
(true, true, true),
(true, true, false),
(true, true, true),
(true, true, true),
(false, false, false),
(false, false, true),
(true, false, true),
(false, true, false),
(true, false, true),
(true, true, false),
(true, false, true),
(false, true, false),
(true, true, false),
(true, true, false),
(true, true, false),
(false, true, false),
(false, true, false),
(false, false, true),
(true, false, true),
(true, true, false),
(false, true, false),
(true, true, false),
(true, true, false),
(true, true, false),
(false, false, true),
(false, false, true),
(true, false, true),
(true, false, true),
(true, true, false),
(true, false, false),
(true, true, false),
(false, true, false),
(true, true, false),
(true, false, false),
(false, true, false),
(false, false, false),
(true, false, false),
(true, false, false),
(true, false, true),
(false, false, true),
(false, true, true),
(false, false, true),
(false, true, true),
(false, true, true),
(false, false, false),
(true, true, true),
(true, false, true),
(true, false, true),
(false, true, true),
(true, false, true),
(false, true, true),
(false, true, true),
(true, true, false),
(true, true, false),
(true, true, false),
(true, false, false),
(false, false, true),
(true, false, false),
(false, false, true),
(true, false, true),
(true, true, false),
(true, true, true),
(false, true, true),
(false, true, false),
(true, true, true),
];
const EXPS2: [(bool, bool); 62] = [
(true, false),
(true, true),
(false, false),
(true, false),
(true, false),
(true, true),
(true, false),
(true, true),
(true, false),
(false, true),
(false, true),
(true, true),
(true, true),
(false, false),
(true, true),
(false, false),
(false, false),
(false, true),
(false, true),
(true, true),
(true, true),
(true, true),
(false, true),
(true, true),
(false, false),
(true, true),
(true, false),
(true, true),
(false, false),
(true, true),
(true, true),
(true, false),
(false, false),
(false, true),
(false, false),
(true, true),
(false, true),
(false, false),
(true, false),
(false, true),
(false, true),
(true, false),
(false, true),
(false, false),
(false, false),
(false, false),
(false, true),
(true, false),
(true, true),
(false, true),
(true, true),
(true, false),
(false, true),
(false, false),
(true, false),
(false, true),
(true, false),
(true, true),
(true, false),
(true, true),
(false, true),
(true, true),
];
const EXPS0: [bool; 65] = [
false, false, true, false, false, true, true, false, true, false, true, true, true, false,
true, false, false, false, true, false, false, true, false, true, false, true, true, false,
false, false, false, false, true, false, true, false, true, true, true, false, false, true,
true, true, true, false, true, false, true, true, false, false, true, false, false, false,
true, true, true, true, false, false, true, true, false,
];
pub fn tangent(p: Curve, q: TwistedCurve) -> Fp12 {
let [px, py] = p;
let [qx, qy] = q;
@ -697,14 +695,15 @@ fn curve_double(p: Curve) -> Curve {
pub fn miller_loop(p: Curve, q: TwistedCurve) -> Fp12 {
const EXP: [usize; 253] = [
1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1,
0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1,
1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1,
0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0,
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1,
1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0,
1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0,
1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0,
1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0,
0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0,
1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
];
let mut o = p;

View File

@ -250,7 +250,7 @@ after_add:
%mstore_kernel_general(103)
// stack: p1x - p2x, qy_
MULFP254
// stack: (p1x - p2x)qy_
// stack: (p1x - p2x)*qy_
%mstore_kernel_general(109)
%endmacro

View File

@ -122,7 +122,7 @@ fn test_inv_fp12() -> Result<()> {
}
#[test]
fn test_pow_fp12() -> Result<()> {
fn test_power() -> Result<()> {
let ptr = U256::from(300);
let out = U256::from(400);
@ -142,31 +142,6 @@ fn test_pow_fp12() -> Result<()> {
Ok(())
}
#[test]
fn test_line() -> Result<()> {
let p1: Curve = gen_curve_point();
let p2: Curve = gen_curve_point();
let q: TwistedCurve = gen_twisted_curve_point();
let p1_: Vec<U256> = p1.to_vec();
let p2_: Vec<U256> = p2.to_vec();
let q_: Vec<U256> = q.into_iter().flatten().collect();
let tan_stack = make_stack(vec![p1_.clone(), q_.clone()]);
let cord_stack = make_stack(vec![p1_, p2_, q_]);
let output_tan: Vec<U256> = get_output("test_tangent", tan_stack);
let output_cord: Vec<U256> = get_output("test_cord", cord_stack);
let expected_tan = fp12_to_vec(tangent(p1, q));
let expected_cord = fp12_to_vec(cord(p1, p2, q));
assert_eq!(output_tan, expected_tan);
assert_eq!(output_cord, expected_cord);
Ok(())
}
#[test]
fn test_miller() -> Result<()> {
let ptr = U256::from(300);