mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 13:16:44 +01:00
fixed bug when setting non-zero vec_znx
This commit is contained in:
@@ -102,15 +102,25 @@ impl VecZnx {
|
|||||||
let size: usize = min(data.len(), self.n());
|
let size: usize = min(data.len(), self.n());
|
||||||
let k_rem: usize = self.log_base2k - (self.log_q % self.log_base2k);
|
let k_rem: usize = self.log_base2k - (self.log_q % self.log_base2k);
|
||||||
|
|
||||||
|
let limbs: usize = self.limbs();
|
||||||
|
|
||||||
// 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 + k_rem < 63 || k_rem == self.log_base2k {
|
if log_max + k_rem < 63 || k_rem == self.log_base2k {
|
||||||
|
(0..limbs - 1).for_each(|i| unsafe {
|
||||||
|
znx_zero_i64_ref(size as u64, self.at_mut(i).as_mut_ptr());
|
||||||
|
});
|
||||||
|
|
||||||
self.at_mut(self.limbs() - 1)[..size].copy_from_slice(&data[..size]);
|
self.at_mut(self.limbs() - 1)[..size].copy_from_slice(&data[..size]);
|
||||||
} else {
|
} else {
|
||||||
let mask: i64 = (1 << self.log_base2k) - 1;
|
let mask: i64 = (1 << self.log_base2k) - 1;
|
||||||
let limbs = self.limbs();
|
|
||||||
let steps: usize = min(limbs, (log_max + self.log_base2k - 1) / self.log_base2k);
|
let steps: usize = min(limbs, (log_max + self.log_base2k - 1) / self.log_base2k);
|
||||||
|
|
||||||
|
(0..steps).for_each(|i| unsafe {
|
||||||
|
znx_zero_i64_ref(size as u64, self.at_mut(i).as_mut_ptr());
|
||||||
|
});
|
||||||
|
|
||||||
(limbs - steps..limbs)
|
(limbs - steps..limbs)
|
||||||
.rev()
|
.rev()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
@@ -134,16 +144,21 @@ impl VecZnx {
|
|||||||
pub fn from_i64_single(&mut self, i: usize, value: i64, log_max: usize) {
|
pub fn from_i64_single(&mut self, i: usize, value: i64, log_max: usize) {
|
||||||
assert!(i < self.n());
|
assert!(i < self.n());
|
||||||
let k_rem: usize = self.log_base2k - (self.log_q % self.log_base2k);
|
let k_rem: usize = self.log_base2k - (self.log_q % self.log_base2k);
|
||||||
|
let limbs = self.limbs();
|
||||||
|
|
||||||
// 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 + k_rem < 63 || k_rem == self.log_base2k {
|
if log_max + k_rem < 63 || k_rem == self.log_base2k {
|
||||||
|
(0..limbs - 1).for_each(|j| self.at_mut(j)[i] = 0);
|
||||||
|
|
||||||
self.at_mut(self.limbs() - 1)[i] = value;
|
self.at_mut(self.limbs() - 1)[i] = value;
|
||||||
} else {
|
} else {
|
||||||
let mask: i64 = (1 << self.log_base2k) - 1;
|
let mask: i64 = (1 << self.log_base2k) - 1;
|
||||||
let limbs = self.limbs();
|
|
||||||
let steps: usize = min(limbs, (log_max + self.log_base2k - 1) / self.log_base2k);
|
let steps: usize = min(limbs, (log_max + self.log_base2k - 1) / self.log_base2k);
|
||||||
|
|
||||||
|
(0..limbs - steps).for_each(|j| self.at_mut(j)[i] = 0);
|
||||||
|
|
||||||
(limbs - steps..limbs)
|
(limbs - steps..limbs)
|
||||||
.rev()
|
.rev()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
|
|||||||
Reference in New Issue
Block a user