pub struct KeySwitchKeyParams {
pub special_modulus_factor_count: usize,
pub digits_without_special: Box<RNSGadgetVectorDigitIndices>,
}Expand description
Parameters for a key-switching key.
More concretely, (hybrid) key-switching is parameterized by two parameters:
- the set of digits used for the gadget decomposition
- the special modulus
For an explanation, see the doc of the corresponding members.
§Example
A standard choice is to use a small value for special_modulus_factor_count
(e.g. 1 or 2), and then set digit_count = rns_base_len / special_modulus_factor_count.
let rns_base_len = 10; // length of the RNS base of the ciphertext ring
let special_modulus_factor_count = 2;
let digit_count = rns_base_len / special_modulus_factor_count;
let params = KeySwitchKeyParams::default(digit_count, special_modulus_factor_count, rns_base_len);Fields§
§special_modulus_factor_count: usizethe special modulus is the product of the last special_modulus_factor_count rns factors
of the ciphertext ring. Key-switching can only be performed on ciphertexts over an rns base
that does not include the special modulus (i.e. must possibly be modulus-switched down before
performing key-switching, possibly introducing noise). On the other hand, a high special modulus
reduces the (additive) noise growth caused by key-switching. Note that the special modulus
can be 1 (if special_modulus_factor_count = 0), in which case only digit-based key-switching
will be performed.
digits_without_special: Box<RNSGadgetVectorDigitIndices>The groups of RNS factors that are used as digits during the gadget decomposition (see also RNSGadgetVectorDigitIndices).
The (additive) noise growth during key-switching depends on the largest digit (i.e. the maximal size
of the product of rns factors belonging to a single digit), however a larger number of digits
will make key-switching keys larger, and key-switching more expensive. Note that noise growth
becomes minimal if the largest digit is smaller or equal the special modulus.
The special modulus RNS factors should not be included in this list.
Implementations§
Source§impl KeySwitchKeyParams
impl KeySwitchKeyParams
Sourcepub fn default(
digit_count: usize,
special_modulus_factor_count: usize,
rns_base_len: usize,
) -> Self
pub fn default( digit_count: usize, special_modulus_factor_count: usize, rns_base_len: usize, ) -> Self
Creates new KeySwitchKeyParams, making a balanced selection of digits. This should
be a reasonable choice in basically all situations.
Sourcepub fn expected_rns_base_len(&self) -> usize
pub fn expected_rns_base_len(&self) -> usize
Returns the length of the RNS base that key-switching keys with these parameters are defined over.
Trait Implementations§
Source§impl Clone for KeySwitchKeyParams
impl Clone for KeySwitchKeyParams
Source§fn clone(&self) -> KeySwitchKeyParams
fn clone(&self) -> KeySwitchKeyParams
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for KeySwitchKeyParams
impl RefUnwindSafe for KeySwitchKeyParams
impl Send for KeySwitchKeyParams
impl Sync for KeySwitchKeyParams
impl Unpin for KeySwitchKeyParams
impl UnwindSafe for KeySwitchKeyParams
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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more