No default implementation

This commit is contained in:
Matthias Goergens 2023-07-04 17:21:27 +08:00
parent 6122dccb6e
commit 4df4d86555
6 changed files with 44 additions and 16 deletions

View File

@ -109,6 +109,14 @@ impl<F: Extendable<2>> Field for QuadraticExtension<F> {
fn from_noncanonical_u128(n: u128) -> Self {
F::from_noncanonical_u128(n).into()
}
fn from_noncanonical_i64(n: i64) -> Self {
F::from_noncanonical_i64(n).into()
}
fn from_noncanonical_u64(n: u64) -> Self {
F::from_noncanonical_u64(n).into()
}
}
impl<F: Extendable<2>> Display for QuadraticExtension<F> {

View File

@ -119,6 +119,14 @@ impl<F: Extendable<4>> Field for QuarticExtension<F> {
fn from_noncanonical_u128(n: u128) -> Self {
F::from_noncanonical_u128(n).into()
}
fn from_noncanonical_i64(n: i64) -> Self {
F::from_noncanonical_i64(n).into()
}
fn from_noncanonical_u64(n: u64) -> Self {
F::from_noncanonical_u64(n).into()
}
}
impl<F: Extendable<4>> Display for QuarticExtension<F> {

View File

@ -126,6 +126,14 @@ impl<F: Extendable<5>> Field for QuinticExtension<F> {
fn from_noncanonical_u128(n: u128) -> Self {
F::from_noncanonical_u128(n).into()
}
fn from_noncanonical_i64(n: i64) -> Self {
F::from_noncanonical_i64(n).into()
}
fn from_noncanonical_u64(n: u64) -> Self {
F::from_noncanonical_u64(n).into()
}
}
impl<F: Extendable<5>> Display for QuinticExtension<F> {

View File

@ -142,6 +142,15 @@ impl Field for Secp256K1Base {
fn from_noncanonical_u96(n: (u64, u32)) -> Self {
Self([n.0, n.1 as u64, 0, 0])
}
fn from_noncanonical_i64(n: i64) -> Self {
let f = Self::from_canonical_u64(n.unsigned_abs());
if n < 0 { -f } else { f }
}
fn from_noncanonical_u64(n: u64) -> Self {
Self::from_canonical_u64(n)
}
}
impl PrimeField for Secp256K1Base {

View File

@ -150,6 +150,15 @@ impl Field for Secp256K1Scalar {
fn from_noncanonical_u96(n: (u64, u32)) -> Self {
Self([n.0, n.1 as u64, 0, 0])
}
fn from_noncanonical_i64(n: i64) -> Self {
let f = Self::from_canonical_u64(n.unsigned_abs());
if n < 0 { -f } else { f }
}
fn from_noncanonical_u64(n: u64) -> Self {
Self::from_canonical_u64(n)
}
}
impl PrimeField for Secp256K1Scalar {

View File

@ -342,24 +342,10 @@ pub trait Field:
fn from_noncanonical_u128(n: u128) -> Self;
/// Returns `x % Self::CHARACTERISTIC`.
///
/// Implemented by default via `from_noncanonical_u128`
/// Override, if you have a faster implementation for your field.
fn from_noncanonical_u64(n: u64) -> Self {
Self::from_noncanonical_u128(n as u128)
}
fn from_noncanonical_u64(n: u64) -> Self;
/// Returns `n` as an element of this field.
///
/// Implemented by default via `from_noncanonical_u128` and case analysis.
/// Override, if you have a faster implementation for your field.
fn from_noncanonical_i64(n: i64) -> Self {
if n < 0 {
-Self::from_noncanonical_u128((n as i128).unsigned_abs())
} else {
Self::from_noncanonical_u128(n as u128)
}
}
fn from_noncanonical_i64(n: i64) -> Self;
/// Returns `n % Self::characteristic()`. May be cheaper than from_noncanonical_u128 when we know
/// that `n < 2 ** 96`.