#![feature(never_type)]
#![feature(fn_traits)]
#![feature(unboxed_closures)]
#![feature(test)]
#![feature(const_type_name)]
#![feature(allocator_api)]
#![feature(ptr_alignment_type)]
#![feature(associated_type_defaults)]
#![feature(generic_arg_infer)]
#![feature(min_specialization)]
#![feature(array_chunks)]
#![feature(mapped_lock_guards)]
#![allow(non_snake_case)]
#![allow(type_alias_bounds)]
#![allow(non_camel_case_types)]
#![allow(non_upper_case_globals)]
#![doc = include_str!("../Readme.md")]
use std::alloc::Global;
use std::time::Instant;
use feanor_math::integer::BigIntRing;
use feanor_math::primitive_int::*;
use feanor_math::ring::*;
use feanor_math::rings::zn::zn_64::Zn;
extern crate feanor_math;
#[cfg(feature = "use_hexl")]
extern crate feanor_math_hexl;
extern crate test;
extern crate thread_local;
extern crate serde;
extern crate rand;
extern crate rand_distr;
#[cfg(test)]
fn ring_literal<R>(ring: R, data: &[i32]) -> El<R>
where R: RingStore,
R::Type: feanor_math::rings::extension::FreeAlgebra
{
use feanor_math::homomorphism::*;
use feanor_math::rings::extension::*;
ring.from_canonical_basis(data.iter().map(|x| ring.base_ring().int_hom().map(*x)))
}
#[cfg(feature = "use_hexl")]
pub type DefaultConvolution = feanor_math_hexl::conv::HEXLConvolution;
#[cfg(not(feature = "use_hexl"))]
pub type DefaultConvolution = crate::ntt::ntt_convolution::NTTConv<Zn>;
#[cfg(feature = "use_hexl")]
pub type DefaultNegacyclicNTT = feanor_math_hexl::hexl::HEXLNegacyclicNTT;
#[cfg(not(feature = "use_hexl"))]
pub type DefaultNegacyclicNTT = crate::number_ring::pow2_cyclotomic::RustNegacyclicNTT<Zn>;
pub type DefaultCiphertextAllocator = Global;
#[allow(unused)]
fn euler_phi(factorization: &[(i64, usize)]) -> i64 {
StaticRing::<i64>::RING.prod(factorization.iter().map(|(p, e)| (p - 1) * StaticRing::<i64>::RING.pow(*p, e - 1)))
}
fn euler_phi_squarefree(factorization: &[i64]) -> i64 {
StaticRing::<i64>::RING.prod(factorization.iter().map(|p| p - 1))
}
pub fn log_time<F, T, const LOG: bool, const COUNTER_VAR_COUNT: usize>(description: &str, step_fn: F) -> T
where F: FnOnce(&mut [usize; COUNTER_VAR_COUNT]) -> T
{
if LOG {
println!("{}", description);
}
let mut counters = [0; COUNTER_VAR_COUNT];
let start = Instant::now();
let result = step_fn(&mut counters);
let end = Instant::now();
if LOG {
println!("done in {} ms, {:?}", (end - start).as_millis(), counters);
}
return result;
}
const ZZbig: BigIntRing = BigIntRing::RING;
const ZZi64: StaticRing<i64> = StaticRing::<i64>::RING;
const ZZi128: StaticRing<i128> = StaticRing::<i128>::RING;
mod serialization_helper;
pub mod ntt;
pub mod cyclotomic;
pub mod rnsconv;
pub mod number_ring;
pub mod ciphertext_ring;
pub mod gadget_product;
pub mod bfv;
pub mod circuit;
pub mod lintransform;
pub mod digitextract;
pub mod bgv;
#[cfg(any(doc, doctest))]
pub mod examples {
#[doc = include_str!("../examples/bfv_basics/Readme.md")]
pub mod bfv_basics {}
#[doc = include_str!("../examples/bgv_basics/Readme.md")]
pub mod bgv_basics {}
#[doc = include_str!("../examples/bfv_impl_v1/Readme.md")]
pub mod bfv_impl_v1 {}
#[doc = include_str!("../examples/bfv_impl_v2/Readme.md")]
pub mod bfv_impl_v2 {}
}