pub struct RnsInt {
pub residues: Vec<u32>,
pub basis: Basis,
}Expand description
An exact integer in balanced RNS form (Level 0 of the tower).
Fields§
§residues: Vec<u32>residues[i] = value mod basis[i], stored canonically in [0, p).
basis: BasisImplementations§
Source§impl RnsInt
impl RnsInt
Sourcepub fn from_bigint(n: &BigInt, basis: Basis) -> Self
pub fn from_bigint(n: &BigInt, basis: Basis) -> Self
Construct from an arbitrary BigInt (reduced into each channel).
Sourcepub fn from_i64(n: i64, basis: Basis) -> Self
pub fn from_i64(n: i64, basis: Basis) -> Self
Construct from a machine integer.
Examples found in repository?
examples/benchmark_backends.rs (line 41)
22fn main() {
23 let exec = executor();
24 let ch = Basis::standard();
25 let has_gpu = exec.gpu().is_some();
26
27 println!("== adele-ring :: backend benchmark ({} channels) ==", ch.len());
28 println!(
29 "GPU available: {}\n",
30 if has_gpu {
31 exec.gpu().map(|g| g.adapter_name().to_string()).unwrap_or_default()
32 } else {
33 "no (CPU-only)".to_string()
34 }
35 );
36
37 println!("{:>10} | {:>14} | {:>12} | winner", "batch_size", "cpu_rayon_us", "gpu_us");
38 println!("{}", "-".repeat(56));
39
40 for &size in &[1usize, 16, 128, 1024, 16_384, 65_536] {
41 let a = RnsBatch::from_rns_ints(&vec![RnsInt::from_i64(123, ch.clone()); size]);
42 let b = RnsBatch::from_rns_ints(&vec![RnsInt::from_i64(456, ch.clone()); size]);
43
44 let iters = if size <= 128 { 2000 } else { 100 };
45 let cpu_us = time_backend(|| exec.cpu().batch_add(&a, &b), iters);
46
47 let (gpu_str, winner) = if let Some(gpu) = exec.gpu() {
48 let gpu_us = time_backend(|| gpu.batch_add(&a, &b), iters);
49 let w = if cpu_us <= gpu_us { "CPU" } else { "GPU" };
50 (format!("{gpu_us:>12.2}"), w)
51 } else {
52 (" n/a".to_string(), "CPU")
53 };
54
55 println!("{size:>10} | {cpu_us:>14.2} | {gpu_str} | {winner}");
56 }
57
58 println!(
59 "\nNote: CPU wins for small batches (GPU upload/dispatch overhead ~100us);\n\
60 GPU pulls ahead once the batch is large enough to amortize that fixed cost."
61 );
62}Sourcepub fn from_residues(residues: Vec<u32>, basis: Basis) -> Self
pub fn from_residues(residues: Vec<u32>, basis: Basis) -> Self
Build directly from raw channel residues (already reduced into [0, p)).
Sourcepub fn to_bigint(&self) -> BigInt
pub fn to_bigint(&self) -> BigInt
Reconstruct the exact signed value via Garner CRT + balanced folding.
Trait Implementations§
Source§impl Finite for RnsInt
impl Finite for RnsInt
fn basis(&self) -> &Basis
fn add(&self, o: &Self) -> Self
fn sub(&self, o: &Self) -> Self
fn mul(&self, o: &Self) -> Self
Auto Trait Implementations§
impl Freeze for RnsInt
impl RefUnwindSafe for RnsInt
impl Send for RnsInt
impl Sync for RnsInt
impl Unpin for RnsInt
impl UnsafeUnpin for RnsInt
impl UnwindSafe for RnsInt
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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>
Converts
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>
Converts
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