integer.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:11k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  integer.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_INTEGER_H
  12. #define LEDA_INTEGER_H
  13. //------------------------------------------------------------------------------
  14. //
  15. //  integer:  big integers
  16. //
  17. //  by Christian Uhrig and Stefan Naeher   (1994)
  18. //
  19. //  - 32 bit (unsigned long) vector representation
  20. //  - use of a handle class concept (to avoid copy overhead)
  21. //  - use of the LEDA memory management
  22. //  - sparc assembler code for 32 bit multiplication
  23. //
  24. //------------------------------------------------------------------------------
  25. /*{Manpage {integer} {} {Integers of Arbitrary Length} }*/
  26. #include <LEDA/basic.h>
  27. #include <iostream.h>
  28. #if _MIPS_SZLONG == 64
  29. typedef unsigned int  int_word_type;
  30. #else
  31. typedef unsigned long int_word_type;
  32. #endif
  33. class integer_rep 
  34. {
  35.   friend class integer;
  36.   friend class rational;
  37. /*
  38.   unsigned short  count;
  39.   unsigned short  size;
  40.   unsigned short  used;
  41.            short  sign;
  42. */
  43.   unsigned int  count;
  44.   unsigned int  size;
  45.   unsigned int  used;
  46.            int  sign;
  47.   int_word_type vec[1];
  48.   friend integer_rep* copy_integer_rep(integer_rep*);
  49.   friend integer operator + (const integer& a, const integer& b);
  50.   friend integer operator - (const integer& a, const integer& b);
  51.   friend integer operator * (const integer& a, const integer& b);
  52.   friend integer operator / (const integer& a, const integer& b);
  53.   friend integer operator % (const integer& a, const integer& b);
  54.   friend integer operator & (const integer& a, const integer& b);
  55.   friend integer operator | (const integer& a, const integer& b);
  56. //friend integer operator ^ (const integer& a, const integer& b);
  57.   friend bool operator == (const integer& a, const integer& b);
  58.   friend bool operator < (const integer& a, const integer& b);
  59.   friend bool operator > (const integer& a, const integer& b);
  60.   friend inline bool operator != (const integer& a, const integer& b);
  61.   friend inline bool operator >= (const integer& a, const integer& b);
  62.   friend inline bool operator <= (const integer& a, const integer& b);
  63.   friend ostream & operator << (ostream & out, const integer& a);
  64.   friend istream & operator >> (istream & in, integer& a);
  65.   friend integer abs(const integer& a);
  66.   friend integer gcd(const integer&, const integer&);
  67.   friend int log(const integer& a);
  68.   friend inline int sign(const integer& a);
  69.   friend inline integer_rep* new_integer_rep(unsigned int size);
  70.   friend void  delete_integer_rep(integer_rep *p);
  71. };
  72. inline integer_rep* new_integer_rep(unsigned int sz)
  73. { int s = sizeof(integer_rep) + (sz-1)*sizeof(int_word_type);
  74.   integer_rep* p;
  75.   if (s < 256) p = (integer_rep*)allocate_bytes(s);
  76.           else p = (integer_rep*)new char[s];
  77.   p->count = 1;
  78.   p->size = sz;
  79.   return p;
  80.  }
  81. /*
  82. inline void delete_integer_rep(integer_rep* p)
  83. { int s = sizeof(integer_rep) + (p->size-1)*sizeof(int_word_type);
  84.   if (s < 256)
  85.      deallocate_bytes(p,s);
  86.   else
  87.      delete[] p;
  88. }
  89. */
  90. class integer {
  91.   friend class rational;
  92. /*{Mdefinition
  93. An instance $a$ of the data type name is an integer number of 
  94. arbitrary length. 
  95. }*/
  96. private:
  97.  integer_rep* PTR;
  98.  integer(integer_rep* p) { PTR = p; }
  99.  GenPtr copy() const { PTR->count++; return PTR; }
  100.  void   clear()      { if (PTR && --(PTR->count)==0) delete_integer_rep(PTR); }
  101.  int    refs() const { return PTR->count; }
  102. public:
  103. /*{Mcreation a }*/
  104.    
  105.    integer();
  106. /*{Mcreate creates an instance var of type name and initializes it
  107. with zero.}*/
  108.    integer(int n);
  109. /*{Mcreate creates an instance var of type name and initializes it
  110. with the value of $n$.}*/
  111.   
  112.    integer(unsigned int i);
  113.    integer(long l);
  114.    integer(unsigned long i);
  115.    
  116.    integer(double x); 
  117.    
  118. /*{Mcreate creates an instance var of type name and initializes it
  119. with the integral part of $x$.}*/
  120.    integer(const integer& a)  { PTR = a.PTR;  PTR->count++; }
  121.   ~integer() { clear(); }
  122. /*{Moperations 2 4.7 }*/
  123. /*{Mtext
  124. The arithmetic operations $+, -, *, /, +=,
  125. -=, *=, /=, -$(unary), $++, --$,  the modulus operation ($%$, $% =$), bitwise
  126. AND ($&$, $& =$), bitwise OR ($Lvert Lvert =$), the complement ($ tilde{} $),
  127. the shift operations
  128. ($<<, >>$),
  129. the comparison operations $<, <=, >, 
  130. >=, ==, !=$ and the stream operations all are available.
  131. }*/
  132.    integer& operator=(const integer& x)
  133.    { x.PTR->count++;
  134.      clear();
  135.      PTR = x.PTR;
  136.      return *this;
  137.     }
  138.   // type conversion
  139. /*
  140.   operator GenPtr() { return (PTR->sign) ? PTR : 0; }
  141. */
  142.   // member functions
  143.   int    length()   const;
  144. /*{Mop returns the number of bits of the representation of var.}*/
  145.   bool   islong()   const;
  146. /*{Mop returns whether var fits in the data type $long$.}*/
  147.   bool   iszero()   const;
  148. /*{Mop returns whether var is equal to zero.}*/
  149.   long   tolong()   const;
  150. /*{Mop returns a $long$ number which is initialized with the value of
  151. var.\ 
  152. precond $a$.islong() is $true$.}*/
  153.   double todouble() const;
  154. /*{Mop returns a $double$ number which is initialized with the value of
  155. var. \
  156. precond $a$ fits in the range of a $double$.}*/
  157.   integer sqrt()     const;
  158. /*{Mop returns the largest $integer$ which is not larger than the
  159. squareroot of var. }*/
  160.   int_word_type highword() const;
  161.   void hex_print(ostream&);
  162.   // friend functions & operators
  163.   friend integer operator + (const integer& a, const integer& b);
  164.   friend integer operator - (const integer& a, const integer& b);
  165.   friend integer operator * (const integer& a, const integer& b);
  166.   friend integer operator / (const integer& a, const integer& b);
  167.   friend integer operator % (const integer& a, const integer& b);
  168.   friend integer operator & (const integer& a, const integer& b);
  169.   friend integer operator | (const integer& a, const integer& b);
  170. //friend integer operator ^ (const integer& a, const integer& b);
  171.   friend bool operator == (const integer& a, const integer& b);
  172.   friend bool operator != (const integer& a, const integer& b);
  173.   friend bool operator <  (const integer& a, const integer& b);
  174.   friend bool operator >  (const integer& a, const integer& b);
  175.   friend bool operator >= (const integer& a, const integer& b);
  176.   friend bool operator <= (const integer& a, const integer& b);
  177. /*{Mtext
  178. smallskip
  179. {bf Non-member functions}
  180. smallskip }*/
  181.   friend integer abs(const integer& a);
  182. /*{Mfunc returns the absolute value of $a$.}*/
  183.   friend integer gcd(const integer& a, const integer& b);
  184. /*{Mfunc returns the greatest common divisor of $a$ and $b$.}*/
  185.   friend int   sign(const integer& a);
  186. /*{Mfunc returns the sign of $a$.}*/
  187.   friend int    log(const integer& a);
  188. /*{Mfunc returns the logarithm of $a$ to the basis 2.}*/
  189.   // member functions and operators
  190.   int  used_words() { return PTR->used; };
  191.   int  zeros() const;
  192.   void absolute();
  193.   int_word_type contents(int k) const { return PTR->vec[k]; };
  194.   integer       div(const integer&, integer&); 
  195.   integer operator-() const;
  196.   integer operator~() const;
  197.   integer operator<<(long n) const;
  198.   integer operator>>(long n) const;
  199.   integer operator+= (const integer& b) { return *this = *this + b; }
  200.   integer operator-= (const integer& b) { return *this = *this - b; }
  201.   integer operator*= (const integer& b) { return *this = *this * b; }
  202.   integer operator/= (const integer& b) { return *this = *this / b; }
  203.   integer operator%= (const integer& b) { return *this = *this % b; }
  204.   integer operator&= (const integer& b) { return *this = *this & b; }
  205.   integer operator|= (const integer& b) { return *this = *this | b; }
  206.   integer operator<<=(int n) { return *this = *this << n; }
  207.   integer operator>>=(int n) { return *this = *this >> n; }
  208.   integer operator++ ();
  209.   integer operator++ (int);
  210.   integer operator-- ();
  211.   integer operator-- (int);
  212.   // "long-versions" should be implemented more efficiently!
  213.   //
  214.   //integer operator+(long i) const;
  215.   //integer operator-(long i) const;
  216.   //integer operator*(long i) const;
  217.   //integer operator/(long i) const;
  218.   //integer operator%(long i) const;
  219.   //integer operator+=(long i);
  220.   //integer operator-=(long i);
  221.   //integer operator*=(long i);
  222.   //integer operator/=(long i);
  223.   //integer operator%=(long i);
  224.   bool operator==(int n) const;
  225.   bool operator!=(int n) const;
  226.   bool operator< (int n) const;
  227.   bool operator> (int n) const;
  228.   bool operator>=(int n) const;
  229.   bool operator<=(int n) const;
  230.   // static members
  231.   static integer random(int n);
  232.   // more friends
  233.   friend ostream& operator << (ostream& O, const integer& a);
  234.   friend istream& operator >> (istream& I, integer& a);
  235. #if !defined(__TEMPLATE_FUNCTIONS__)
  236.   friend GenPtr  Create(const integer*) { integer x; return x.copy(); }
  237.   friend void    Clear(integer& y)      { y.clear();}
  238.   friend GenPtr  Convert(integer& y)    { return y.PTR; }
  239.   friend GenPtr  Copy(const integer& y) { return y.copy();}
  240.   friend char*   Type_Name(const integer*) { return "integer"; }
  241. #endif
  242.   static int  cmp(const integer& a, const integer& b);
  243.   LEDA_MEMORY(integer)
  244. };
  245. inline void Print(const integer& a, ostream & out) { out << a; }
  246. inline void Read(integer& a, istream & in) { in >> a; }
  247. inline int compare(const integer& a, const integer& b)
  248. { return integer::cmp(a,b); }
  249. inline bool operator != (const integer& a, const integer& b) { return !(a==b); }
  250. inline bool operator <= (const integer& a, const integer& b) { return !(a>b);  }
  251. inline bool operator >= (const integer& a, const integer& b) { return !(a<b);  }
  252. inline int sign(const integer& a) { return a.PTR->sign; }
  253. inline bool integer::iszero() const { return (PTR->sign == 0); }
  254. inline bool integer::islong() const
  255. { if (PTR->sign == 0) return true;
  256.   else return (PTR->used == 1 && PTR->vec[0] <= 0x8FFFFFFF);
  257.  }
  258. inline long integer::tolong() const
  259. { if (PTR->sign == 0) return 0;
  260.   else return  (PTR->sign > 0) ? PTR->vec[0] : -PTR->vec[0];
  261.  }
  262. inline int_word_type integer::highword() const
  263. { if (PTR->sign == 0) return 0;
  264.   else return PTR->vec[PTR->used-1];
  265.  }
  266. inline bool integer::operator!=(int a) const { return !operator==(a); }
  267. inline bool integer::operator<=(int a) const { return !operator>(a);  }
  268. inline bool integer::operator>=(int a) const { return !operator<(a);  }
  269. inline integer integer::operator++ () { return *this = *this + 1; }
  270. inline integer integer::operator-- () { return *this = *this - 1; }
  271. inline integer integer::operator++ (int) 
  272. { integer i = *this;
  273.   *this = *this + 1;
  274.   return i;
  275.  }
  276. inline integer integer::operator-- (int) 
  277. { integer i = *this;
  278.   *this = *this - 1;
  279.   return i;
  280.  }
  281. /*{Mimplementation 
  282. An $integer$ is essentially implemented by a 
  283. vector $vec$ of $unsigned long$ numbers. 
  284. The sign and the size are stored in extra variables.
  285. Some time critical functions are also implemented in sparc assembler code.}*/
  286. #endif