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  }