#include using namespace std; class z_p { static int modulus; int residue; // range from 0 to modulus-1 public: z_p() {residue = 0;} z_p(int i) {residue = i % modulus; if(residue < 0) residue += modulus; } z_p& operator/(const z_p& b) const {return (*this) * b.recip(); } z_p& operator*(const z_p& b) const {z_p* val_ptr = new z_p; val_ptr->residue = residue * b.residue % modulus; return(*val_ptr); } z_p& recip(void) const; friend int main(void); };// end class z_p z_p& z_p::recip(void) const { // The extended Euclidean algorithm int x, y, q, sx, tx, sy, ty, temp; x = modulus; y = residue; //*** sx = 1; sy = 0; tx = 0; ty = 1; while(y != 0) // always: gcd(modulus,residue) = gcd(x,y) // sx*modulus + tx*residue = x // sy*modulus + ty*residue = y {q = x / y; // integer quotient temp = y; y = x - q*y; x = temp; //*** temp = sy; sy = sx - q*sy; sx = temp; temp = ty; ty = tx - q*ty; tx = temp; }; // now x = gcd(modulus,residue) z_p* val_prt = new z_p(tx); return(*val_prt); }// end z_p::recip() /**** test program */ int z_p::modulus = 7; int main(void) {cout << (z_p(2)/z_p(4)).residue << endl; }// end main /****/