github.com/jiajun1992/watercarver@v0.0.0-20191031150618-dfc2b17c0c4a/StadiumForWaterCarver/src/Mod_p.cpp (about) 1 2 /* 3 * Mod_p.cpp 4 * 5 * Created on: 15.09.2010 6 * Author: stephaniebayer 7 */ 8 9 #include "Mod_p.h" 10 11 #include <assert.h> 12 13 #include "G_q.h" 14 extern G_q G; 15 16 #include "FakeZZ.h" 17 #include "CurvePoint.h" 18 NTL_CLIENT 19 20 21 Mod_p::Mod_p() {} 22 23 // added: explicit initializer 24 Mod_p::Mod_p(bool dummy) { 25 #if !USE_NTL 26 mod.is_initialized = true; 27 mod.is_scalar = true; 28 #endif 29 } 30 31 //Creates an instance which belongs to Z_p with value v 32 Mod_p::Mod_p(CurvePoint v, ZZ p){ 33 val = v; 34 #if USE_REAL_POINTS 35 // pass 36 #else 37 mod = p; 38 # if !USE_NTL 39 val.zz = v.zz % mod.zz; 40 # else 41 val.zz = v.zz % mod; 42 # endif 43 #endif 44 } 45 46 Mod_p::Mod_p(const Mod_p& other) { 47 mod = other.mod; 48 val = other.val; 49 } 50 51 52 Mod_p::~Mod_p() {} 53 54 55 //Returns the modular value 56 ZZ Mod_p::get_mod() const{ 57 58 return mod; 59 } 60 61 //returns the value of the instance 62 CurvePoint Mod_p::get_val() const{ 63 64 return val; 65 } 66 67 68 //Assigment operator 69 void Mod_p::operator =(const Mod_p& el){ 70 mod = el.get_mod(); 71 val = el.get_val(); 72 } 73 74 //Multiplication 75 Mod_p Mod_p::operator *(const Mod_p& el) const{ 76 CurvePoint temp; 77 assert(mod == el.get_mod()); 78 temp = MulMod(val,el.get_val(),mod); 79 return Mod_p(temp, mod); 80 } 81 82 //Equal to 83 bool Mod_p::operator ==(const Mod_p& el) const{ 84 if (mod == el.get_mod()) 85 { 86 if (val == el.get_val()) 87 { 88 return true; 89 } 90 else 91 { 92 return false; 93 } 94 } 95 else 96 { 97 return false; 98 } 99 } 100 101 //Not equal to 102 bool Mod_p::operator !=(const Mod_p& el) const{ 103 if (mod != el.get_mod()) 104 { 105 106 return true; 107 108 } 109 else 110 { 111 if (val != el.get_val()) 112 { 113 return true; 114 } 115 else 116 { 117 return false; 118 } 119 } 120 } 121 122 //Output operator, output format is val (modular mod) 123 ostream& operator <<(ostream& os , const Mod_p &b){ 124 os << b.get_val(); 125 return os; 126 } 127 128 //Input operator, 129 istream& operator>>(istream& is, Mod_p &b){ 130 CurvePoint val; ZZ mod; 131 is >> val; 132 mod = G.get_mod(); 133 b = Mod_p(val, mod); 134 return is; 135 } 136 137 void Mod_p::inv(Mod_p&a, const Mod_p& el){ 138 CurvePoint temp; 139 ZZ mod=el.get_mod(); 140 InvMod(temp, el.get_val(),mod); 141 a= Mod_p(temp, mod); 142 143 } 144 145 //Multiplication functions 146 void Mod_p::mult(Mod_p& a , const Mod_p& b, const Mod_p& c){ 147 CurvePoint temp; 148 ZZ mod=b.get_mod(); 149 MulMod(temp,b.get_val(), c.get_val(),mod); 150 a= Mod_p(temp,mod); 151 } 152 153 void Mod_p::expo(Mod_p& a ,const Mod_p& b,const long e){ 154 CurvePoint temp; 155 ZZ mod=b.get_mod(); 156 PowerMod(temp, b.get_val(),e,mod); 157 a= Mod_p(temp,mod); 158 } 159 160 void Mod_p::expo(Mod_p& a , const Mod_p& b, const ZZ e){ 161 CurvePoint temp; 162 ZZ mod=b.get_mod(); 163 PowerMod(temp, b.get_val(), e, mod); 164 a= Mod_p(temp,mod); 165 } 166 167 Mod_p Mod_p::expo(const ZZ e){ 168 CurvePoint temp; 169 PowerMod(temp, val,e, mod); 170 return Mod_p(temp,mod); 171 }