pub struct Odd<T>(/* private fields */);
Expand description
Wrapper type for odd integers.
These are frequently used in cryptography, e.g. as a modulus.
Implementations§
Source§impl<T> Odd<T>
impl<T> Odd<T>
Source§impl<const LIMBS: usize> Odd<Uint<LIMBS>>
impl<const LIMBS: usize> Odd<Uint<LIMBS>>
Sourcepub const fn from_be_hex(hex: &str) -> Self
pub const fn from_be_hex(hex: &str) -> Self
Create a new Odd<Uint<LIMBS>>
from the provided big endian hex string.
Panics if the hex is malformed or not zero-padded accordingly for the size, or if the value is even.
Sourcepub const fn from_le_hex(hex: &str) -> Self
pub const fn from_le_hex(hex: &str) -> Self
Create a new Odd<Uint<LIMBS>>
from the provided little endian hex string.
Panics if the hex is malformed or not zero-padded accordingly for the size, or if the value is even.
Source§impl<const SAT_LIMBS: usize, const UNSAT_LIMBS: usize> Odd<Uint<SAT_LIMBS>>where
Self: PrecomputeInverter<Inverter = SafeGcdInverter<SAT_LIMBS, UNSAT_LIMBS>>,
impl<const SAT_LIMBS: usize, const UNSAT_LIMBS: usize> Odd<Uint<SAT_LIMBS>>where
Self: PrecomputeInverter<Inverter = SafeGcdInverter<SAT_LIMBS, UNSAT_LIMBS>>,
Sourcepub const fn gcd_vartime(&self, rhs: &Uint<SAT_LIMBS>) -> Uint<SAT_LIMBS>
pub const fn gcd_vartime(&self, rhs: &Uint<SAT_LIMBS>) -> Uint<SAT_LIMBS>
Compute the greatest common divisor (GCD) of this number and another.
Runs in variable time with respect to rhs
.
Trait Implementations§
Source§impl<T> ConditionallySelectable for Odd<T>where
T: ConditionallySelectable,
impl<T> ConditionallySelectable for Odd<T>where
T: ConditionallySelectable,
Source§fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
Source§fn conditional_assign(&mut self, other: &Self, choice: Choice)
fn conditional_assign(&mut self, other: &Self, choice: Choice)
Source§fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
self
and other
if choice == 1
; otherwise,
reassign both unto themselves. Read moreSource§impl<T> ConstantTimeEq for Odd<T>where
T: ConstantTimeEq,
impl<T> ConstantTimeEq for Odd<T>where
T: ConstantTimeEq,
Source§impl<const SAT_LIMBS: usize, const UNSAT_LIMBS: usize> Gcd<Uint<SAT_LIMBS>> for Odd<Uint<SAT_LIMBS>>
impl<const SAT_LIMBS: usize, const UNSAT_LIMBS: usize> Gcd<Uint<SAT_LIMBS>> for Odd<Uint<SAT_LIMBS>>
Source§impl<T: Ord> Ord for Odd<T>
impl<T: Ord> Ord for Odd<T>
Source§impl<const LIMBS: usize> PartialOrd<Odd<Uint<LIMBS>>> for Uint<LIMBS>
impl<const LIMBS: usize> PartialOrd<Odd<Uint<LIMBS>>> for Uint<LIMBS>
Source§impl<T: PartialOrd> PartialOrd for Odd<T>
impl<T: PartialOrd> PartialOrd for Odd<T>
Source§impl PrecomputeInverter for Odd<U64>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U64>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U128>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U128>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U704>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U704>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U768>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U768>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U832>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U832>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U896>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U896>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U960>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U960>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U1024>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U1024>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U1280>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U1280>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U1536>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U1536>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U1792>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U1792>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U2048>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U2048>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U192>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U192>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U3072>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U3072>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U3584>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U3584>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U4096>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U4096>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U4224>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U4224>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U4352>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U4352>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U6144>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U6144>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U8192>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U8192>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U16384>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U16384>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U32768>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U32768>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U256>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U256>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U320>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U320>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U384>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U384>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U448>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U448>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U512>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U512>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U576>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U576>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreSource§impl PrecomputeInverter for Odd<U640>
Precompute a Bernstein-Yang inverter using self
as the modulus.
impl PrecomputeInverter for Odd<U640>
Precompute a Bernstein-Yang inverter using self
as the modulus.
Source§type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
type Inverter = SafeGcdInverter<{ nlimbs!($bits) }, { safegcd_nlimbs!($bits as usize) }>
Source§fn precompute_inverter(&self) -> Self::Inverter
fn precompute_inverter(&self) -> Self::Inverter
&self
as the modulus, using Self::one()
as an adjusting parameter. Read moreimpl<T: Copy> Copy for Odd<T>
impl<T: Eq> Eq for Odd<T>
impl<T> StructuralPartialEq for Odd<T>
Auto Trait Implementations§
impl<T> Freeze for Odd<T>where
T: Freeze,
impl<T> RefUnwindSafe for Odd<T>where
T: RefUnwindSafe,
impl<T> Send for Odd<T>where
T: Send,
impl<T> Sync for Odd<T>where
T: Sync,
impl<T> Unpin for Odd<T>where
T: Unpin,
impl<T> UnwindSafe for Odd<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> ConstantTimeSelect for Twhere
T: ConditionallySelectable,
impl<T> ConstantTimeSelect for Twhere
T: ConditionallySelectable,
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.