PALISADE Lattice Crypto Library  1.11.9
A lattice crypto library for software engineers by software engineers.
mubintvecdyn.h
1 // @file This file contains mubintvecdyn, a <vector> of buintdyn, with
2 // associated modulus and modulo math operators.
3 // @author TPOC: contact@palisade-crypto.org
4 //
5 // @copyright Copyright (c) 2019, New Jersey Institute of Technology (NJIT)
6 // All rights reserved.
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are met:
9 // 1. Redistributions of source code must retain the above copyright notice,
10 // this list of conditions and the following disclaimer.
11 // 2. Redistributions in binary form must reproduce the above copyright notice,
12 // this list of conditions and the following disclaimer in the documentation
13 // and/or other materials provided with the distribution. THIS SOFTWARE IS
14 // PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
15 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17 // EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
18 // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 
25 #ifndef LBCRYPTO_MATH_BIGINTDYN_MUBINTVECDYN_H
26 #define LBCRYPTO_MATH_BIGINTDYN_MUBINTVECDYN_H
27 
28 #include <initializer_list>
29 #include <iostream>
30 #include <string>
31 #include <vector>
32 
33 #include "math/bigintfxd/mubintvecfxd.h"
34 #include "utils/inttypes.h"
35 #include "utils/serializable.h"
36 
41 namespace bigintdyn {
47 template <class ubint_el_t>
48 class mubintvec
49  : public lbcrypto::BigVectorInterface<mubintvec<ubint_el_t>, ubint_el_t>,
50  public lbcrypto::Serializable {
51  public:
52  // CONSTRUCTORS
53 
57  mubintvec();
58 
59  static mubintvec Single(const ubint_el_t &val, const ubint_el_t &modulus) {
60  mubintvec vec(1);
61  vec.m_data[0] = val;
62  vec.SetModulus(modulus);
63  return vec;
64  }
65 
71  explicit mubintvec(usint length);
72 
79  explicit mubintvec(const usint length, const usint &modulus);
80 
87  explicit mubintvec(const usint length, const ubint_el_t &modulus);
88 
95  explicit mubintvec(const usint length, const std::string &modulus);
96 
102  explicit mubintvec(const mubintvec &rhs);
103 
109  mubintvec(mubintvec &&rhs);
110 
119  explicit mubintvec(const usint length, const ubint_el_t &modulus,
120  std::initializer_list<std::string> rhs);
121 
130  explicit mubintvec(const usint length, const ubint_el_t &modulus,
131  std::initializer_list<uint64_t> rhs);
132 
133  // constructor specifying the mubintvec as a vector of strings and modulus
134  explicit mubintvec(const std::vector<std::string> &s,
135  const ubint_el_t &modulus);
136 
137  // constructor specifying the mubintvec as a vector of strings and modulus
138  explicit mubintvec(const std::vector<std::string> &s,
139  const std::string &modulus);
140 
144  virtual ~mubintvec();
145 
146  // ASSIGNMENT OPERATORS
147 
154  const mubintvec &operator=(const mubintvec &rhs);
155 
162  const mubintvec &operator=(mubintvec &&rhs);
163 
172  const mubintvec &operator=(std::initializer_list<std::string> rhs);
173 
182  const mubintvec &operator=(std::initializer_list<uint64_t> rhs);
183 
189  const mubintvec &operator=(uint64_t val) {
190  this->m_data[0] = val;
191  for (size_t i = 1; i < GetLength(); ++i) {
192  this->m_data[i] = 0;
193  }
194  return *this;
195  }
196 
201  const mubintvec &operator=(const ubint_el_t &val) {
202  this->m_data[0] = val;
203  for (size_t i = 1; i < this->m_data.size(); ++i) {
204  this->m_data[i] = 0;
205  }
206  return *this;
207  }
208 
209  size_t GetLength() const { return m_data.size(); }
210 
211  // ACCESSORS
212 
219  ubint_el_t &at(size_t i) {
220  if (!this->IndexCheck(i)) {
221  PALISADE_THROW(lbcrypto::math_error, "index out of range");
222  }
223  return this->m_data[i];
224  }
225 
226  const ubint_el_t &at(size_t i) const {
227  if (!this->IndexCheck(i)) {
228  PALISADE_THROW(lbcrypto::math_error, "index out of range");
229  }
230  return this->m_data[i];
231  }
232 
233  ubint_el_t &operator[](size_t i) { return this->m_data[i]; }
234 
235  const ubint_el_t &operator[](size_t i) const { return this->m_data[i]; }
236 
241  bool isModulusSet(void) const { return true; }
242 
248  void SetModulus(const usint &value);
249 
255  void SetModulus(const ubint_el_t &value);
256 
262  void SetModulus(const std::string &value);
263 
269  void SetModulus(const mubintvec &value);
270 
276  void SwitchModulus(const ubint_el_t &value);
277 
283  const ubint_el_t &GetModulus() const;
284 
285  // MODULUS ARITHMETIC OPERATIONS
286 
294  mubintvec Mod(const ubint_el_t &modulus) const;
295 
303  const mubintvec &ModEq(const ubint_el_t &modulus);
304 
311  mubintvec ModAdd(const ubint_el_t &b) const;
312 
319  const mubintvec &ModAddEq(const ubint_el_t &b);
320 
328  mubintvec ModAddAtIndex(usint i, const ubint_el_t &b) const;
329 
337  const mubintvec &ModAddAtIndexEq(usint i, const ubint_el_t &b);
338 
345  mubintvec ModAdd(const mubintvec &b) const;
346 
353  const mubintvec &ModAddEq(const mubintvec &b);
354 
361  mubintvec ModSub(const ubint_el_t &b) const;
362 
369  const mubintvec &ModSubEq(const ubint_el_t &b);
370 
377  mubintvec ModSub(const mubintvec &b) const;
378 
385  const mubintvec &ModSubEq(const mubintvec &b);
386 
393  mubintvec ModMul(const ubint_el_t &b) const;
394 
401  const mubintvec &ModMulEq(const ubint_el_t &b);
402 
410  mubintvec ModMul(const mubintvec &b) const;
411 
419  const mubintvec &ModMulEq(const mubintvec &b);
420 
427  mubintvec ModExp(const ubint_el_t &b) const;
428 
435  const mubintvec &ModExpEq(const ubint_el_t &b);
436 
442  mubintvec ModInverse() const;
443 
449  const mubintvec &ModInverseEq();
450 
457  mubintvec ModByTwo() const;
458 
465  const mubintvec &ModByTwoEq();
466 
475  mubintvec MultiplyAndRound(const ubint_el_t &p, const ubint_el_t &q) const;
476 
485  const mubintvec &MultiplyAndRoundEq(const ubint_el_t &p, const ubint_el_t &q);
486 
494  mubintvec DivideAndRound(const ubint_el_t &q) const;
495 
503  const mubintvec &DivideAndRoundEq(const ubint_el_t &q);
504 
505  // OTHER FUNCTIONS
506 
524  mubintvec GetDigitAtIndexForBase(usint index, usint base) const;
525 
526  // STRINGS & STREAMS
527 
535  friend std::ostream &operator<<(std::ostream &os, const mubintvec &ptr_obj) {
536 #if 0 // old way
537  os << std::endl;
538  for (usint i = 0; i < ptr_obj.m_data.size(); i++) {
539  os << ptr_obj.m_data[i] << std::endl;
540  }
541  os << "modulus: " << ptr_obj.m_modulus;
542  os << std::endl;
543 #else
544  auto len = ptr_obj.m_data.size();
545  os << "[";
546  for (usint i = 0; i < len; i++) {
547  os << ptr_obj.m_data[i];
548  os << ((i == (len - 1)) ? "]" : " ");
549  }
550  os << " modulus: " << ptr_obj.m_modulus;
551 #endif
552  return os;
553  }
554 
555  // SERIALIZATION
556 
557  template <class Archive>
558  void save(Archive &ar, std::uint32_t const version) const {
559  ar(::cereal::make_nvp("d", m_data));
560  ar(::cereal::make_nvp("m", m_modulus));
561  ar(::cereal::make_nvp("ms", m_modulus_state));
562  }
563 
564  template <class Archive>
565  void load(Archive &ar, std::uint32_t const version) {
566  if (version > SerializedVersion()) {
567  PALISADE_THROW(lbcrypto::deserialize_error,
568  "serialized object version " + std::to_string(version) +
569  " is from a later version of the library");
570  }
571  ar(::cereal::make_nvp("d", m_data));
572  ar(::cereal::make_nvp("m", m_modulus));
573  ar(::cereal::make_nvp("ms", m_modulus_state));
574  }
575 
576  std::string SerializedObjectName() const { return "ExpVector"; }
577 
578  static uint32_t SerializedVersion() { return 1; }
579 
580  private:
581  ubint_el_t m_modulus;
582 
583  enum State { INITIALIZED, GARBAGE };
584 
585  // enum to store the state of the
586  State m_modulus_state;
587 
588  std::vector<ubint_el_t> m_data;
589 
590  bool IndexCheck(size_t length) const {
591  if (length > m_data.size()) {
592  return false;
593  }
594  return true;
595  }
596 };
597 } // namespace bigintdyn
598 
599 #endif // LBCRYPTO_MATH_BIGINTDYN_MUBINTVECDYN_H
Base class for PALISADE serialization.
Definition: serializable.h:76
virtual ~mubintvec()
Definition: mubintvecdyn.cpp:170
const ubint_el_t & GetModulus() const
Definition: mubintvecdyn.cpp:284
void SwitchModulus(const ubint_el_t &value)
Definition: mubintvecdyn.cpp:298
mubintvec ModSub(const ubint_el_t &b) const
Definition: mubintvecdyn.cpp:422
const mubintvec & ModAddAtIndexEq(usint i, const ubint_el_t &b)
Definition: mubintvecdyn.cpp:385
const mubintvec & ModMulEq(const ubint_el_t &b)
Definition: mubintvecdyn.cpp:495
mubintvec ModExp(const ubint_el_t &b) const
Definition: mubintvecdyn.cpp:558
const mubintvec & operator=(const ubint_el_t &val)
Definition: mubintvecdyn.h:201
Definition: interface.h:588
bool isModulusSet(void) const
Definition: mubintvecdyn.h:241
Definition: exception.h:147
Definition: exception.h:113
mubintvec MultiplyAndRound(const ubint_el_t &p, const ubint_el_t &q) const
Definition: mubintvecdyn.cpp:622
mubintvec Mod(const ubint_el_t &modulus) const
Definition: mubintvecdyn.cpp:326
ubint_el_t & at(size_t i)
Definition: mubintvecdyn.h:219
const mubintvec & ModExpEq(const ubint_el_t &b)
Definition: mubintvecdyn.cpp:567
mubintvec GetDigitAtIndexForBase(usint index, usint base) const
Definition: mubintvecdyn.cpp:688
const mubintvec & ModSubEq(const ubint_el_t &b)
Definition: mubintvecdyn.cpp:429
void SetModulus(const usint &value)
Definition: mubintvecdyn.cpp:260
mubintvec DivideAndRound(const ubint_el_t &q) const
Definition: mubintvecdyn.cpp:654
const mubintvec & ModAddEq(const ubint_el_t &b)
Definition: mubintvecdyn.cpp:362
const mubintvec & ModInverseEq()
Definition: mubintvecdyn.cpp:585
mubintvec ModMul(const ubint_el_t &b) const
Definition: mubintvecdyn.cpp:463
Definition: backend.h:187
mubintvec ModAdd(const ubint_el_t &b) const
Definition: mubintvecdyn.cpp:352
const mubintvec & operator=(const mubintvec &rhs)
Definition: mubintvecdyn.cpp:179
const mubintvec & DivideAndRoundEq(const ubint_el_t &q)
Definition: mubintvecdyn.cpp:670
const mubintvec & ModEq(const ubint_el_t &modulus)
Definition: mubintvecdyn.cpp:334
mubintvec ModAddAtIndex(usint i, const ubint_el_t &b) const
Definition: mubintvecdyn.cpp:371
const mubintvec & ModByTwoEq()
Definition: mubintvecdyn.cpp:601
mubintvec()
Definition: mubintvecdyn.cpp:38
mubintvec ModByTwo() const
Definition: mubintvecdyn.cpp:594
mubintvec ModInverse() const
Definition: mubintvecdyn.cpp:576
const mubintvec & MultiplyAndRoundEq(const ubint_el_t &p, const ubint_el_t &q)
Definition: mubintvecdyn.cpp:638
friend std::ostream & operator<<(std::ostream &os, const mubintvec &ptr_obj)
Definition: mubintvecdyn.h:535
The class for representing vectors of ubint with associated modulo math.
Definition: mubintvecdyn.h:48
const mubintvec & operator=(uint64_t val)
Definition: mubintvecdyn.h:189