Skip to content

Commit

Permalink
Fast isSquare / Legendre symbol / Jacobi symbol - 16.8x acceleration (p…
Browse files Browse the repository at this point in the history
…rivacy-scaling-explorations#95)

* Derivatives of the Pornin's method (#3)

* renaming file

* make cargo fmt happy

* clarifications from privacy-scaling-explorations#95 (comment) [skip ci]

* Formatting and slightly changing a comment

---------

Co-authored-by: Aleksei Vambol <77882392+AlekseiVambol@users.noreply.github.com>
  • Loading branch information
mratsim and AlekseiVambol committed Oct 31, 2023
1 parent a835096 commit 81a0782
Show file tree
Hide file tree
Showing 4 changed files with 451 additions and 2 deletions.
9 changes: 7 additions & 2 deletions benches/bn256_field.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
use halo2curves::bn256::*;
use halo2curves::ff::Field;
use halo2curves::{bn256::*, ff::Field, legendre::Legendre};
use rand::SeedableRng;
use rand_xorshift::XorShiftRng;

Expand Down Expand Up @@ -43,6 +42,12 @@ pub fn bench_bn256_field(c: &mut Criterion) {
group.bench_function("bn256_fq_invert", |bencher| {
bencher.iter(|| black_box(&a).invert())
});
group.bench_function("bn256_fq_legendre", |bencher| {
bencher.iter(|| black_box(&a).legendre())
});
group.bench_function("bn256_fq_jacobi", |bencher| {
bencher.iter(|| black_box(&a).jacobi())
});
}

criterion_group!(benches, bench_bn256_field);
Expand Down
28 changes: 28 additions & 0 deletions src/derive/field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ macro_rules! field_common {
}
}

// Returns the Legendre symbol, where the numerator and denominator
// are the element and the characteristic of the field, respectively.
pub fn jacobi(&self) -> i64 {
$crate::ff_jacobi::jacobi::<5>(&self.0, &$modulus.0)
}

fn from_u512(limbs: [u64; 8]) -> $field {
// We reduce an arbitrary 512-bit number by decomposing it into two 256-bit digits
// with the higher bits multiplied by 2^256. Thus, we perform two reductions
Expand Down Expand Up @@ -353,6 +359,28 @@ macro_rules! field_common {
Ok(())
}
}

#[test]
fn test_jacobi() {
use rand::SeedableRng;
use $crate::ff::Field;
use $crate::legendre::Legendre;
let mut rng = rand_xorshift::XorShiftRng::from_seed([
0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06,
0xbc, 0xe5,
]);
for _ in 0..100000 {
let e = $field::random(&mut rng);
assert_eq!(
e.legendre(),
match e.jacobi() {
1 => $field::ONE,
-1 => -$field::ONE,
_ => $field::ZERO,
}
);
}
}
};
}

Expand Down
Loading

0 comments on commit 81a0782

Please sign in to comment.