mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 13:16:44 +01:00
Add BDD Arithmetic (#98)
* Added some circuit, evaluation + some layouts * Refactor + memory reduction * Rows -> Dnum, Digits -> Dsize * fix #96 + glwe_packing (indirectly CBT) * clippy
This commit is contained in:
committed by
GitHub
parent
37e13b965c
commit
6357a05509
@@ -1,8 +1,8 @@
|
||||
use poulpy_hal::test_suite::serialization::test_reader_writer_interface;
|
||||
|
||||
use crate::layouts::{
|
||||
Base2K, Degree, Digits, GGLWEAutomorphismKey, GGLWECiphertext, GGLWESwitchingKey, GGLWETensorKey, GGSWCiphertext,
|
||||
GLWECiphertext, GLWEToLWESwitchingKey, LWECiphertext, LWESwitchingKey, LWEToGLWESwitchingKey, Rank, Rows, TorusPrecision,
|
||||
Base2K, Degree, Dnum, Dsize, GGLWEAutomorphismKey, GGLWECiphertext, GGLWESwitchingKey, GGLWETensorKey, GGSWCiphertext,
|
||||
GLWECiphertext, GLWEToLWEKey, LWECiphertext, LWESwitchingKey, LWEToGLWESwitchingKey, Rank, TorusPrecision,
|
||||
compressed::{
|
||||
GGLWEAutomorphismKeyCompressed, GGLWECiphertextCompressed, GGLWESwitchingKeyCompressed, GGLWETensorKeyCompressed,
|
||||
GGSWCiphertextCompressed, GLWECiphertextCompressed, GLWEToLWESwitchingKeyCompressed, LWECiphertextCompressed,
|
||||
@@ -14,9 +14,9 @@ const N_GLWE: Degree = Degree(64);
|
||||
const N_LWE: Degree = Degree(32);
|
||||
const BASE2K: Base2K = Base2K(12);
|
||||
const K: TorusPrecision = TorusPrecision(33);
|
||||
const ROWS: Rows = Rows(3);
|
||||
const DNUM: Dnum = Dnum(3);
|
||||
const RANK: Rank = Rank(2);
|
||||
const DIGITS: Digits = Digits(1);
|
||||
const DSIZE: Dsize = Dsize(1);
|
||||
|
||||
#[test]
|
||||
fn glwe_serialization() {
|
||||
@@ -44,101 +44,101 @@ fn lwe_compressed_serialization() {
|
||||
|
||||
#[test]
|
||||
fn test_gglwe_serialization() {
|
||||
let original: GGLWECiphertext<Vec<u8>> = GGLWECiphertext::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK, RANK);
|
||||
let original: GGLWECiphertext<Vec<u8>> = GGLWECiphertext::alloc_with(N_GLWE, BASE2K, K, RANK, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_gglwe_compressed_serialization() {
|
||||
let original: GGLWECiphertextCompressed<Vec<u8>> =
|
||||
GGLWECiphertextCompressed::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK, RANK);
|
||||
GGLWECiphertextCompressed::alloc_with(N_GLWE, BASE2K, K, RANK, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_glwe_switching_key_serialization() {
|
||||
let original: GGLWESwitchingKey<Vec<u8>> = GGLWESwitchingKey::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK, RANK);
|
||||
let original: GGLWESwitchingKey<Vec<u8>> = GGLWESwitchingKey::alloc_with(N_GLWE, BASE2K, K, RANK, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_glwe_switching_key_compressed_serialization() {
|
||||
let original: GGLWESwitchingKeyCompressed<Vec<u8>> =
|
||||
GGLWESwitchingKeyCompressed::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK, RANK);
|
||||
GGLWESwitchingKeyCompressed::alloc_with(N_GLWE, BASE2K, K, RANK, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_automorphism_key_serialization() {
|
||||
let original: GGLWEAutomorphismKey<Vec<u8>> = GGLWEAutomorphismKey::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK);
|
||||
let original: GGLWEAutomorphismKey<Vec<u8>> = GGLWEAutomorphismKey::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_automorphism_key_compressed_serialization() {
|
||||
let original: GGLWEAutomorphismKeyCompressed<Vec<u8>> =
|
||||
GGLWEAutomorphismKeyCompressed::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK);
|
||||
GGLWEAutomorphismKeyCompressed::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_tensor_key_serialization() {
|
||||
let original: GGLWETensorKey<Vec<u8>> = GGLWETensorKey::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK);
|
||||
let original: GGLWETensorKey<Vec<u8>> = GGLWETensorKey::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_tensor_key_compressed_serialization() {
|
||||
let original: GGLWETensorKeyCompressed<Vec<u8>> = GGLWETensorKeyCompressed::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK);
|
||||
let original: GGLWETensorKeyCompressed<Vec<u8>> = GGLWETensorKeyCompressed::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn glwe_to_lwe_switching_key_serialization() {
|
||||
let original: GLWEToLWESwitchingKey<Vec<u8>> = GLWEToLWESwitchingKey::alloc_with(N_GLWE, BASE2K, K, ROWS, RANK);
|
||||
let original: GLWEToLWEKey<Vec<u8>> = GLWEToLWEKey::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn glwe_to_lwe_switching_key_compressed_serialization() {
|
||||
let original: GLWEToLWESwitchingKeyCompressed<Vec<u8>> =
|
||||
GLWEToLWESwitchingKeyCompressed::alloc_with(N_GLWE, BASE2K, K, ROWS, RANK);
|
||||
GLWEToLWESwitchingKeyCompressed::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lwe_to_glwe_switching_key_serialization() {
|
||||
let original: LWEToGLWESwitchingKey<Vec<u8>> = LWEToGLWESwitchingKey::alloc_with(N_GLWE, BASE2K, K, ROWS, RANK);
|
||||
let original: LWEToGLWESwitchingKey<Vec<u8>> = LWEToGLWESwitchingKey::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lwe_to_glwe_switching_key_compressed_serialization() {
|
||||
let original: LWEToGLWESwitchingKeyCompressed<Vec<u8>> =
|
||||
LWEToGLWESwitchingKeyCompressed::alloc_with(N_GLWE, BASE2K, K, ROWS, RANK);
|
||||
LWEToGLWESwitchingKeyCompressed::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lwe_switching_key_serialization() {
|
||||
let original: LWESwitchingKey<Vec<u8>> = LWESwitchingKey::alloc_with(N_GLWE, BASE2K, K, ROWS);
|
||||
let original: LWESwitchingKey<Vec<u8>> = LWESwitchingKey::alloc_with(N_GLWE, BASE2K, K, DNUM);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lwe_switching_key_compressed_serialization() {
|
||||
let original: LWESwitchingKeyCompressed<Vec<u8>> = LWESwitchingKeyCompressed::alloc_with(N_GLWE, BASE2K, K, ROWS);
|
||||
let original: LWESwitchingKeyCompressed<Vec<u8>> = LWESwitchingKeyCompressed::alloc_with(N_GLWE, BASE2K, K, DNUM);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ggsw_serialization() {
|
||||
let original: GGSWCiphertext<Vec<u8>> = GGSWCiphertext::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK);
|
||||
let original: GGSWCiphertext<Vec<u8>> = GGSWCiphertext::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ggsw_compressed_serialization() {
|
||||
let original: GGSWCiphertextCompressed<Vec<u8>> = GGSWCiphertextCompressed::alloc_with(N_GLWE, BASE2K, K, ROWS, DIGITS, RANK);
|
||||
let original: GGSWCiphertextCompressed<Vec<u8>> = GGSWCiphertextCompressed::alloc_with(N_GLWE, BASE2K, K, RANK, DNUM, DSIZE);
|
||||
test_reader_writer_interface(original);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ use poulpy_hal::{
|
||||
use crate::{
|
||||
encryption::SIGMA,
|
||||
layouts::{
|
||||
GGLWEAutomorphismKey, GGLWEAutomorphismKeyLayout, GGLWELayoutInfos, GLWEPlaintext, GLWESecret,
|
||||
GGLWEAutomorphismKey, GGLWEAutomorphismKeyLayout, GGLWEInfos, GLWEPlaintext, GLWESecret,
|
||||
prepared::{GGLWEAutomorphismKeyPrepared, GLWESecretPrepared, Prepare, PrepareAlloc},
|
||||
},
|
||||
noise::log2_std_noise_gglwe_product,
|
||||
@@ -70,26 +70,26 @@ where
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 60;
|
||||
let k_out: usize = 40;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
let p0: i64 = -1;
|
||||
let p1: i64 = -5;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
let k_apply: usize = (digits + di) * base2k;
|
||||
for di in 1..dsize + 1 {
|
||||
let k_apply: usize = (dsize + di) * base2k;
|
||||
|
||||
let n: usize = module.n();
|
||||
let digits_in: usize = 1;
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let rows_in: usize = k_in / (base2k * di);
|
||||
let rows_out: usize = k_out / (base2k * di);
|
||||
let rows_apply: usize = k_in.div_ceil(base2k * di);
|
||||
let dnum_in: usize = k_in / (base2k * di);
|
||||
let dnum_out: usize = k_out / (base2k * di);
|
||||
let dnum_apply: usize = k_in.div_ceil(base2k * di);
|
||||
|
||||
let auto_key_in_infos: GGLWEAutomorphismKeyLayout = GGLWEAutomorphismKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_in.into(),
|
||||
rows: rows_in.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_in.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -97,8 +97,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows_out.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_out.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -106,8 +106,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_apply.into(),
|
||||
rows: rows_apply.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum_apply.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -183,7 +183,7 @@ where
|
||||
let sk_auto_dft: GLWESecretPrepared<Vec<u8>, B> = sk_auto.prepare_alloc(module, scratch.borrow());
|
||||
|
||||
(0..auto_key_out.rank_in().into()).for_each(|col_i| {
|
||||
(0..auto_key_out.rows().into()).for_each(|row_i| {
|
||||
(0..auto_key_out.dnum().into()).for_each(|row_i| {
|
||||
auto_key_out
|
||||
.at(row_i, col_i)
|
||||
.decrypt(module, &mut pt, &sk_auto_dft, scratch.borrow());
|
||||
@@ -191,7 +191,7 @@ where
|
||||
module.vec_znx_sub_scalar_inplace(
|
||||
&mut pt.data,
|
||||
0,
|
||||
(digits_in - 1) + row_i * digits_in,
|
||||
(dsize_in - 1) + row_i * dsize_in,
|
||||
&sk.data,
|
||||
col_i,
|
||||
);
|
||||
@@ -280,25 +280,25 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 60;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
let p0: i64 = -1;
|
||||
let p1: i64 = -5;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
let k_apply: usize = (digits + di) * base2k;
|
||||
for di in 1..dsize + 1 {
|
||||
let k_apply: usize = (dsize + di) * base2k;
|
||||
|
||||
let n: usize = module.n();
|
||||
let digits_in: usize = 1;
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let rows_in: usize = k_in / (base2k * di);
|
||||
let rows_apply: usize = k_in.div_ceil(base2k * di);
|
||||
let dnum_in: usize = k_in / (base2k * di);
|
||||
let dnum_apply: usize = k_in.div_ceil(base2k * di);
|
||||
|
||||
let auto_key_layout: GGLWEAutomorphismKeyLayout = GGLWEAutomorphismKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_in.into(),
|
||||
rows: rows_in.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_in.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -306,8 +306,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_apply.into(),
|
||||
rows: rows_apply.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum_apply.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -373,14 +373,14 @@ where
|
||||
let sk_auto_dft: GLWESecretPrepared<Vec<u8>, B> = sk_auto.prepare_alloc(module, scratch.borrow());
|
||||
|
||||
(0..auto_key.rank_in().into()).for_each(|col_i| {
|
||||
(0..auto_key.rows().into()).for_each(|row_i| {
|
||||
(0..auto_key.dnum().into()).for_each(|row_i| {
|
||||
auto_key
|
||||
.at(row_i, col_i)
|
||||
.decrypt(module, &mut pt, &sk_auto_dft, scratch.borrow());
|
||||
module.vec_znx_sub_scalar_inplace(
|
||||
&mut pt.data,
|
||||
0,
|
||||
(digits_in - 1) + row_i * digits_in,
|
||||
(dsize_in - 1) + row_i * dsize_in,
|
||||
&sk.data,
|
||||
col_i,
|
||||
);
|
||||
|
||||
@@ -77,27 +77,27 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 54;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
let p: i64 = -5;
|
||||
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ksk: usize = k_in + base2k * di;
|
||||
let k_tsk: usize = k_ksk;
|
||||
let k_out: usize = k_ksk; // Better capture noise.
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_in.div_ceil(base2k * di);
|
||||
let rows_in: usize = k_in.div_euclid(base2k * di);
|
||||
let dnum: usize = k_in.div_ceil(base2k * di);
|
||||
let dnum_in: usize = k_in.div_euclid(base2k * di);
|
||||
|
||||
let digits_in: usize = 1;
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let ggsw_in_layout: GGSWCiphertextLayout = GGSWCiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_in.into(),
|
||||
rows: rows_in.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_in.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -105,8 +105,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows_in.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_in.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -114,8 +114,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_tsk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -123,8 +123,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -270,24 +270,24 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_out: usize = 54;
|
||||
let digits: usize = k_out.div_ceil(base2k);
|
||||
let dsize: usize = k_out.div_ceil(base2k);
|
||||
let p: i64 = -1;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ksk: usize = k_out + base2k * di;
|
||||
let k_tsk: usize = k_ksk;
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_out.div_ceil(di * base2k);
|
||||
let rows_in: usize = k_out.div_euclid(base2k * di);
|
||||
let digits_in: usize = 1;
|
||||
let dnum: usize = k_out.div_ceil(di * base2k);
|
||||
let dnum_in: usize = k_out.div_euclid(base2k * di);
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let ggsw_out_layout: GGSWCiphertextLayout = GGSWCiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows_in.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_in.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -295,8 +295,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_tsk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -304,8 +304,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
|
||||
@@ -67,15 +67,15 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 60;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
let p: i64 = -5;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ksk: usize = k_in + base2k * di;
|
||||
let k_out: usize = k_ksk; // Better capture noise.
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_in.div_ceil(base2k * digits);
|
||||
let dnum: usize = k_in.div_ceil(base2k * dsize);
|
||||
|
||||
let ct_in_infos: GLWECiphertextLayout = GLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
@@ -96,8 +96,8 @@ where
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rank: rank.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
};
|
||||
|
||||
let mut autokey: GGLWEAutomorphismKey<Vec<u8>> = GGLWEAutomorphismKey::alloc(&autokey_infos);
|
||||
@@ -148,7 +148,7 @@ where
|
||||
|
||||
let max_noise: f64 = log2_std_noise_gglwe_product(
|
||||
module.n() as f64,
|
||||
base2k * digits,
|
||||
base2k * dsize,
|
||||
0.5,
|
||||
0.5,
|
||||
0f64,
|
||||
@@ -210,14 +210,14 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_out: usize = 60;
|
||||
let digits: usize = k_out.div_ceil(base2k);
|
||||
let dsize: usize = k_out.div_ceil(base2k);
|
||||
let p = -5;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ksk: usize = k_out + base2k * di;
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_out.div_ceil(base2k * digits);
|
||||
let dnum: usize = k_out.div_ceil(base2k * dsize);
|
||||
|
||||
let ct_out_infos: GLWECiphertextLayout = GLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
@@ -231,8 +231,8 @@ where
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rank: rank.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
};
|
||||
|
||||
let mut autokey: GGLWEAutomorphismKey<Vec<u8>> = GGLWEAutomorphismKey::alloc(&autokey_infos);
|
||||
@@ -282,7 +282,7 @@ where
|
||||
|
||||
let max_noise: f64 = log2_std_noise_gglwe_product(
|
||||
module.n() as f64,
|
||||
base2k * digits,
|
||||
base2k * dsize,
|
||||
0.5,
|
||||
0.5,
|
||||
0f64,
|
||||
|
||||
@@ -16,9 +16,9 @@ use poulpy_hal::{
|
||||
};
|
||||
|
||||
use crate::layouts::{
|
||||
Base2K, Degree, GLWECiphertext, GLWECiphertextLayout, GLWEPlaintext, GLWESecret, GLWEToLWESwitchingKey,
|
||||
GLWEToLWESwitchingKeyLayout, LWECiphertext, LWECiphertextLayout, LWEPlaintext, LWESecret, LWEToGLWESwitchingKey,
|
||||
LWEToGLWESwitchingKeyLayout, Rank, Rows, TorusPrecision,
|
||||
Base2K, Degree, Dnum, GLWECiphertext, GLWECiphertextLayout, GLWEPlaintext, GLWESecret, GLWEToLWEKey, GLWEToLWEKeyLayout,
|
||||
LWECiphertext, LWECiphertextLayout, LWEPlaintext, LWESecret, LWEToGLWESwitchingKey, LWEToGLWESwitchingKeyLayout, Rank,
|
||||
TorusPrecision,
|
||||
prepared::{GLWESecretPrepared, GLWEToLWESwitchingKeyPrepared, LWEToGLWESwitchingKeyPrepared, PrepareAlloc},
|
||||
};
|
||||
|
||||
@@ -79,7 +79,7 @@ where
|
||||
n: n_glwe,
|
||||
base2k: Base2K(17),
|
||||
k: TorusPrecision(51),
|
||||
rows: Rows(2),
|
||||
dnum: Dnum(2),
|
||||
rank_out: rank,
|
||||
};
|
||||
|
||||
@@ -188,11 +188,11 @@ where
|
||||
let rank: Rank = Rank(2);
|
||||
let k_lwe_pt: TorusPrecision = TorusPrecision(8);
|
||||
|
||||
let glwe_to_lwe_infos: GLWEToLWESwitchingKeyLayout = GLWEToLWESwitchingKeyLayout {
|
||||
let glwe_to_lwe_infos: GLWEToLWEKeyLayout = GLWEToLWEKeyLayout {
|
||||
n: n_glwe,
|
||||
base2k: Base2K(17),
|
||||
k: TorusPrecision(51),
|
||||
rows: Rows(2),
|
||||
dnum: Dnum(2),
|
||||
rank_in: rank,
|
||||
};
|
||||
|
||||
@@ -214,7 +214,7 @@ where
|
||||
let mut source_xe: Source = Source::new([0u8; 32]);
|
||||
|
||||
let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(
|
||||
GLWEToLWESwitchingKey::encrypt_sk_scratch_space(module, &glwe_to_lwe_infos)
|
||||
GLWEToLWEKey::encrypt_sk_scratch_space(module, &glwe_to_lwe_infos)
|
||||
| LWECiphertext::from_glwe_scratch_space(module, &lwe_infos, &glwe_infos, &glwe_to_lwe_infos)
|
||||
| GLWECiphertext::decrypt_scratch_space(module, &glwe_infos),
|
||||
);
|
||||
@@ -241,7 +241,7 @@ where
|
||||
scratch.borrow(),
|
||||
);
|
||||
|
||||
let mut ksk: GLWEToLWESwitchingKey<Vec<u8>> = GLWEToLWESwitchingKey::alloc(&glwe_to_lwe_infos);
|
||||
let mut ksk: GLWEToLWEKey<Vec<u8>> = GLWEToLWEKey::alloc(&glwe_to_lwe_infos);
|
||||
|
||||
ksk.encrypt_sk(
|
||||
module,
|
||||
|
||||
@@ -69,18 +69,18 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_ksk: usize = 60;
|
||||
let digits: usize = k_ksk.div_ceil(base2k) - 1;
|
||||
let dsize: usize = k_ksk.div_ceil(base2k) - 1;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let n: usize = module.n();
|
||||
let rows: usize = (k_ksk - di * base2k) / (di * base2k);
|
||||
let dnum: usize = (k_ksk - di * base2k) / (di * base2k);
|
||||
|
||||
let atk_infos: GGLWEAutomorphismKeyLayout = GGLWEAutomorphismKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -172,18 +172,18 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_ksk: usize = 60;
|
||||
let digits: usize = k_ksk.div_ceil(base2k) - 1;
|
||||
let dsize: usize = k_ksk.div_ceil(base2k) - 1;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let n: usize = module.n();
|
||||
let rows: usize = (k_ksk - di * base2k) / (di * base2k);
|
||||
let dnum: usize = (k_ksk - di * base2k) / (di * base2k);
|
||||
|
||||
let atk_infos: GGLWEAutomorphismKeyLayout = GGLWEAutomorphismKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
|
||||
@@ -64,19 +64,19 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_ksk: usize = 54;
|
||||
let digits: usize = k_ksk / base2k;
|
||||
let dsize: usize = k_ksk / base2k;
|
||||
for rank_in in 1_usize..3 {
|
||||
for rank_out in 1_usize..3 {
|
||||
for di in 1_usize..digits + 1 {
|
||||
for di in 1_usize..dsize + 1 {
|
||||
let n: usize = module.n();
|
||||
let rows: usize = (k_ksk - di * base2k) / (di * base2k);
|
||||
let dnum: usize = (k_ksk - di * base2k) / (di * base2k);
|
||||
|
||||
let gglwe_infos: GGLWECiphertextLayout = GGLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank_in: rank_in.into(),
|
||||
rank_out: rank_out.into(),
|
||||
};
|
||||
@@ -156,19 +156,19 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_ksk: usize = 54;
|
||||
let digits: usize = k_ksk / base2k;
|
||||
let dsize: usize = k_ksk / base2k;
|
||||
for rank_in in 1_usize..3 {
|
||||
for rank_out in 1_usize..3 {
|
||||
for di in 1_usize..digits + 1 {
|
||||
for di in 1_usize..dsize + 1 {
|
||||
let n: usize = module.n();
|
||||
let rows: usize = (k_ksk - di * base2k) / (di * base2k);
|
||||
let dnum: usize = (k_ksk - di * base2k) / (di * base2k);
|
||||
|
||||
let gglwe_infos: GGLWECiphertextLayout = GGLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank_in: rank_in.into(),
|
||||
rank_out: rank_out.into(),
|
||||
};
|
||||
|
||||
@@ -67,18 +67,18 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k: usize = 54;
|
||||
let digits: usize = k / base2k;
|
||||
let dsize: usize = k / base2k;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let n: usize = module.n();
|
||||
let rows: usize = (k - di * base2k) / (di * base2k);
|
||||
let dnum: usize = (k - di * base2k) / (di * base2k);
|
||||
|
||||
let ggsw_infos: GGSWCiphertextLayout = GGSWCiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -160,18 +160,18 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k: usize = 54;
|
||||
let digits: usize = k / base2k;
|
||||
let dsize: usize = k / base2k;
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let n: usize = module.n();
|
||||
let rows: usize = (k - di * base2k) / (di * base2k);
|
||||
let dnum: usize = (k - di * base2k) / (di * base2k);
|
||||
|
||||
let ggsw_infos: GGSWCiphertextLayout = GGSWCiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ use poulpy_hal::{
|
||||
use crate::{
|
||||
encryption::SIGMA,
|
||||
layouts::{
|
||||
Digits, GGLWETensorKey, GGLWETensorKeyLayout, GLWEPlaintext, GLWESecret,
|
||||
Dsize, GGLWETensorKey, GGLWETensorKeyLayout, GLWEPlaintext, GLWESecret,
|
||||
compressed::{Decompress, GGLWETensorKeyCompressed},
|
||||
prepared::{GLWESecretPrepared, PrepareAlloc},
|
||||
},
|
||||
@@ -69,14 +69,14 @@ where
|
||||
|
||||
for rank in 1_usize..3 {
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k / base2k;
|
||||
let dnum: usize = k / base2k;
|
||||
|
||||
let tensor_key_infos = GGLWETensorKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k.into(),
|
||||
rows: rows.into(),
|
||||
digits: Digits(1),
|
||||
dnum: dnum.into(),
|
||||
dsize: Dsize(1),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -127,7 +127,7 @@ where
|
||||
0,
|
||||
scratch.borrow(),
|
||||
);
|
||||
for row_i in 0..rows {
|
||||
for row_i in 0..dnum {
|
||||
tensor_key
|
||||
.at(i, j)
|
||||
.at(row_i, 0)
|
||||
@@ -188,14 +188,14 @@ where
|
||||
let k = 54;
|
||||
for rank in 1_usize..3 {
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k / base2k;
|
||||
let dnum: usize = k / base2k;
|
||||
|
||||
let tensor_key_infos: GGLWETensorKeyLayout = GGLWETensorKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k.into(),
|
||||
rows: rows.into(),
|
||||
digits: Digits(1),
|
||||
dnum: dnum.into(),
|
||||
dsize: Dsize(1),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -244,7 +244,7 @@ where
|
||||
0,
|
||||
scratch.borrow(),
|
||||
);
|
||||
for row_i in 0..rows {
|
||||
for row_i in 0..dnum {
|
||||
tensor_key
|
||||
.at(i, j)
|
||||
.at(row_i, 0)
|
||||
|
||||
@@ -70,23 +70,23 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 60;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
for rank_in in 1_usize..3 {
|
||||
for rank_out in 1_usize..3 {
|
||||
for di in 1_usize..digits + 1 {
|
||||
for di in 1_usize..dsize + 1 {
|
||||
let k_ggsw: usize = k_in + base2k * di;
|
||||
let k_out: usize = k_in; // Better capture noise.
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_in.div_ceil(base2k * di);
|
||||
let digits_in: usize = 1;
|
||||
let dnum: usize = k_in.div_ceil(base2k * di);
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let gglwe_in_infos: GGLWESwitchingKeyLayout = GGLWESwitchingKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_in.into(),
|
||||
rows: rows.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank_in: rank_in.into(),
|
||||
rank_out: rank_out.into(),
|
||||
};
|
||||
@@ -95,8 +95,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank_in: rank_in.into(),
|
||||
rank_out: rank_out.into(),
|
||||
};
|
||||
@@ -105,8 +105,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ggsw.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank_out.into(),
|
||||
};
|
||||
|
||||
@@ -252,23 +252,23 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_out: usize = 60;
|
||||
let digits: usize = k_out.div_ceil(base2k);
|
||||
let dsize: usize = k_out.div_ceil(base2k);
|
||||
for rank_in in 1_usize..3 {
|
||||
for rank_out in 1_usize..3 {
|
||||
for di in 1_usize..digits + 1 {
|
||||
for di in 1_usize..dsize + 1 {
|
||||
let k_ggsw: usize = k_out + base2k * di;
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_out.div_ceil(base2k * di);
|
||||
let dnum: usize = k_out.div_ceil(base2k * di);
|
||||
|
||||
let digits_in: usize = 1;
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let gglwe_out_infos: GGLWESwitchingKeyLayout = GGLWESwitchingKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank_in: rank_in.into(),
|
||||
rank_out: rank_out.into(),
|
||||
};
|
||||
@@ -277,8 +277,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ggsw.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank_out.into(),
|
||||
};
|
||||
|
||||
|
||||
@@ -72,24 +72,24 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 60;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_apply: usize = k_in + base2k * di;
|
||||
|
||||
let k_out: usize = k_in; // Better capture noise.
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_in.div_ceil(base2k * di);
|
||||
let rows_in: usize = k_in.div_euclid(base2k * di);
|
||||
let digits_in: usize = 1;
|
||||
let dnum: usize = k_in.div_ceil(base2k * di);
|
||||
let dnum_in: usize = k_in.div_euclid(base2k * di);
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let ggsw_in_infos: GGSWCiphertextLayout = GGSWCiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_in.into(),
|
||||
rows: rows_in.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_in.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -97,8 +97,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows_in.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_in.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -106,8 +106,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_apply.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -237,22 +237,22 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_out: usize = 60;
|
||||
let digits: usize = k_out.div_ceil(base2k);
|
||||
let dsize: usize = k_out.div_ceil(base2k);
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_apply: usize = k_out + base2k * di;
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_out.div_ceil(di * base2k);
|
||||
let rows_in: usize = k_out.div_euclid(base2k * di);
|
||||
let digits_in: usize = 1;
|
||||
let dnum: usize = k_out.div_ceil(di * base2k);
|
||||
let dnum_in: usize = k_out.div_euclid(base2k * di);
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let ggsw_out_infos: GGSWCiphertextLayout = GGSWCiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows_in.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_in.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -260,8 +260,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_apply.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
|
||||
@@ -64,14 +64,14 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 45;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ggsw: usize = k_in + base2k * di;
|
||||
let k_out: usize = k_ggsw; // Better capture noise
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_in.div_ceil(base2k * digits);
|
||||
let dnum: usize = k_in.div_ceil(base2k * dsize);
|
||||
|
||||
let glwe_in_infos: GLWECiphertextLayout = GLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
@@ -91,8 +91,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ggsw.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -158,7 +158,7 @@ where
|
||||
|
||||
let max_noise: f64 = noise_ggsw_product(
|
||||
n as f64,
|
||||
base2k * digits,
|
||||
base2k * dsize,
|
||||
0.5,
|
||||
var_msg,
|
||||
var_a0_err,
|
||||
@@ -216,13 +216,13 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_out: usize = 60;
|
||||
let digits: usize = k_out.div_ceil(base2k);
|
||||
let dsize: usize = k_out.div_ceil(base2k);
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ggsw: usize = k_out + base2k * di;
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_out.div_ceil(base2k * digits);
|
||||
let dnum: usize = k_out.div_ceil(base2k * dsize);
|
||||
|
||||
let glwe_out_infos: GLWECiphertextLayout = GLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
@@ -235,8 +235,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ggsw.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -301,7 +301,7 @@ where
|
||||
|
||||
let max_noise: f64 = noise_ggsw_product(
|
||||
n as f64,
|
||||
base2k * digits,
|
||||
base2k * dsize,
|
||||
0.5,
|
||||
var_msg,
|
||||
var_a0_err,
|
||||
|
||||
@@ -66,26 +66,26 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 60;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
|
||||
for rank_in_s0s1 in 1_usize..3 {
|
||||
for rank_out_s0s1 in 1_usize..3 {
|
||||
for rank_out_s1s2 in 1_usize..3 {
|
||||
for di in 1_usize..digits + 1 {
|
||||
for di in 1_usize..dsize + 1 {
|
||||
let k_ksk: usize = k_in + base2k * di;
|
||||
let k_out: usize = k_ksk; // Better capture noise.
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_in / base2k;
|
||||
let rows_apply: usize = k_in.div_ceil(base2k * di);
|
||||
let digits_in: usize = 1;
|
||||
let dnum: usize = k_in / base2k;
|
||||
let dnum_apply: usize = k_in.div_ceil(base2k * di);
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let gglwe_s0s1_infos: GGLWESwitchingKeyLayout = GGLWESwitchingKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_in.into(),
|
||||
rows: rows.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank_in: rank_in_s0s1.into(),
|
||||
rank_out: rank_out_s0s1.into(),
|
||||
};
|
||||
@@ -94,8 +94,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows_apply.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum_apply.into(),
|
||||
dsize: di.into(),
|
||||
rank_in: rank_out_s0s1.into(),
|
||||
rank_out: rank_out_s1s2.into(),
|
||||
};
|
||||
@@ -104,8 +104,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows_apply.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum_apply.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank_in: rank_in_s0s1.into(),
|
||||
rank_out: rank_out_s1s2.into(),
|
||||
};
|
||||
@@ -236,22 +236,22 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_out: usize = 60;
|
||||
let digits: usize = k_out.div_ceil(base2k);
|
||||
let dsize: usize = k_out.div_ceil(base2k);
|
||||
for rank_in in 1_usize..3 {
|
||||
for rank_out in 1_usize..3 {
|
||||
for di in 1_usize..digits + 1 {
|
||||
for di in 1_usize..dsize + 1 {
|
||||
let k_ksk: usize = k_out + base2k * di;
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_out.div_ceil(base2k * di);
|
||||
let digits_in: usize = 1;
|
||||
let dnum: usize = k_out.div_ceil(base2k * di);
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let gglwe_s0s1_infos: GGLWESwitchingKeyLayout = GGLWESwitchingKeyLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank_in: rank_in.into(),
|
||||
rank_out: rank_out.into(),
|
||||
};
|
||||
@@ -260,8 +260,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank_in: rank_out.into(),
|
||||
rank_out: rank_out.into(),
|
||||
};
|
||||
|
||||
@@ -73,24 +73,24 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 54;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ksk: usize = k_in + base2k * di;
|
||||
let k_tsk: usize = k_ksk;
|
||||
let k_out: usize = k_ksk; // Better capture noise.
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_in.div_ceil(di * base2k);
|
||||
let dnum: usize = k_in.div_ceil(di * base2k);
|
||||
|
||||
let digits_in: usize = 1;
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let ggsw_in_infos: GGSWCiphertextLayout = GGSWCiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_in.into(),
|
||||
rows: rows.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -98,8 +98,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -107,8 +107,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_tsk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -116,8 +116,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank_in: rank.into(),
|
||||
rank_out: rank.into(),
|
||||
};
|
||||
@@ -262,23 +262,23 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_out: usize = 54;
|
||||
let digits: usize = k_out.div_ceil(base2k);
|
||||
let dsize: usize = k_out.div_ceil(base2k);
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ksk: usize = k_out + base2k * di;
|
||||
let k_tsk: usize = k_ksk;
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_out.div_ceil(di * base2k);
|
||||
let dnum: usize = k_out.div_ceil(di * base2k);
|
||||
|
||||
let digits_in: usize = 1;
|
||||
let dsize_in: usize = 1;
|
||||
|
||||
let ggsw_out_infos: GGSWCiphertextLayout = GGSWCiphertextLayout {
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_out.into(),
|
||||
rows: rows.into(),
|
||||
digits: digits_in.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: dsize_in.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -286,8 +286,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_tsk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank: rank.into(),
|
||||
};
|
||||
|
||||
@@ -295,8 +295,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank_in: rank.into(),
|
||||
rank_out: rank.into(),
|
||||
};
|
||||
|
||||
@@ -66,16 +66,16 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_in: usize = 45;
|
||||
let digits: usize = k_in.div_ceil(base2k);
|
||||
let dsize: usize = k_in.div_ceil(base2k);
|
||||
|
||||
for rank_in in 1_usize..3 {
|
||||
for rank_out in 1_usize..3 {
|
||||
for di in 1_usize..digits + 1 {
|
||||
for di in 1_usize..dsize + 1 {
|
||||
let k_ksk: usize = k_in + base2k * di;
|
||||
let k_out: usize = k_ksk; // better capture noise
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_in.div_ceil(base2k * digits);
|
||||
let dnum: usize = k_in.div_ceil(base2k * dsize);
|
||||
|
||||
let glwe_in_infos: GLWECiphertextLayout = GLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
@@ -95,8 +95,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank_in: rank_in.into(),
|
||||
rank_out: rank_out.into(),
|
||||
};
|
||||
@@ -150,7 +150,7 @@ where
|
||||
|
||||
let max_noise: f64 = log2_std_noise_gglwe_product(
|
||||
module.n() as f64,
|
||||
base2k * digits,
|
||||
base2k * dsize,
|
||||
0.5,
|
||||
0.5,
|
||||
0f64,
|
||||
@@ -208,14 +208,14 @@ where
|
||||
{
|
||||
let base2k: usize = 12;
|
||||
let k_out: usize = 45;
|
||||
let digits: usize = k_out.div_ceil(base2k);
|
||||
let dsize: usize = k_out.div_ceil(base2k);
|
||||
|
||||
for rank in 1_usize..3 {
|
||||
for di in 1..digits + 1 {
|
||||
for di in 1..dsize + 1 {
|
||||
let k_ksk: usize = k_out + base2k * di;
|
||||
|
||||
let n: usize = module.n();
|
||||
let rows: usize = k_out.div_ceil(base2k * digits);
|
||||
let dnum: usize = k_out.div_ceil(base2k * dsize);
|
||||
|
||||
let glwe_out_infos: GLWECiphertextLayout = GLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
@@ -228,8 +228,8 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
digits: di.into(),
|
||||
dnum: dnum.into(),
|
||||
dsize: di.into(),
|
||||
rank_in: rank.into(),
|
||||
rank_out: rank.into(),
|
||||
};
|
||||
@@ -282,7 +282,7 @@ where
|
||||
|
||||
let max_noise: f64 = log2_std_noise_gglwe_product(
|
||||
module.n() as f64,
|
||||
base2k * digits,
|
||||
base2k * dsize,
|
||||
0.5,
|
||||
0.5,
|
||||
0f64,
|
||||
|
||||
@@ -73,7 +73,7 @@ where
|
||||
let k_lwe_pt: usize = 8;
|
||||
|
||||
let k_ksk: usize = k_lwe_ct + base2k;
|
||||
let rows: usize = k_lwe_ct.div_ceil(base2k);
|
||||
let dnum: usize = k_lwe_ct.div_ceil(base2k);
|
||||
|
||||
let mut source_xs: Source = Source::new([0u8; 32]);
|
||||
let mut source_xa: Source = Source::new([0u8; 32]);
|
||||
@@ -83,7 +83,7 @@ where
|
||||
n: n.into(),
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rows: rows.into(),
|
||||
dnum: dnum.into(),
|
||||
};
|
||||
|
||||
let lwe_in_infos: LWECiphertextLayout = LWECiphertextLayout {
|
||||
|
||||
@@ -83,10 +83,10 @@ where
|
||||
let k_ct: usize = 36;
|
||||
let pt_k: usize = 18;
|
||||
let rank: usize = 3;
|
||||
let digits: usize = 1;
|
||||
let k_ksk: usize = k_ct + base2k * digits;
|
||||
let dsize: usize = 1;
|
||||
let k_ksk: usize = k_ct + base2k * dsize;
|
||||
|
||||
let rows: usize = k_ct.div_ceil(base2k * digits);
|
||||
let dnum: usize = k_ct.div_ceil(base2k * dsize);
|
||||
|
||||
let glwe_out_infos: GLWECiphertextLayout = GLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
@@ -100,8 +100,8 @@ where
|
||||
base2k: base2k.into(),
|
||||
k: k_ksk.into(),
|
||||
rank: rank.into(),
|
||||
digits: digits.into(),
|
||||
rows: rows.into(),
|
||||
dsize: dsize.into(),
|
||||
dnum: dnum.into(),
|
||||
};
|
||||
|
||||
let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(
|
||||
|
||||
@@ -80,8 +80,8 @@ where
|
||||
let n: usize = module.n();
|
||||
let k_autokey: usize = k + base2k;
|
||||
|
||||
let digits: usize = 1;
|
||||
let rows: usize = k.div_ceil(base2k * digits);
|
||||
let dsize: usize = 1;
|
||||
let dnum: usize = k.div_ceil(base2k * dsize);
|
||||
|
||||
let glwe_out_infos: GLWECiphertextLayout = GLWECiphertextLayout {
|
||||
n: n.into(),
|
||||
@@ -95,8 +95,8 @@ where
|
||||
base2k: base2k.into(),
|
||||
k: k_autokey.into(),
|
||||
rank: rank.into(),
|
||||
digits: digits.into(),
|
||||
rows: rows.into(),
|
||||
dsize: dsize.into(),
|
||||
dnum: dnum.into(),
|
||||
};
|
||||
|
||||
let mut glwe_out: GLWECiphertext<Vec<u8>> = GLWECiphertext::alloc(&glwe_out_infos);
|
||||
|
||||
Reference in New Issue
Block a user