HElib  1.0
Implementing Homomorphic Encryption
 All Classes Files Functions Variables Friends Pages
CModulus.h
Go to the documentation of this file.
1 /* Copyright (C) 2012,2013 IBM Corp.
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10  * See the GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License along
13  * with this program; if not, write to the Free Software Foundation, Inc.,
14  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15  */
16 #ifndef _CModulus_H_
17 #define _CModulus_H_
18 
27 #include "PAlgebra.h"
28 #include "bluestein.h"
29 #include "cloned_ptr.h"
30 //NTL_CLIENT
31 
36 class CMOD_zz_p {
37 public:
38  typedef long zz;
39  typedef zz_p zp;
40  typedef zz_pX zpx;
41  typedef vec_long zzv;
42  typedef fftRep fftrep;
43  typedef zz_pContext zpContext;
44  typedef zz_pBak zpBak;
45  typedef zz_pXModulus zpxModulus;
46 
47 };
48 
53 class CMOD_ZZ_p {
54 public:
55  typedef ZZ zz;
56  typedef ZZ_p zp;
57  typedef ZZ_pX zpx;
58  typedef vec_ZZ zzv;
59  typedef FFTRep fftrep;
60  typedef ZZ_pContext zpContext ;
61  typedef ZZ_pBak zpBak;
62  typedef ZZ_pXModulus zpxModulus;
63 };
64 
65 #define INJECT_TYPE(type,subtype) typedef typename type::subtype subtype
66 
67 
88 template <class type>
89 class Cmod {
90  INJECT_TYPE(type,zz);
91  INJECT_TYPE(type,zp);
92  INJECT_TYPE(type,zpx);
93  INJECT_TYPE(type,zzv);
94  INJECT_TYPE(type,fftrep);
95  INJECT_TYPE(type,zpContext);
96  INJECT_TYPE(type,zpBak);
97  INJECT_TYPE(type,zpxModulus);
98 
99  zz q; // the modulus
100  zpContext context; // NTL's tables for this modulus
101 
102  const PAlgebra* zMStar; // points to the Zm* structure, m is FFT size
103 
104  zz m_inv; // m^{-1} mod q
105 
106  zz root; // 2m-th root of unity modulo q
107  zz rInv; // root^{-1} mod q
108 
109  zpx* powers; // tables for forward FFT
110  mutable Vec<mulmod_precon_t> powers_aux;
111  fftrep* Rb;
112  mutable fftrep_aux Rb_aux;
113  fftrep* Ra;
114 
115  zpx* ipowers; // tables for backward FFT
116  mutable Vec<mulmod_precon_t> ipowers_aux;
117  fftrep* iRb;
118  mutable fftrep_aux iRb_aux;
119 
120  zpxModulus* phimx; // PhimX modulo q, for faster division w/ remainder
121  zpx* scratch; // temporary space, to satisfy NTL's rules
122 
123  // Allocate memory and compute roots
124  void privateInit(const PAlgebra&, const zz& rt);
125 
126  void freeSpace()
127  {
128  if (powers!=NULL) { delete powers; powers=NULL; }
129  if (Rb!=NULL) { delete Rb; Rb=NULL; }
130  if (Ra!=NULL) { delete Ra; Ra=NULL; }
131  if (ipowers!=NULL) { delete ipowers; ipowers=NULL; }
132  if (iRb!=NULL) { delete iRb; iRb = NULL; }
133  if (phimx!=NULL) { delete phimx; phimx = NULL; }
134  if (scratch!=NULL) { delete scratch; scratch = NULL; }
135  }
136 
137  public:
138 
139  // Destructor and constructors
140 
141  ~Cmod() { freeSpace(); } // destructor
142 
143  // Default constructor
144  Cmod(): zMStar(NULL), powers(NULL), Rb(NULL), Ra(NULL), ipowers(NULL), iRb(NULL),
145  phimx(NULL), scratch(NULL) {}
146 
147  Cmod(const Cmod &other):
148  zMStar(NULL),powers(NULL),Rb(NULL),Ra(NULL),ipowers(NULL),iRb(NULL),phimx(NULL),scratch(NULL)
149  { *this = other; }
150 
151  // Specify m and q, and optionally also the root
152  Cmod(const PAlgebra &zms, const zz &qq, const zz &rt);
153 
154  // Copy operator
155  Cmod& operator=(const Cmod &other);
156 
157  // utility methods
158 
159  const PAlgebra &getZMStar() const { return *zMStar; }
160  unsigned getM() const { return zMStar->getM(); }
161  unsigned getPhiM() const { return zMStar->getPhiM(); }
162  const zz& getQ() const { return q; }
163  const zz& getRoot() const { return root; }
164  const zpxModulus& getPhimX() const { return *phimx; }
165  zpx& getScratch() const { return *scratch; }
166 
168  void restoreModulus() const {context.restore();}
169 
170  // FFT routines
171 
172  // sets zp context internally
173  void FFT(zzv &y, const ZZX& x) const; // y = FFT(x)
174 
175  // expects zp context to be set externally
176  void iFFT(zpx &x, const zzv& y) const; // x = FFT^{-1}(y)
177 };
178 
179 typedef Cmod<CMOD_zz_p> Cmodulus;
180 typedef Cmod<CMOD_ZZ_p> CModulus;
181 
182 #endif // ifdef _CModulus_H_