mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 05:06:44 +01:00
fixed coefficients encoding
This commit is contained in:
@@ -137,22 +137,18 @@ fn encode_vec_i64<T: VecZnxCommon>(
|
|||||||
let size: usize = min(data.len(), a.n());
|
let size: usize = min(data.len(), a.n());
|
||||||
let log_k_rem: usize = log_base2k - (log_k % log_base2k);
|
let log_k_rem: usize = log_base2k - (log_k % log_base2k);
|
||||||
|
|
||||||
|
(0..a.cols()).for_each(|i| unsafe {
|
||||||
|
znx_zero_i64_ref(size as u64, a.at_mut(i).as_mut_ptr());
|
||||||
|
});
|
||||||
|
|
||||||
// If 2^{log_base2k} * 2^{k_rem} < 2^{63}-1, then we can simply copy
|
// If 2^{log_base2k} * 2^{k_rem} < 2^{63}-1, then we can simply copy
|
||||||
// values on the last limb.
|
// values on the last limb.
|
||||||
// Else we decompose values base2k.
|
// Else we decompose values base2k.
|
||||||
if log_max + log_k_rem < 63 || log_k_rem == log_base2k {
|
if log_max + log_k_rem < 63 || log_k_rem == log_base2k {
|
||||||
(0..a.cols()).for_each(|i| unsafe {
|
|
||||||
znx_zero_i64_ref(size as u64, a.at_mut(i).as_mut_ptr());
|
|
||||||
});
|
|
||||||
a.at_mut(cols - 1)[..size].copy_from_slice(&data[..size]);
|
a.at_mut(cols - 1)[..size].copy_from_slice(&data[..size]);
|
||||||
} else {
|
} else {
|
||||||
let mask: i64 = (1 << log_base2k) - 1;
|
let mask: i64 = (1 << log_base2k) - 1;
|
||||||
let steps: usize = min(cols, (log_max + log_base2k - 1) / log_base2k);
|
let steps: usize = min(cols, (log_max + log_base2k - 1) / log_base2k);
|
||||||
|
|
||||||
(0..steps).for_each(|i| unsafe {
|
|
||||||
znx_zero_i64_ref(size as u64, a.at_mut(i).as_mut_ptr());
|
|
||||||
});
|
|
||||||
|
|
||||||
(cols - steps..cols)
|
(cols - steps..cols)
|
||||||
.rev()
|
.rev()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
@@ -165,7 +161,6 @@ fn encode_vec_i64<T: VecZnxCommon>(
|
|||||||
|
|
||||||
// Case where self.prec % self.k != 0.
|
// Case where self.prec % self.k != 0.
|
||||||
if log_k_rem != log_base2k {
|
if log_k_rem != log_base2k {
|
||||||
let cols = a.cols();
|
|
||||||
let steps: usize = min(cols, (log_max + log_base2k - 1) / log_base2k);
|
let steps: usize = min(cols, (log_max + log_base2k - 1) / log_base2k);
|
||||||
(cols - steps..cols).rev().for_each(|i| {
|
(cols - steps..cols).rev().for_each(|i| {
|
||||||
a.at_mut(i)[..size]
|
a.at_mut(i)[..size]
|
||||||
@@ -246,21 +241,16 @@ fn encode_coeff_i64<T: VecZnxCommon>(
|
|||||||
a.cols()
|
a.cols()
|
||||||
);
|
);
|
||||||
let log_k_rem: usize = log_base2k - (log_k % log_base2k);
|
let log_k_rem: usize = log_base2k - (log_k % log_base2k);
|
||||||
let cols = a.cols();
|
(0..a.cols()).for_each(|j| a.at_mut(j)[i] = 0);
|
||||||
|
|
||||||
// If 2^{log_base2k} * 2^{log_k_rem} < 2^{63}-1, then we can simply copy
|
// If 2^{log_base2k} * 2^{log_k_rem} < 2^{63}-1, then we can simply copy
|
||||||
// values on the last limb.
|
// values on the last limb.
|
||||||
// Else we decompose values base2k.
|
// Else we decompose values base2k.
|
||||||
if log_max + log_k_rem < 63 || log_k_rem == log_base2k {
|
if log_max + log_k_rem < 63 || log_k_rem == log_base2k {
|
||||||
(0..cols - 1).for_each(|j| a.at_mut(j)[i] = 0);
|
a.at_mut(cols-1)[i] = value;
|
||||||
|
|
||||||
a.at_mut(a.cols() - 1)[i] = value;
|
|
||||||
} else {
|
} else {
|
||||||
let mask: i64 = (1 << log_base2k) - 1;
|
let mask: i64 = (1 << log_base2k) - 1;
|
||||||
let steps: usize = min(cols, (log_max + log_base2k - 1) / log_base2k);
|
let steps: usize = min(cols, (log_max + log_base2k - 1) / log_base2k);
|
||||||
|
|
||||||
(0..cols - steps).for_each(|j| a.at_mut(j)[i] = 0);
|
|
||||||
|
|
||||||
(cols - steps..cols)
|
(cols - steps..cols)
|
||||||
.rev()
|
.rev()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
@@ -271,7 +261,6 @@ fn encode_coeff_i64<T: VecZnxCommon>(
|
|||||||
|
|
||||||
// Case where prec % k != 0.
|
// Case where prec % k != 0.
|
||||||
if log_k_rem != log_base2k {
|
if log_k_rem != log_base2k {
|
||||||
let cols = a.cols();
|
|
||||||
let steps: usize = min(cols, (log_max + log_base2k - 1) / log_base2k);
|
let steps: usize = min(cols, (log_max + log_base2k - 1) / log_base2k);
|
||||||
(cols - steps..cols).rev().for_each(|j| {
|
(cols - steps..cols).rev().for_each(|j| {
|
||||||
a.at_mut(j)[i] <<= log_k_rem;
|
a.at_mut(j)[i] <<= log_k_rem;
|
||||||
|
|||||||
Reference in New Issue
Block a user