+ std::string Str(const std::string & base="0123456789") const;
+ inline std::string Str(const char * base) const
+ {
+ return Str(std::string(base));
+ }
+
+ Arbint & operator=(const Arbint & equ);
+ Arbint & operator+=(const Arbint & add);
+ Arbint & operator-=(const Arbint & sub);
+ Arbint & operator*=(const Arbint & mul);
+ void Division(const Arbint & div, Arbint & result, Arbint & modulo) const;
+
+ Arbint & operator<<=(unsigned amount);
+ Arbint & operator>>=(unsigned amount);
+
+ inline Arbint operator+(const Arbint & add) const
+ {
+ Arbint a(*this);
+ a += add;
+ return a;
+ }
+ inline Arbint operator-(const Arbint & add) const
+ {
+ Arbint a(*this);
+ a -= add;
+ return a;
+ }
+
+ inline Arbint operator-()
+ {
+ Arbint a(*this);
+ a.m_sign = !a.m_sign;
+ return a;
+ }
+
+ inline Arbint operator-() const
+ {
+ Arbint a(*this);
+ a.m_sign = !a.m_sign;
+ return a;
+ }
+
+ inline Arbint operator*(const Arbint & mul) const
+ {
+ Arbint a(*this);
+ a *= mul;
+ return a;
+ }
+
+ inline Arbint & operator/=(const Arbint & div)
+ {
+ Arbint result(0L);
+ Arbint remainder(0L);
+ this->Division(div, result, remainder);
+ this->operator=(result);
+ return *this;
+ }
+ inline Arbint operator/(const Arbint & div)
+ {
+ Arbint cpy(*this);
+ cpy /= div;
+ return cpy;
+ }
+ inline Arbint operator%(const Arbint & div)
+ {
+ Arbint result(0L);
+ Arbint remainder(0L);
+ this->Division(div, result, remainder);
+ return remainder;
+ }
+
+ bool operator==(const Arbint & equ) const;
+ bool operator<(const Arbint & less) const;
+
+
+ inline bool operator!=(const Arbint & equ) const
+ {
+ return !(this->operator==(equ));
+ }
+ inline bool operator<=(const Arbint & leq) const
+ {
+ return (this->operator==(leq) || this->operator<(leq));
+ }
+
+ inline bool operator>=(const Arbint & leq) const
+ {
+ return (this->operator==(leq) || this->operator>(leq));
+ }
+ inline bool operator>(const Arbint & grea) const
+ {
+ return !(this->operator<=(grea));
+ }
+ inline Arbint operator>>(unsigned amount) const
+ {
+ Arbint result(*this);
+ result >>= amount;
+ return result;
+ }
+ inline Arbint operator<<(unsigned amount) const
+ {
+ Arbint result(*this);
+ result <<= amount;
+ return result;
+ }
+ bool IsZero() const;
+
+ inline operator double() const
+ {
+ double acc = 0;
+ for (int i = m_digits.size()-1; i >= 0; --i)
+ {
+ acc += (double)m_digits[i];
+ acc *= (double)UINT64_MAX + 1.0;
+ }
+ if (m_sign) acc *= -1;
+ return acc;
+ }
+ inline operator int64_t() const {return AsDigit();}
+ //inline operator int() const {return int(AsDigit());}
+
+ unsigned Shrink();
+
+ inline Arbint Abs() const {Arbint a(*this); a.m_sign = false; return a;}