use crate::reference::znx::{copy::znx_copy_ref, zero::znx_zero_ref}; pub fn znx_switch_ring_ref(res: &mut [i64], a: &[i64]) { let (n_in, n_out) = (a.len(), res.len()); #[cfg(debug_assertions)] { assert!(n_in.is_power_of_two()); assert!(n_in.max(n_out).is_multiple_of(n_in.min(n_out))) } if n_in == n_out { znx_copy_ref(res, a); return; } let (gap_in, gap_out): (usize, usize); if n_in > n_out { (gap_in, gap_out) = (n_in / n_out, 1) } else { (gap_in, gap_out) = (1, n_out / n_in); znx_zero_ref(res); } res.iter_mut() .step_by(gap_out) .zip(a.iter().step_by(gap_in)) .for_each(|(x_out, x_in)| *x_out = *x_in); }