use rand::RngCore; use crate::{ api::{ ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxBigAdd, VecZnxBigAddInplace, VecZnxBigAddSmall, VecZnxBigAddSmallInplace, VecZnxBigAlloc, VecZnxBigAutomorphism, VecZnxBigAutomorphismInplace, VecZnxBigAutomorphismInplaceTmpBytes, VecZnxBigFromSmall, VecZnxBigNegate, VecZnxBigNegateInplace, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxBigSub, VecZnxBigSubInplace, VecZnxBigSubNegateInplace, VecZnxBigSubSmallA, VecZnxBigSubSmallB, VecZnxBigSubSmallInplace, VecZnxBigSubSmallNegateInplace, }, layouts::{Backend, DataViewMut, DigestU64, FillUniform, Module, ScratchOwned, VecZnx, VecZnxBig}, source::Source, }; pub fn test_vec_znx_big_add(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigAdd
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigAdd + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let a_digest = a.digest_u64(); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for b_size in [1, 2, 3, 4] { let mut b: VecZnx> = VecZnx::alloc(n, cols, b_size); b.fill_uniform(base2k, &mut source); let b_digest = b.digest_u64(); let mut b_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, b_size); let mut b_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, b_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut b_ref, j, &b, j); module_test.vec_znx_big_from_small(&mut b_test, j, &b, j); } assert_eq!(b.digest_u64(), b_digest); let b_ref_digest: u64 = b_ref.digest_u64(); let b_test_digest: u64 = b_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); // Set res to garbage source.fill_bytes(res_big_ref.data_mut()); source.fill_bytes(res_big_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_big_add(&mut res_big_ref, i, &a_ref, i, &b_ref, i); module_test.vec_znx_big_add(&mut res_big_test, i, &a_test, i, &b_test, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); assert_eq!(b_ref.digest_u64(), b_ref_digest); assert_eq!(b_test.digest_u64(), b_test_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_big_add_inplace(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigAddInplace
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigAddInplace + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, res_size); res.fill_uniform(base2k, &mut source); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut res_big_ref, j, &res, j); module_test.vec_znx_big_from_small(&mut res_big_test, j, &res, j); } for i in 0..cols { module_ref.vec_znx_big_add_inplace(&mut res_big_ref, i, &a_ref, i); module_test.vec_znx_big_add_inplace(&mut res_big_test, i, &a_test, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_big_add_small(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigAddSmall
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigAddSmall + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for b_size in [1, 2, 3, 4] { let mut b: VecZnx> = VecZnx::alloc(n, cols, b_size); b.fill_uniform(base2k, &mut source); let b_digest: u64 = b.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); // Set res to garbage source.fill_bytes(res_big_ref.data_mut()); source.fill_bytes(res_big_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_big_add_small(&mut res_big_ref, i, &a_ref, i, &b, i); module_test.vec_znx_big_add_small(&mut res_big_test, i, &a_test, i, &b, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); assert_eq!(b.digest_u64(), b_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_big_add_small_inplace( base2k: usize, module_ref: &Module
, module_test: &Module, ) where Module
: VecZnxBigAddSmallInplace
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigAddSmallInplace + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let a_digest: u64 = a.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, res_size); res.fill_uniform(base2k, &mut source); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut res_big_ref, j, &res, j); module_test.vec_znx_big_from_small(&mut res_big_test, j, &res, j); } for i in 0..cols { module_ref.vec_znx_big_add_small_inplace(&mut res_big_ref, i, &a, i); module_test.vec_znx_big_add_small_inplace(&mut res_big_test, i, &a, i); } assert_eq!(a.digest_u64(), a_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_big_automorphism(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigAutomorphism
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigAutomorphism + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for res_size in [1, 2, 3, 4] { for p in [-5, 5] { let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); // Set res to garbage source.fill_bytes(res_big_ref.data_mut()); source.fill_bytes(res_big_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_big_automorphism(p, &mut res_big_ref, i, &a_ref, i); module_test.vec_znx_big_automorphism(p, &mut res_big_test, i, &a_test, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_big_automorphism_inplace( base2k: usize, module_ref: &Module
, module_test: &Module, ) where Module
: VecZnxBigAutomorphismInplace
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigAutomorphismInplaceTmpBytes + VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigAutomorphismInplace + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigAutomorphismInplaceTmpBytes + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc( module_ref.vec_znx_big_automorphism_inplace_tmp_bytes() | module_ref.vec_znx_big_normalize_tmp_bytes(), ); let mut scratch_test: ScratchOwned = ScratchOwned::alloc( module_test.vec_znx_big_automorphism_inplace_tmp_bytes() | module_test.vec_znx_big_normalize_tmp_bytes(), ); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, res_size); res.fill_uniform(base2k, &mut source); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for p in [-5, 5] { for j in 0..cols { module_ref.vec_znx_big_from_small(&mut res_big_ref, j, &res, j); module_test.vec_znx_big_from_small(&mut res_big_test, j, &res, j); } for i in 0..cols { module_ref.vec_znx_big_automorphism_inplace(p, &mut res_big_ref, i, scratch_ref.borrow()); module_test.vec_znx_big_automorphism_inplace(p, &mut res_big_test, i, scratch_test.borrow()); } let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_big_negate(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigNegate
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigNegate + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); // Set res to garbage source.fill_bytes(res_big_ref.data_mut()); source.fill_bytes(res_big_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_big_negate(&mut res_big_ref, i, &a_ref, i); module_test.vec_znx_big_negate(&mut res_big_test, i, &a_test, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_big_negate_inplace(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigNegateInplace
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigAutomorphismInplaceTmpBytes + VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigNegateInplace + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigAutomorphismInplaceTmpBytes + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, res_size); res.fill_uniform(base2k, &mut source); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut res_big_ref, j, &res, j); module_test.vec_znx_big_from_small(&mut res_big_test, j, &res, j); } for i in 0..cols { module_ref.vec_znx_big_negate_inplace(&mut res_big_ref, i); module_test.vec_znx_big_negate_inplace(&mut res_big_test, i); } let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } pub fn test_vec_znx_big_normalize(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigAutomorphismInplaceTmpBytes + VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigAutomorphismInplaceTmpBytes + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc( module_ref.vec_znx_big_automorphism_inplace_tmp_bytes() | module_ref.vec_znx_big_normalize_tmp_bytes(), ); let mut scratch_test: ScratchOwned = ScratchOwned::alloc( module_test.vec_znx_big_automorphism_inplace_tmp_bytes() | module_test.vec_znx_big_normalize_tmp_bytes(), ); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(63, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_test: VecZnx> = VecZnx::alloc(n, cols, res_size); // Set d to garbage source.fill_bytes(res_ref.data_mut()); source.fill_bytes(res_test.data_mut()); // Reference for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_ref, j, base2k, &a_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_test, j, base2k, &a_test, j, scratch_test.borrow(), ); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); assert_eq!(res_ref, res_test); } } } pub fn test_vec_znx_big_sub(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigSub
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigSub + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for b_size in [1, 2, 3, 4] { let mut b: VecZnx> = VecZnx::alloc(n, cols, b_size); b.fill_uniform(base2k, &mut source); let mut b_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, b_size); let mut b_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, b_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut b_ref, j, &b, j); module_test.vec_znx_big_from_small(&mut b_test, j, &b, j); } let b_ref_digest: u64 = b_ref.digest_u64(); let b_test_digest: u64 = b_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); // Set res to garbage source.fill_bytes(res_big_ref.data_mut()); source.fill_bytes(res_big_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_big_sub(&mut res_big_ref, i, &a_ref, i, &b_ref, i); module_test.vec_znx_big_sub(&mut res_big_test, i, &a_test, i, &b_test, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); assert_eq!(b_ref.digest_u64(), b_ref_digest); assert_eq!(b_test.digest_u64(), b_test_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_big_sub_inplace(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigSubInplace
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigSubInplace + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, res_size); res.fill_uniform(base2k, &mut source); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut res_big_ref, j, &res, j); module_test.vec_znx_big_from_small(&mut res_big_test, j, &res, j); } for i in 0..cols { module_ref.vec_znx_big_sub_inplace(&mut res_big_ref, i, &a_ref, i); module_test.vec_znx_big_sub_inplace(&mut res_big_test, i, &a_test, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_big_sub_negate_inplace( base2k: usize, module_ref: &Module
, module_test: &Module, ) where Module
: VecZnxBigSubNegateInplace
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigSubNegateInplace + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, res_size); res.fill_uniform(base2k, &mut source); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut res_big_ref, j, &res, j); module_test.vec_znx_big_from_small(&mut res_big_test, j, &res, j); } for i in 0..cols { module_ref.vec_znx_big_sub_negate_inplace(&mut res_big_ref, i, &a_ref, i); module_test.vec_znx_big_sub_negate_inplace(&mut res_big_test, i, &a_test, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_big_sub_small_a(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigSubSmallA
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigSubSmallA + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for b_size in [1, 2, 3, 4] { let mut b: VecZnx> = VecZnx::alloc(n, cols, b_size); b.fill_uniform(base2k, &mut source); let b_digest: u64 = b.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); // Set res to garbage source.fill_bytes(res_big_ref.data_mut()); source.fill_bytes(res_big_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_big_sub_small_a(&mut res_big_ref, i, &b, i, &a_ref, i); module_test.vec_znx_big_sub_small_a(&mut res_big_test, i, &b, i, &a_test, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); assert_eq!(b.digest_u64(), b_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_big_sub_small_b(base2k: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxBigSubSmallB
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigSubSmallB + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let mut a_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, a_size); let mut a_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut a_ref, j, &a, j); module_test.vec_znx_big_from_small(&mut a_test, j, &a, j); } let a_ref_digest: u64 = a_ref.digest_u64(); let a_test_digest: u64 = a_test.digest_u64(); for b_size in [1, 2, 3, 4] { let mut b: VecZnx> = VecZnx::alloc(n, cols, b_size); b.fill_uniform(base2k, &mut source); let b_digest: u64 = b.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); // Set res to garbage source.fill_bytes(res_big_ref.data_mut()); source.fill_bytes(res_big_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_big_sub_small_b(&mut res_big_ref, i, &a_ref, i, &b, i); module_test.vec_znx_big_sub_small_b(&mut res_big_test, i, &a_test, i, &b, i); } assert_eq!(a_ref.digest_u64(), a_ref_digest); assert_eq!(a_test.digest_u64(), a_test_digest); assert_eq!(b.digest_u64(), b_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_big_sub_small_a_inplace( base2k: usize, module_ref: &Module
, module_test: &Module, ) where Module
: VecZnxBigSubSmallInplace
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigSubSmallInplace + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let a_digest: u64 = a.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, res_size); res.fill_uniform(base2k, &mut source); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut res_big_ref, j, &res, j); module_test.vec_znx_big_from_small(&mut res_big_test, j, &res, j); } for i in 0..cols { module_ref.vec_znx_big_sub_small_inplace(&mut res_big_ref, i, &a, i); module_test.vec_znx_big_sub_small_inplace(&mut res_big_test, i, &a, i); } assert_eq!(a.digest_u64(), a_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_big_sub_small_b_inplace( base2k: usize, module_ref: &Module
, module_test: &Module, ) where Module
: VecZnxBigSubSmallNegateInplace
+ VecZnxBigAlloc
+ VecZnxBigFromSmall
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxBigSubSmallNegateInplace + VecZnxBigAlloc + VecZnxBigFromSmall + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(base2k, &mut source); let a_digest: u64 = a.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, res_size); res.fill_uniform(base2k, &mut source); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_big_from_small(&mut res_big_ref, j, &res, j); module_test.vec_znx_big_from_small(&mut res_big_test, j, &res, j); } for i in 0..cols { module_ref.vec_znx_big_sub_small_negate_inplace(&mut res_big_ref, i, &a, i); module_test.vec_znx_big_sub_small_negate_inplace(&mut res_big_test, i, &a, i); } assert_eq!(a.digest_u64(), a_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( base2k, &mut res_small_ref, j, base2k, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( base2k, &mut res_small_test, j, base2k, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } }