diff --git a/field/src/extension/quadratic.rs b/field/src/extension/quadratic.rs index c0c9758b..281369d2 100644 --- a/field/src/extension/quadratic.rs +++ b/field/src/extension/quadratic.rs @@ -109,6 +109,14 @@ impl> Field for QuadraticExtension { 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> Display for QuadraticExtension { diff --git a/field/src/extension/quartic.rs b/field/src/extension/quartic.rs index e7aba63b..8c8a9e7e 100644 --- a/field/src/extension/quartic.rs +++ b/field/src/extension/quartic.rs @@ -119,6 +119,14 @@ impl> Field for QuarticExtension { 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> Display for QuarticExtension { diff --git a/field/src/extension/quintic.rs b/field/src/extension/quintic.rs index d4b605eb..28ec9226 100644 --- a/field/src/extension/quintic.rs +++ b/field/src/extension/quintic.rs @@ -126,6 +126,14 @@ impl> Field for QuinticExtension { 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> Display for QuinticExtension { diff --git a/field/src/secp256k1_base.rs b/field/src/secp256k1_base.rs index eaa964f8..bf4cbe61 100644 --- a/field/src/secp256k1_base.rs +++ b/field/src/secp256k1_base.rs @@ -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 { diff --git a/field/src/secp256k1_scalar.rs b/field/src/secp256k1_scalar.rs index 1f1de697..b4494681 100644 --- a/field/src/secp256k1_scalar.rs +++ b/field/src/secp256k1_scalar.rs @@ -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 { diff --git a/field/src/types.rs b/field/src/types.rs index 2c0d15c7..646dff73 100644 --- a/field/src/types.rs +++ b/field/src/types.rs @@ -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`.