32 #ifndef LBCRYPTO_MATH_BIGINTNTL_MUBINTVECNTL_H 33 #define LBCRYPTO_MATH_BIGINTNTL_MUBINTVECNTL_H 35 #include "config_core.h" 38 #include <NTL/SmartPtr.h> 39 #include <NTL/vec_ZZ.h> 40 #include <NTL/vector.h> 42 #include <initializer_list> 47 #include "math/bigintntl/ubintntl.h" 49 #include "utils/inttypes.h" 50 #include "utils/serializable.h" 72 template <
typename myT>
79 myVecP() : Vec<myT>() { m_modulus_state = GARBAGE; }
81 static inline myVecP Single(
const myT &val,
const myT &modulus) {
83 vec.SetModulus(modulus);
88 explicit myVecP(
const size_t length) : Vec<myT>(INIT_SIZE, length) {
89 m_modulus_state = GARBAGE;
92 myVecP(INIT_SIZE_TYPE,
const long length) : Vec<myT>(INIT_SIZE, length) {
93 m_modulus_state = GARBAGE;
100 myVecP(
const long n,
const myT &q);
102 myVecP(
const long n,
const myT &q, std::initializer_list<std::string> rhs);
103 myVecP(
const long n,
const myT &q, std::initializer_list<uint64_t> rhs);
107 myVecP(
size_t n,
const std::string &sq);
111 myVecP(
size_t n, uint64_t q);
115 explicit myVecP(std::vector<std::string> &s);
116 myVecP(std::vector<std::string> &s,
const myT &q);
117 myVecP(std::vector<std::string> &s,
const char *sq);
118 myVecP(std::vector<std::string> &s,
const uint64_t q);
129 const myVecP &operator=(std::initializer_list<uint64_t> rhs);
130 const myVecP &operator=(std::initializer_list<int32_t> rhs);
131 const myVecP &operator=(std::initializer_list<std::string> rhs);
132 const myVecP &operator=(uint64_t rhs);
137 myT &at(
size_t i) {
return this->NTL::Vec<myT>::at(i); }
139 const myT &at(
size_t i)
const {
return this->NTL::Vec<myT>::at(i); }
141 myT &operator[](
size_t idx) {
return this->at(idx); }
143 const myT &operator[](
size_t idx)
const {
return this->at(idx); }
145 inline void push_back(
const myT &a) { this->append(a); }
147 void SwitchModulus(
const myT &newModulus);
150 inline bool isModulusSet(
void)
const {
151 return (this->m_modulus_state == INITIALIZED);
155 inline bool SameModulus(
const myVecP &a)
const {
156 return ((this->m_modulus_state == a.m_modulus_state) &&
157 (this->m_modulus == a.m_modulus));
161 inline void SetModulus(
const uint64_t &value) {
164 "SetModulus(uint64_t) cannot be zero");
166 this->m_modulus = myT(value);
167 this->m_modulus_state = INITIALIZED;
171 void SetModulus(
const myT &value) {
172 if (value == myT(0)) {
175 this->m_modulus = value;
176 this->m_modulus_state = INITIALIZED;
180 inline void SetModulus(
const std::string &value) {
181 this->m_modulus = myT(value);
182 if (this->m_modulus == myT(0)) {
185 this->m_modulus_state = INITIALIZED;
189 inline void SetModulus(
const myVecP &value) {
190 this->m_modulus = value.GetModulus();
191 if (this->m_modulus == myT(0)) {
194 this->m_modulus_state = INITIALIZED;
197 const myT &GetModulus()
const {
198 if (this->isModulusSet()) {
199 return (this->m_modulus);
205 inline int CopyModulus(
const myVecP &rhs) {
206 this->m_modulus = rhs.m_modulus;
207 this->m_modulus_state = rhs.m_modulus_state;
208 if (isModulusSet()) {
211 this->m_modulus_state = GARBAGE;
216 size_t GetLength(
void)
const {
return this->length(); }
218 void resize(
size_t n) {
248 ModulusCheck(
"Warning: myVecP::ModAdd");
261 ModulusCheck(
"Warning: myVecP::ModAdd");
262 for (usint i = 0; i < this->GetLength(); i++) {
263 this->operator[](i).ModAddEq(b, this->m_modulus);
293 ArgCheckVector(b,
"myVecP ModAdd()");
306 ArgCheckVector(b,
"myVecP ModAddEq()");
307 for (usint i = 0; i < this->GetLength(); i++) {
308 this->operator[](i).ModAddEq(b[i], this->m_modulus);
324 ModulusCheck(
"Warning: myVecP::ModSub");
337 ModulusCheck(
"Warning: myVecP::ModSubEq");
338 for (usint i = 0; i < this->GetLength(); i++) {
339 this->operator[](i).ModSubEq(b, this->m_modulus);
351 ArgCheckVector(b,
"myVecP ModSub()");
364 ArgCheckVector(b,
"myVecP ModSubEq()");
365 for (usint i = 0; i < this->GetLength(); i++) {
366 this->operator[](i).ModSubEq(b[i], this->m_modulus);
382 ModulusCheck(
"Warning: myVecP::ModMul");
395 ModulusCheck(
"Warning: myVecP::ModMul");
396 for (usint i = 0; i < this->GetLength(); i++) {
397 this->operator[](i).ModMulEq(b, this->m_modulus);
410 ArgCheckVector(b,
"myVecP Mul()");
424 ArgCheckVector(b,
"myVecP Mul()");
425 for (usint i = 0; i < this->GetLength(); i++) {
426 this->operator[](i).ModMulEq(b[i], this->m_modulus);
551 auto len = ptr_obj.GetLength();
553 for (
size_t i = 0; i < len; i++) {
555 os << ((i == (len - 1)) ?
"]" :
" ");
557 os <<
" modulus: " << ptr_obj.m_modulus;
563 template <
class Archive>
564 typename std::enable_if<!cereal::traits::is_text_archive<Archive>::value,
566 save(Archive &ar, std::uint32_t
const version)
const {
573 ar(::cereal::make_nvp(
"m", m_modulus.ToString()));
574 ar(::cereal::make_nvp(
"ms", m_modulus_state));
575 ar(::cereal::make_nvp(
"l", this->GetLength()));
576 for (
size_t i = 0; i < this->GetLength(); i++) {
577 ar(::cereal::make_nvp(
"v", (*
this)[i].ToString()));
581 template <
class Archive>
582 typename std::enable_if<cereal::traits::is_text_archive<Archive>::value,
584 save(Archive &ar, std::uint32_t
const version)
const {
585 ar(::cereal::make_nvp(
"m", m_modulus.ToString()));
586 ar(::cereal::make_nvp(
"ms", m_modulus_state));
587 ar(::cereal::make_nvp(
"l", this->GetLength()));
588 for (
size_t i = 0; i < this->GetLength(); i++) {
589 ar(::cereal::make_nvp(
"v", (*
this)[i].ToString()));
593 template <
class Archive>
594 typename std::enable_if<!cereal::traits::is_text_archive<Archive>::value,
596 load(Archive &ar, std::uint32_t
const version) {
597 if (version > SerializedVersion()) {
599 "serialized object version " + std::to_string(version) +
600 " is from a later version of the library");
614 ar(::cereal::make_nvp(
"m", m));
616 ar(::cereal::make_nvp(
"ms", m_modulus_state));
617 cereal::size_type len;
618 ar(::cereal::make_nvp(
"l", len));
620 for (
size_t i = 0; i < len; i++) {
622 ar(::cereal::make_nvp(
"v", s));
627 template <
class Archive>
628 typename std::enable_if<cereal::traits::is_text_archive<Archive>::value,
630 load(Archive &ar, std::uint32_t
const version) {
631 if (version > SerializedVersion()) {
633 "serialized object version " + std::to_string(version) +
634 " is from a later version of the library");
637 ar(::cereal::make_nvp(
"m", m));
639 ar(::cereal::make_nvp(
"ms", m_modulus_state));
640 cereal::size_type len;
641 ar(::cereal::make_nvp(
"l", len));
643 for (
size_t i = 0; i < len; i++) {
645 ar(::cereal::make_nvp(
"v", s));
650 std::string SerializedObjectName()
const {
return "NTLVector"; }
652 static uint32_t SerializedVersion() {
return 1; }
657 void ModulusCheck(std::string msg)
const {
658 if (!isModulusSet()) {
660 msg +
" uninitialized this->modulus");
666 void ArgCheckVector(
const myVecP &b, std::string fname)
const {
667 if (this->m_modulus != b.m_modulus) {
670 fname +
" modulus vector modulus vector op of different moduli");
671 }
else if (!isModulusSet()) {
674 fname +
" modulus vector modulus vector op GARBAGE moduli");
675 }
else if (this->GetLength() != b.GetLength()) {
677 fname +
" vectors of different lengths");
682 void Renormalize(
void) {
683 for (
size_t i = 0; i < this->GetLength(); ++i) {
684 (*this)[i] %= m_modulus;
696 ModulusState m_modulus_state;
699 bool IndexCheck(
size_t index)
const {
700 if (index >= this->GetLength()) {
712 #endif // LBCRYPTO_MATH_BIGINTNTL_MUBINTVECNTL_H myVecP ModExp(const myT &b) const
Definition: mubintvecntl.cpp:492
const myVecP & ModSubEq(const myVecP &b)
Definition: mubintvecntl.h:363
myVecP MultiplyAndRound(const myT &p, const myT &q) const
Definition: mubintvecntl.cpp:559
Base class for PALISADE serialization.
Definition: serializable.h:76
void modadd_p(myVecP &x, const myVecP &a, const myVecP &b) const
Definition: mubintvecntl.cpp:437
The class for representing vectors of ubint with associated modulo math.
Definition: mubintvecntl.h:73
const myVecP & ModAddEq(const myT &b)
Definition: mubintvecntl.h:260
void modmul_p(myVecP &x, const myVecP &a, const myVecP &b) const
Definition: mubintvecntl.cpp:474
const myVecP & ModByTwoEq()
Definition: mubintvecntl.cpp:538
myVecP ModSub(const myT &b) const
Definition: mubintvecntl.h:323
const myVecP & ModInverseEq()
Definition: mubintvecntl.cpp:521
void modsub_p(myVecP &x, const myVecP &a, const myVecP &b) const
Definition: mubintvecntl.cpp:457
Definition: interface.h:588
const myVecP & DivideAndRoundEq(const myT &q)
Definition: mubintvecntl.cpp:606
const myVecP & ModMulEq(const myT &b)
Definition: mubintvecntl.h:394
Definition: exception.h:147
myVecP ModAdd(const myVecP &b) const
Definition: mubintvecntl.h:292
Definition: exception.h:113
const myVecP & ModAddEq(const myVecP &b)
Definition: mubintvecntl.h:305
friend std::ostream & operator<<(std::ostream &os, const myVecP< myT > &ptr_obj)
Definition: mubintvecntl.h:549
myVecP Mod(const myT &b) const
Definition: mubintvecntl.cpp:372
myVecP ModAdd(const myT &b) const
Definition: mubintvecntl.h:247
const myVecP & ModAddAtIndexEq(size_t i, const myT &b)
Definition: mubintvecntl.cpp:423
const myVecP & ModEq(const myT &b)
Definition: mubintvecntl.cpp:391
myVecP ModByTwo() const
Definition: mubintvecntl.cpp:530
const myVecP & ModSubEq(const myT &b)
Definition: mubintvecntl.h:336
myVecP ModMul(const myT &b) const
Definition: mubintvecntl.h:381
const myVecP & ModExpEq(const myT &b)
Definition: mubintvecntl.cpp:502
const myVecP & MultiplyAndRoundEq(const myT &p, const myT &q)
Definition: mubintvecntl.cpp:575
myVecP ModMul(const myVecP &b) const
Definition: mubintvecntl.h:409
const myVecP & ModMulEq(const myVecP &b)
Definition: mubintvecntl.h:423
myVecP ModAddAtIndex(size_t i, const myT &b) const
Definition: mubintvecntl.cpp:410
myVecP GetDigitAtIndexForBase(size_t index, usint base) const
Definition: mubintvecntl.cpp:624
myVecP ModInverse() const
Definition: mubintvecntl.cpp:511
myVecP DivideAndRound(const myT &q) const
Definition: mubintvecntl.cpp:590
myVecP ModSub(const myVecP &b) const
Definition: mubintvecntl.h:350
Definition: exception.h:107