From 120bc1ea74455c94f57c2e8250a445c2ae4596f7 Mon Sep 17 00:00:00 2001 From: Arthur-hu-0806 <18710010806@163.com> Date: Sat, 7 Sep 2024 18:54:01 +0800 Subject: [PATCH] put all the generation of ciphertext together to speed up --- fhe_cmp/tests/cmp_test.rs | 562 +++++++++++++++++--------------------- 1 file changed, 247 insertions(+), 315 deletions(-) diff --git a/fhe_cmp/tests/cmp_test.rs b/fhe_cmp/tests/cmp_test.rs index 40c9b147..4aec5d68 100644 --- a/fhe_cmp/tests/cmp_test.rs +++ b/fhe_cmp/tests/cmp_test.rs @@ -1,403 +1,335 @@ use algebra::{FieldDiscreteGaussianSampler, NTTField, Polynomial}; use fhe_cmp::{ compare::{decrypt, encrypt, HomeCmpScheme}, - parameters::{DEFAULT_PARAMETERS, DELTA, HALF_DELTA}, + parameters::{DEFAULT_PARAMETERS, DELTA, FF, HALF_DELTA}, }; -use fhe_core::{RLWEBlindRotationKey, SecretKeyPack}; -use lattice::LWE; +use fhe_core::{Parameters, RLWEBlindRotationKey, SecretKeyPack}; +use lattice::{LWE, NTTRGSW, RLWE}; +use once_cell::sync::OnceCell; use rand::prelude::*; +static mut INSTANCE: OnceCell = OnceCell::new(); + +struct InitializationData { + param: Parameters, + sk: SecretKeyPack, + rotationkey: HomeCmpScheme, + value1_hcmp_1: Vec>, + value2_hcmp_1: Vec>, + value1_hcmp_2: Vec>, + value2_hcmp_2: Vec>, + value1_hcmp_3: Vec>, + value2_hcmp_3: Vec>, + value1_arbhcmp_1: Vec>, + value2_arbhcmp_1: Vec>, + value1_arbhcmp_2: Vec>, + value2_arbhcmp_2: Vec>, + value1_arbhcmp_3: Vec>, + value2_arbhcmp_3: Vec>, +} + +fn init() { + unsafe { + INSTANCE.get_or_init(|| { + let mut rng = thread_rng(); + let param = *DEFAULT_PARAMETERS; + let sk = SecretKeyPack::new(param); + let basis = param.blind_rotation_basis(); + let sampler = param.ring_noise_distribution(); + let rotationkey = HomeCmpScheme::new(RLWEBlindRotationKey::generate(&sk), param); + let x_hcmp_1 = rng.gen_range(1..1024); + let y_hcmp_1 = rng.gen_range(0..x_hcmp_1); + let x_hcmp_2 = rng.gen_range(1..1024); + let y_hcmp_2 = x_hcmp_2; + let y_hcmp_3 = rng.gen_range(1..1024); + let x_hcmp_3 = rng.gen_range(0..y_hcmp_3); + let x_arbhcmp_1 = rng.gen_range(1025..10000); + let y_arbhcmp_1 = rng.gen_range(0..x_arbhcmp_1); + let x_arbhcmp_2 = rng.gen_range(1025..10000); + let y_arbhcmp_2 = x_arbhcmp_2; + let y_arbhcmp_3 = rng.gen_range(1025..10000); + let x_arbhcmp_3 = rng.gen_range(0..y_arbhcmp_3); + let (value1_arbhcmp_1, value2_arbhcmp_1) = encrypt( + x_arbhcmp_1, + y_arbhcmp_1, + sk.ntt_ring_secret_key(), + basis, + DELTA, + sampler, + &mut rng, + ); + let (value1_arbhcmp_2, value2_arbhcmp_2) = encrypt( + x_arbhcmp_2, + y_arbhcmp_2, + sk.ntt_ring_secret_key(), + basis, + DELTA, + sampler, + &mut rng, + ); + let (value1_arbhcmp_3, value2_arbhcmp_3) = encrypt( + x_arbhcmp_3, + y_arbhcmp_3, + sk.ntt_ring_secret_key(), + basis, + DELTA, + sampler, + &mut rng, + ); + let (value1_hcmp_1, value2_hcmp_1) = encrypt( + x_hcmp_1, + y_hcmp_1, + sk.ntt_ring_secret_key(), + basis, + DELTA, + sampler, + &mut rng, + ); + let (value1_hcmp_2, value2_hcmp_2) = encrypt( + x_hcmp_2, + y_hcmp_2, + sk.ntt_ring_secret_key(), + basis, + DELTA, + sampler, + &mut rng, + ); + let (value1_hcmp_3, value2_hcmp_3) = encrypt( + x_hcmp_3, + y_hcmp_3, + sk.ntt_ring_secret_key(), + basis, + DELTA, + sampler, + &mut rng, + ); + + InitializationData { + param, + sk, + rotationkey, + value1_hcmp_1, + value2_hcmp_1, + value1_hcmp_2, + value2_hcmp_2, + value1_hcmp_3, + value2_hcmp_3, + value1_arbhcmp_1, + value1_arbhcmp_2, + value1_arbhcmp_3, + value2_arbhcmp_1, + value2_arbhcmp_2, + value2_arbhcmp_3, + } + }); + } +} #[test] fn test_gt_hcmp() { - let mut rng = thread_rng(); - let param = *DEFAULT_PARAMETERS; - let sk = SecretKeyPack::new(param); - let basis = param.blind_rotation_basis(); - let sampler = param.ring_noise_distribution(); - let rlwe_sk = sk.ring_secret_key().as_slice(); - let rotationkey = HomeCmpScheme::new(RLWEBlindRotationKey::generate(&sk), param); - let x_hcmp_1 = rng.gen_range(1..1024); - let y_hcmp_1 = rng.gen_range(0..x_hcmp_1); - let x_hcmp_2 = rng.gen_range(1..1024); - let y_hcmp_2 = x_hcmp_2; - let y_hcmp_3 = rng.gen_range(1..1024); - let x_hcmp_3 = rng.gen_range(0..y_hcmp_3); - let (value1_hcmp_1, value2_hcmp_1) = encrypt( - x_hcmp_1, - y_hcmp_1, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_hcmp_2, value2_hcmp_2) = encrypt( - x_hcmp_2, - y_hcmp_2, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_hcmp_3, value2_hcmp_3) = encrypt( - x_hcmp_3, - y_hcmp_3, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let gt_cipher_1 = rotationkey.gt_hcmp(&value1_hcmp_1[0], &value2_hcmp_1[0]); - let gt_cipher_2 = rotationkey.gt_hcmp(&value1_hcmp_2[0], &value2_hcmp_2[0]); - let gt_cipher_3 = rotationkey.gt_hcmp(&value1_hcmp_3[0], &value2_hcmp_3[0]); + init(); + let data = unsafe { INSTANCE.get().unwrap() }; + let rlwe_sk = data.sk.ring_secret_key().as_slice(); + let gt_cipher_1 = data + .rotationkey + .gt_hcmp(&data.value1_hcmp_1[0], &data.value2_hcmp_1[0]); + let gt_cipher_2 = data + .rotationkey + .gt_hcmp(&data.value1_hcmp_2[0], &data.value2_hcmp_2[0]); + let gt_cipher_3 = data + .rotationkey + .gt_hcmp(&data.value1_hcmp_3[0], &data.value2_hcmp_3[0]); let gt_value_1 = decrypt(rlwe_sk, gt_cipher_1); let gt_value_2 = decrypt(rlwe_sk, gt_cipher_2); let gt_value_3 = decrypt(rlwe_sk, gt_cipher_3); assert_eq!(gt_value_1, 1); - assert_eq!(gt_value_2, param.lwe_plain_modulus() - 1); - assert_eq!(gt_value_3, param.lwe_plain_modulus() - 1); + assert_eq!(gt_value_2, data.param.lwe_plain_modulus() - 1); + assert_eq!(gt_value_3, data.param.lwe_plain_modulus() - 1); } #[test] fn test_eq_hcmp() { - let mut rng = thread_rng(); - let param = *DEFAULT_PARAMETERS; - let sk = SecretKeyPack::new(param); - let basis = param.blind_rotation_basis(); - let sampler = param.ring_noise_distribution(); - let rlwe_sk = sk.ring_secret_key().as_slice(); - let rotationkey = HomeCmpScheme::new(RLWEBlindRotationKey::generate(&sk), param); - let x_hcmp_1 = rng.gen_range(1..1024); - let y_hcmp_1 = rng.gen_range(0..x_hcmp_1); - let x_hcmp_2 = rng.gen_range(1..1024); - let y_hcmp_2 = x_hcmp_2; - let y_hcmp_3 = rng.gen_range(1..1024); - let x_hcmp_3 = rng.gen_range(0..y_hcmp_3); - let (value1_hcmp_1, value2_hcmp_1) = encrypt( - x_hcmp_1, - y_hcmp_1, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_hcmp_2, value2_hcmp_2) = encrypt( - x_hcmp_2, - y_hcmp_2, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_hcmp_3, value2_hcmp_3) = encrypt( - x_hcmp_3, - y_hcmp_3, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let eq_cipher_1 = rotationkey.eq_hcmp(&value1_hcmp_1[0], &value2_hcmp_1[0]); - let eq_cipher_2 = rotationkey.eq_hcmp(&value1_hcmp_2[0], &value2_hcmp_2[0]); - let eq_cipher_3 = rotationkey.eq_hcmp(&value1_hcmp_3[0], &value2_hcmp_3[0]); + init(); + let data = unsafe { INSTANCE.get().unwrap() }; + let rlwe_sk = data.sk.ring_secret_key().as_slice(); + let eq_cipher_1 = data + .rotationkey + .eq_hcmp(&data.value1_hcmp_1[0], &data.value2_hcmp_1[0]); + let eq_cipher_2 = data + .rotationkey + .eq_hcmp(&data.value1_hcmp_2[0], &data.value2_hcmp_2[0]); + let eq_cipher_3 = data + .rotationkey + .eq_hcmp(&data.value1_hcmp_3[0], &data.value2_hcmp_3[0]); let eq_value_1 = decrypt(rlwe_sk, eq_cipher_1); let eq_value_2 = decrypt(rlwe_sk, eq_cipher_2); let eq_value_3 = decrypt(rlwe_sk, eq_cipher_3); - assert_eq!(eq_value_1, param.lwe_plain_modulus() - 1); + assert_eq!(eq_value_1, data.param.lwe_plain_modulus() - 1); assert_eq!(eq_value_2, 1); - assert_eq!(eq_value_3, param.lwe_plain_modulus() - 1); + assert_eq!(eq_value_3, data.param.lwe_plain_modulus() - 1); } #[test] fn test_lt_hcmp() { - let mut rng = thread_rng(); - let param = *DEFAULT_PARAMETERS; - let sk = SecretKeyPack::new(param); - let basis = param.blind_rotation_basis(); - let sampler = param.ring_noise_distribution(); - let rlwe_sk = sk.ring_secret_key().as_slice(); - let rotationkey = HomeCmpScheme::new(RLWEBlindRotationKey::generate(&sk), param); - let x_hcmp_1 = rng.gen_range(1..1024); - let y_hcmp_1 = rng.gen_range(0..x_hcmp_1); - let x_hcmp_2 = rng.gen_range(1..1024); - let y_hcmp_2 = x_hcmp_2; - let y_hcmp_3 = rng.gen_range(1..1024); - let x_hcmp_3 = rng.gen_range(0..y_hcmp_3); - let (value1_hcmp_1, value2_hcmp_1) = encrypt( - x_hcmp_1, - y_hcmp_1, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_hcmp_2, value2_hcmp_2) = encrypt( - x_hcmp_2, - y_hcmp_2, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_hcmp_3, value2_hcmp_3) = encrypt( - x_hcmp_3, - y_hcmp_3, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let lt_cipher_1 = rotationkey.lt_hcmp(&value1_hcmp_1[0], &value2_hcmp_1[0]); - let lt_cipher_2 = rotationkey.lt_hcmp(&value1_hcmp_2[0], &value2_hcmp_2[0]); - let lt_cipher_3 = rotationkey.lt_hcmp(&value1_hcmp_3[0], &value2_hcmp_3[0]); + init(); + let data = unsafe { INSTANCE.get().unwrap() }; + let rlwe_sk = data.sk.ring_secret_key().as_slice(); + let lt_cipher_1 = data + .rotationkey + .lt_hcmp(&data.value1_hcmp_1[0], &data.value2_hcmp_1[0]); + let lt_cipher_2 = data + .rotationkey + .lt_hcmp(&data.value1_hcmp_2[0], &data.value2_hcmp_2[0]); + let lt_cipher_3 = data + .rotationkey + .lt_hcmp(&data.value1_hcmp_3[0], &data.value2_hcmp_3[0]); let lt_value_1 = decrypt(rlwe_sk, lt_cipher_1); let lt_value_2 = decrypt(rlwe_sk, lt_cipher_2); let lt_value_3 = decrypt(rlwe_sk, lt_cipher_3); - assert_eq!(lt_value_1, param.lwe_plain_modulus() - 1); - assert_eq!(lt_value_2, param.lwe_plain_modulus() - 1); + assert_eq!(lt_value_1, data.param.lwe_plain_modulus() - 1); + assert_eq!(lt_value_2, data.param.lwe_plain_modulus() - 1); assert_eq!(lt_value_3, 1); } #[test] fn test_homand() { + init(); + let data = unsafe { INSTANCE.get().unwrap() }; + let rlwe_sk = data.sk.ring_secret_key().as_slice(); + let sampler = data.param.ring_noise_distribution(); let mut rng = thread_rng(); - let param = *DEFAULT_PARAMETERS; - let sk = SecretKeyPack::new(param); - let sampler = param.ring_noise_distribution(); - let rlwe_sk = sk.ring_secret_key().as_slice(); - let rotationkey = HomeCmpScheme::new(RLWEBlindRotationKey::generate(&sk), param); - let poly_length = param.ring_dimension(); - let lwe_delta = lwe_generate(rlwe_sk, param.ring_dimension(), sampler, &mut rng, DELTA); - let lwe_delta_neg = lwe_generate_neg(rlwe_sk, param.ring_dimension(), sampler, &mut rng, DELTA); - let homand_cipher1 = rotationkey.homand(&lwe_delta, &lwe_delta, poly_length, DELTA); - let homand_cipher2 = rotationkey.homand(&lwe_delta, &lwe_delta_neg, poly_length, DELTA); - let homand_cipher3 = rotationkey.homand(&lwe_delta_neg, &lwe_delta, poly_length, DELTA); - let homand_cipher4 = rotationkey.homand(&lwe_delta_neg, &lwe_delta_neg, poly_length, DELTA); + let poly_length = data.param.ring_dimension(); + let lwe_delta = lwe_generate( + rlwe_sk, + data.param.ring_dimension(), + sampler, + &mut rng, + DELTA, + ); + let lwe_delta_neg = lwe_generate_neg( + rlwe_sk, + data.param.ring_dimension(), + sampler, + &mut rng, + DELTA, + ); + let homand_cipher1 = data + .rotationkey + .homand(&lwe_delta, &lwe_delta, poly_length, DELTA); + let homand_cipher2 = data + .rotationkey + .homand(&lwe_delta, &lwe_delta_neg, poly_length, DELTA); + let homand_cipher3 = data + .rotationkey + .homand(&lwe_delta_neg, &lwe_delta, poly_length, DELTA); + let homand_cipher4 = + data.rotationkey + .homand(&lwe_delta_neg, &lwe_delta_neg, poly_length, DELTA); let output1 = decrypt(rlwe_sk, homand_cipher1); let output2 = decrypt(rlwe_sk, homand_cipher2); let output3 = decrypt(rlwe_sk, homand_cipher3); let output4 = decrypt(rlwe_sk, homand_cipher4); assert_eq!(output1, 1); - assert_eq!(output2, param.lwe_plain_modulus() - 1); - assert_eq!(output3, param.lwe_plain_modulus() - 1); - assert_eq!(output4, param.lwe_plain_modulus() - 1); + assert_eq!(output2, data.param.lwe_plain_modulus() - 1); + assert_eq!(output3, data.param.lwe_plain_modulus() - 1); + assert_eq!(output4, data.param.lwe_plain_modulus() - 1); } #[test] fn test_gt_arbhcmp() { - let mut rng = thread_rng(); - let param = *DEFAULT_PARAMETERS; - let sk = SecretKeyPack::new(param); - let basis = param.blind_rotation_basis(); - let sampler = param.ring_noise_distribution(); - let rlwe_sk = sk.ring_secret_key().as_slice(); - let rotationkey = HomeCmpScheme::new(RLWEBlindRotationKey::generate(&sk), param); - let x_arbhcmp_1 = rng.gen(); - let y_arbhcmp_1 = rng.gen_range(0..x_arbhcmp_1); - let x_arbhcmp_2 = rng.gen(); - let y_arbhcmp_2 = x_arbhcmp_2; - let y_arbhcmp_3 = rng.gen(); - let x_arbhcmp_3 = rng.gen_range(0..y_arbhcmp_3); - let (value1_arbhcmp_1, value2_arbhcmp_1) = encrypt( - x_arbhcmp_1, - y_arbhcmp_1, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_arbhcmp_2, value2_arbhcmp_2) = encrypt( - x_arbhcmp_2, - y_arbhcmp_2, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_arbhcmp_3, value2_arbhcmp_3) = encrypt( - x_arbhcmp_3, - y_arbhcmp_3, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let gt_cipher_1 = rotationkey.gt_arbhcmp( - &value1_arbhcmp_1, - &value2_arbhcmp_1, + init(); + let data = unsafe { INSTANCE.get().unwrap() }; + let rlwe_sk = data.sk.ring_secret_key().as_slice(); + let gt_cipher_1 = data.rotationkey.gt_arbhcmp( + &data.value1_arbhcmp_1, + &data.value2_arbhcmp_1, DELTA, HALF_DELTA, - param.ring_dimension(), + data.param.ring_dimension(), ); - let gt_cipher_2 = rotationkey.gt_arbhcmp( - &value1_arbhcmp_2, - &value2_arbhcmp_2, + let gt_cipher_2 = data.rotationkey.gt_arbhcmp( + &data.value1_arbhcmp_2, + &data.value2_arbhcmp_2, DELTA, HALF_DELTA, - param.ring_dimension(), + data.param.ring_dimension(), ); - let gt_cipher_3 = rotationkey.gt_arbhcmp( - &value1_arbhcmp_3, - &value2_arbhcmp_3, + let gt_cipher_3 = data.rotationkey.gt_arbhcmp( + &data.value1_arbhcmp_3, + &data.value2_arbhcmp_3, DELTA, HALF_DELTA, - param.ring_dimension(), + data.param.ring_dimension(), ); let gt_value_1 = decrypt(rlwe_sk, gt_cipher_1); let gt_value_2 = decrypt(rlwe_sk, gt_cipher_2); let gt_value_3 = decrypt(rlwe_sk, gt_cipher_3); assert_eq!(gt_value_1, 1); - assert_eq!(gt_value_2, param.lwe_plain_modulus() - 1); - assert_eq!(gt_value_3, param.lwe_plain_modulus() - 1); + assert_eq!(gt_value_2, data.param.lwe_plain_modulus() - 1); + assert_eq!(gt_value_3, data.param.lwe_plain_modulus() - 1); } #[test] fn test_eq_arbhcmp() { - let mut rng = thread_rng(); - let param = *DEFAULT_PARAMETERS; - let sk = SecretKeyPack::new(param); - let basis = param.blind_rotation_basis(); - let sampler = param.ring_noise_distribution(); - let rlwe_sk = sk.ring_secret_key().as_slice(); - let rotationkey = HomeCmpScheme::new(RLWEBlindRotationKey::generate(&sk), param); - let x_arbhcmp_1 = rng.gen(); - let y_arbhcmp_1 = rng.gen_range(0..x_arbhcmp_1); - let x_arbhcmp_2 = rng.gen(); - let y_arbhcmp_2 = x_arbhcmp_2; - let y_arbhcmp_3 = rng.gen(); - let x_arbhcmp_3 = rng.gen_range(0..y_arbhcmp_3); - let (value1_arbhcmp_1, value2_arbhcmp_1) = encrypt( - x_arbhcmp_1, - y_arbhcmp_1, - sk.ntt_ring_secret_key(), - basis, + init(); + let data = unsafe { INSTANCE.get().unwrap() }; + let rlwe_sk = data.sk.ring_secret_key().as_slice(); + let eq_cipher_1 = data.rotationkey.eq_arbhcmp( + &data.value1_arbhcmp_1, + &data.value2_arbhcmp_1, + data.param.ring_dimension(), DELTA, - sampler, - &mut rng, ); - let (value1_arbhcmp_2, value2_arbhcmp_2) = encrypt( - x_arbhcmp_2, - y_arbhcmp_2, - sk.ntt_ring_secret_key(), - basis, + let eq_cipher_2 = data.rotationkey.eq_arbhcmp( + &data.value1_arbhcmp_2, + &data.value2_arbhcmp_2, + data.param.ring_dimension(), DELTA, - sampler, - &mut rng, - ); - let (value1_arbhcmp_3, value2_arbhcmp_3) = encrypt( - x_arbhcmp_3, - y_arbhcmp_3, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, ); - let eq_cipher_1 = rotationkey.eq_arbhcmp( - &value1_arbhcmp_1, - &value2_arbhcmp_1, - param.ring_dimension(), - DELTA, - ); - let eq_cipher_2 = rotationkey.eq_arbhcmp( - &value1_arbhcmp_2, - &value2_arbhcmp_2, - param.ring_dimension(), - DELTA, - ); - let eq_cipher_3 = rotationkey.eq_arbhcmp( - &value1_arbhcmp_3, - &value2_arbhcmp_3, - param.ring_dimension(), + let eq_cipher_3 = data.rotationkey.eq_arbhcmp( + &data.value1_arbhcmp_3, + &data.value2_arbhcmp_3, + data.param.ring_dimension(), DELTA, ); let eq_value_1 = decrypt(rlwe_sk, eq_cipher_1); let eq_value_2 = decrypt(rlwe_sk, eq_cipher_2); let eq_value_3 = decrypt(rlwe_sk, eq_cipher_3); - assert_eq!(eq_value_1, param.lwe_plain_modulus() - 1); + assert_eq!(eq_value_1, data.param.lwe_plain_modulus() - 1); assert_eq!(eq_value_2, 1); - assert_eq!(eq_value_3, param.lwe_plain_modulus() - 1); + assert_eq!(eq_value_3, data.param.lwe_plain_modulus() - 1); } #[test] fn test_lt_arbhcmp() { - let mut rng = thread_rng(); - let param = *DEFAULT_PARAMETERS; - let sk = SecretKeyPack::new(param); - let basis = param.blind_rotation_basis(); - let sampler = param.ring_noise_distribution(); - let rlwe_sk = sk.ring_secret_key().as_slice(); - let rotationkey = HomeCmpScheme::new(RLWEBlindRotationKey::generate(&sk), param); - let x_arbhcmp_1 = rng.gen(); - let y_arbhcmp_1 = rng.gen_range(0..x_arbhcmp_1); - let x_arbhcmp_2 = rng.gen(); - let y_arbhcmp_2 = x_arbhcmp_2; - let y_arbhcmp_3 = rng.gen(); - let x_arbhcmp_3 = rng.gen_range(0..y_arbhcmp_3); - let (value1_arbhcmp_1, value2_arbhcmp_1) = encrypt( - x_arbhcmp_1, - y_arbhcmp_1, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_arbhcmp_2, value2_arbhcmp_2) = encrypt( - x_arbhcmp_2, - y_arbhcmp_2, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let (value1_arbhcmp_3, value2_arbhcmp_3) = encrypt( - x_arbhcmp_3, - y_arbhcmp_3, - sk.ntt_ring_secret_key(), - basis, - DELTA, - sampler, - &mut rng, - ); - let lt_cipher_1 = rotationkey.lt_arbhcmp( - &value1_arbhcmp_1, - &value2_arbhcmp_1, + init(); + let data = unsafe { INSTANCE.get().unwrap() }; + let rlwe_sk = data.sk.ring_secret_key().as_slice(); + let lt_cipher_1 = data.rotationkey.lt_arbhcmp( + &data.value1_arbhcmp_1, + &data.value2_arbhcmp_1, DELTA, HALF_DELTA, - param.ring_dimension(), + data.param.ring_dimension(), ); - let lt_cipher_2 = rotationkey.lt_arbhcmp( - &value1_arbhcmp_2, - &value2_arbhcmp_2, + let lt_cipher_2 = data.rotationkey.lt_arbhcmp( + &data.value1_arbhcmp_2, + &data.value2_arbhcmp_2, DELTA, HALF_DELTA, - param.ring_dimension(), + data.param.ring_dimension(), ); - let lt_cipher_3 = rotationkey.lt_arbhcmp( - &value1_arbhcmp_3, - &value2_arbhcmp_3, + let lt_cipher_3 = data.rotationkey.lt_arbhcmp( + &data.value1_arbhcmp_3, + &data.value2_arbhcmp_3, DELTA, HALF_DELTA, - param.ring_dimension(), + data.param.ring_dimension(), ); let lt_value_1 = decrypt(rlwe_sk, lt_cipher_1); let lt_value_2 = decrypt(rlwe_sk, lt_cipher_2); let lt_value_3 = decrypt(rlwe_sk, lt_cipher_3); - assert_eq!(lt_value_1, param.lwe_plain_modulus() - 1); - assert_eq!(lt_value_2, param.lwe_plain_modulus() - 1); + assert_eq!(lt_value_1, data.param.lwe_plain_modulus() - 1); + assert_eq!(lt_value_2, data.param.lwe_plain_modulus() - 1); assert_eq!(lt_value_3, 1); }