HElib  1.0
Implementing Homomorphic Encryption
 All Classes Files Functions Variables Friends Pages
Classes | Public Member Functions | Static Public Member Functions | Friends | List of all members
DoubleCRT Class Reference

Implementatigs polynomials (elements in the ring R_Q) in double-CRT form. More...

#include <DoubleCRT.h>

Inheritance diagram for DoubleCRT:
CtxtPart

Public Member Functions

 DoubleCRT (const ZZX &poly, const FHEcontext &_context, const IndexSet &indexSet)
 Initializing AltCRT from a ZZX polynomial. More...
 
 DoubleCRT (const ZZX &poly, const FHEcontext &_context)
 
 DoubleCRT (const ZZX &poly)
 Context is not specified, use the "active context".
 
 DoubleCRT (const FHEcontext &_context)
 
 DoubleCRT (const FHEcontext &_context, const IndexSet &indexSet)
 Also specify the IndexSet explicitly.
 
DoubleCRToperator= (const DoubleCRT &other)
 
DoubleCRToperator= (const SingleCRT &other)
 
DoubleCRToperator= (const ZZX &poly)
 
DoubleCRToperator= (const ZZ &num)
 
DoubleCRToperator= (const long num)
 
void toPoly (ZZX &p, const IndexSet &s, bool positive=false) const
 Recovering the polynomial in coefficient representation. This yields an integer polynomial with coefficients in [-P/2,P/2], unless the positive flag is set to true, in which case we get coefficients in [0,P-1] (P is the product of all moduli used). Using the optional IndexSet param we compute the polynomial reduced modulo the product of only the ptimes in that set.
 
void toPoly (ZZX &p, bool positive=false) const
 
bool operator== (const DoubleCRT &other) const
 
bool operator!= (const DoubleCRT &other) const
 
DoubleCRTSetZero ()
 
DoubleCRTSetOne ()
 
void breakIntoDigits (vector< DoubleCRT > &dgts, long n) const
 Break into n digits,according to the primeSets in context.digits. See Section 3.1.6 of the design document (re-linearization)
 
void addPrimes (const IndexSet &s1)
 Expand the index set by s1. It is assumed that s1 is disjoint from the current index set.
 
double addPrimesAndScale (const IndexSet &s1)
 Expand index set by s1, and multiply by Prod_{q in s1}. s1 is disjoint from the current index set, returns log(product).
 
void removePrimes (const IndexSet &s1)
 Remove s1 from the index set.
 
const FHEcontextgetContext () const
 
const IndexMap< vec_long > & getMap () const
 
const IndexSetgetIndexSet () const
 
void randomize (const ZZ *seed=NULL)
 Fills each row i with random ints mod pi, uses NTL's PRG.
 
void sampleSmall ()
 Coefficients are -1/0/1, Prob[0]=1/2.
 
void sampleHWt (long Hwt)
 Coefficients are -1/0/1 with pre-specified number of nonzeros.
 
void sampleGaussian (double stdev=0.0)
 Coefficients are Gaussians.
 
void toSingleCRT (SingleCRT &scrt, const IndexSet &s) const
 Makes a corresponding SingleCRT object.
 
void toSingleCRT (SingleCRT &scrt) const
 
void scaleDownToSet (const IndexSet &s, long ptxtSpace)
 
Arithmetic operation

Only the "destructive" versions are used, i.e., a += b is implemented but not a + b.

DoubleCRTNegate (const DoubleCRT &other)
 
DoubleCRTNegate ()
 
DoubleCRToperator+= (const DoubleCRT &other)
 
DoubleCRToperator+= (const ZZX &poly)
 
DoubleCRToperator+= (const ZZ &num)
 
DoubleCRToperator+= (long num)
 
DoubleCRToperator-= (const DoubleCRT &other)
 
DoubleCRToperator-= (const ZZX &poly)
 
DoubleCRToperator-= (const ZZ &num)
 
DoubleCRToperator-= (long num)
 
DoubleCRToperator++ ()
 
DoubleCRToperator-- ()
 
void operator++ (int)
 
void operator-- (int)
 
DoubleCRToperator*= (const DoubleCRT &other)
 
DoubleCRToperator*= (const ZZX &poly)
 
DoubleCRToperator*= (const ZZ &num)
 
DoubleCRToperator*= (long num)
 
void Add (const DoubleCRT &other, bool matchIndexSets=true)
 
void Sub (const DoubleCRT &other, bool matchIndexSets=true)
 
void Mul (const DoubleCRT &other, bool matchIndexSets=true)
 
DoubleCRToperator/= (const ZZ &num)
 
DoubleCRToperator/= (long num)
 
void Exp (long k)
 Small-exponent polynomial exponentiation.
 
void automorph (long k)
 
DoubleCRToperator>>= (long k)
 

Static Public Member Functions

static bool setDryRun (bool toWhat=true)
 Used for testing/debugging The dry-run option disables most operations, to save time. This lets us quickly go over the evaluation of a circuit and estimate the resulting noise magnitude, without having to actually compute anything.
 

Friends

ostream & operator<< (ostream &s, const DoubleCRT &d)
 
istream & operator>> (istream &s, DoubleCRT &d)
 

Detailed Description

Implementatigs polynomials (elements in the ring R_Q) in double-CRT form.

Double-CRT form is a matrix of L rows and phi(m) columns. The i'th row contains the FFT of the element wrt the ith prime, i.e. the evaluations of the polynomial at the primitive mth roots of unity mod the ith prime. The polynomial thus represented is defined modulo the product of all the primes in use.

The list of primes is defined by the data member indexMap. indexMap.getIndexSet() defines the set of indices of primes associated with this DoubleCRT object: they index the primes stored in the associated FHEContext.

Arithmetic operations are computed modulo the product of the primes in use and also modulo Phi_m(X). Arithmetic operations can only be applied to DoubleCRT objects relative to the same context, trying to add/multiply objects that have different FHEContext objects will raise an error.

Constructor & Destructor Documentation

DoubleCRT::DoubleCRT ( const ZZX &  poly,
const FHEcontext _context,
const IndexSet indexSet 
)

Initializing AltCRT from a ZZX polynomial.

Parameters
polyThe ring element itself, zero if not specified
_contextThe context for this AltCRT object, use "current active context" if not specified
indexSetWhich primes to use for this object, if not specified then use all of them

The documentation for this class was generated from the following files: