mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 05:06:44 +01:00
Bug fixes
- fixed `encoding.rs/decode_coeff_i64` for the case `k < basek2`
- `glwe/external_product.rs/external_product_scratch_space` did not allocate enough space for [`a_dft`](829b8be610/core/src/glwe/external_product.rs (L83)) when `k_out < k_ggsw`. Fixed by replacing `in_size` with `ggsw_size`.
- `glwe/ops.rs/add` sets `basek` and `k`of `self` GLWECiphertext whic is invalid because the `size` which depends on `inner` data remains unchanged.
- (not a fix) expose `backend` from `core`.
This commit is contained in:
@@ -269,12 +269,12 @@ fn decode_coeff_i64<D: AsRef<[u8]>>(a: &VecZnx<D>, col_i: usize, basek: usize, k
|
|||||||
|
|
||||||
let size: usize = (k + basek - 1) / basek;
|
let size: usize = (k + basek - 1) / basek;
|
||||||
let data: &[i64] = a.raw();
|
let data: &[i64] = a.raw();
|
||||||
let mut res: i64 = data[i];
|
let mut res: i64 = 0;
|
||||||
let rem: usize = basek - (k % basek);
|
let rem: usize = basek - (k % basek);
|
||||||
let slice_size: usize = a.n() * a.cols();
|
let slice_size: usize = a.n() * a.cols();
|
||||||
(0..size).for_each(|i| {
|
(0..size).for_each(|j| {
|
||||||
let x: i64 = data[i * slice_size];
|
let x: i64 = data[j * slice_size + i];
|
||||||
if i == size - 1 && rem != basek {
|
if j == size - 1 && rem != basek {
|
||||||
let k_rem: usize = basek - rem;
|
let k_rem: usize = basek - rem;
|
||||||
res = (res << k_rem) + (x >> rem);
|
res = (res << k_rem) + (x >> rem);
|
||||||
} else {
|
} else {
|
||||||
@@ -320,7 +320,7 @@ mod tests {
|
|||||||
let module: Module<FFT64> = Module::<FFT64>::new(n);
|
let module: Module<FFT64> = Module::<FFT64>::new(n);
|
||||||
let basek: usize = 17;
|
let basek: usize = 17;
|
||||||
let size: usize = 5;
|
let size: usize = 5;
|
||||||
for k in [size * basek - 5] {
|
for k in [1, basek / 2, size * basek - 5] {
|
||||||
let mut a: VecZnx<_> = module.new_vec_znx(2, size);
|
let mut a: VecZnx<_> = module.new_vec_znx(2, size);
|
||||||
let mut source = Source::new([0u8; 32]);
|
let mut source = Source::new([0u8; 32]);
|
||||||
let raw: &mut [i64] = a.raw_mut();
|
let raw: &mut [i64] = a.raw_mut();
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ impl GLWECiphertext<Vec<u8>> {
|
|||||||
let in_size: usize = k_in.div_ceil(basek).div_ceil(digits);
|
let in_size: usize = k_in.div_ceil(basek).div_ceil(digits);
|
||||||
let out_size: usize = k_out.div_ceil(basek);
|
let out_size: usize = k_out.div_ceil(basek);
|
||||||
let ggsw_size: usize = k_ggsw.div_ceil(basek);
|
let ggsw_size: usize = k_ggsw.div_ceil(basek);
|
||||||
let vmp: usize = module.bytes_of_vec_znx_dft(rank + 1, in_size)
|
let vmp: usize = module.bytes_of_vec_znx_dft(rank + 1, ggsw_size)
|
||||||
+ module.vmp_apply_tmp_bytes(
|
+ module.vmp_apply_tmp_bytes(
|
||||||
out_size,
|
out_size,
|
||||||
in_size,
|
in_size,
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ pub trait GLWEOps: GLWECiphertextToMut + Infos + SetMetaData {
|
|||||||
assert_eq!(b.n(), module.n());
|
assert_eq!(b.n(), module.n());
|
||||||
assert_eq!(self.n(), module.n());
|
assert_eq!(self.n(), module.n());
|
||||||
assert_eq!(a.basek(), b.basek());
|
assert_eq!(a.basek(), b.basek());
|
||||||
|
assert_eq!(self.basek(), a.basek());
|
||||||
assert!(self.rank() >= a.rank().max(b.rank()));
|
assert!(self.rank() >= a.rank().max(b.rank()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,8 +47,8 @@ pub trait GLWEOps: GLWECiphertextToMut + Infos + SetMetaData {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
self.set_basek(a.basek());
|
// self.set_basek(a.basek());
|
||||||
self.set_k(a.k().max(b.k()));
|
// self.set_k(a.k().max(b.k()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_inplace<A>(&mut self, module: &Module<FFT64>, a: &A)
|
fn add_inplace<A>(&mut self, module: &Module<FFT64>, a: &A)
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ pub use glwe::{GLWECiphertext, GLWEOps, GLWEPacker, GLWEPlaintext, GLWEPublicKey
|
|||||||
pub(crate) use glwe::{GLWECiphertextToMut, GLWECiphertextToRef};
|
pub(crate) use glwe::{GLWECiphertextToMut, GLWECiphertextToRef};
|
||||||
pub use lwe::{LWECiphertext, LWESecret};
|
pub use lwe::{LWECiphertext, LWESecret};
|
||||||
|
|
||||||
|
pub use backend;
|
||||||
pub use backend::Scratch;
|
pub use backend::Scratch;
|
||||||
pub use backend::ScratchOwned;
|
pub use backend::ScratchOwned;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user