3 * @brief Arbitrary sized integer declarations
17 typedef uint64_t digit_t;
20 Arbint(const std::vector<digit_t> & digits);
21 Arbint(unsigned n, digit_t d0, ...);
22 Arbint(const std::string & str, const std::string & base="0123456789");
24 Arbint(const Arbint & cpy);
26 int64_t AsDigit() const
28 int64_t digit = (m_digits.size() == 1) ? m_digits[0] : 0x7FFFFFFFFFFFFFFF;
29 return (m_sign) ? -digit : digit;
32 inline bool Sign() const {return m_sign;}
33 inline char SignChar() const {return (m_sign) ? '-' : '+';}
34 std::string DigitStr() const;
36 std::string Str(const std::string & base="0123456789") const;
37 inline std::string Str(const char * base) const
39 return Str(std::string(base));
42 Arbint & operator=(const Arbint & equ);
43 Arbint & operator+=(const Arbint & add);
44 Arbint & operator-=(const Arbint & sub);
45 Arbint & operator*=(const Arbint & mul);
46 void Division(const Arbint & div, Arbint & result, Arbint & modulo) const;
48 Arbint & operator<<=(unsigned amount);
49 Arbint & operator>>=(unsigned amount);
51 inline Arbint operator+(const Arbint & add) const
57 inline Arbint operator-(const Arbint & add) const
64 inline Arbint operator-()
71 inline Arbint operator*(const Arbint & mul) const
78 inline Arbint & operator/=(const Arbint & div)
82 this->Division(div, result, remainder);
83 this->operator=(result);
86 inline Arbint operator/(const Arbint & div)
92 inline Arbint operator%(const Arbint & div)
96 this->Division(div, result, remainder);
100 bool operator==(const Arbint & equ) const;
101 bool operator<(const Arbint & less) const;
103 inline bool operator!=(const Arbint & equ) const
105 return !(this->operator==(equ));
107 inline bool operator<=(const Arbint & leq) const
109 return (this->operator==(leq) || this->operator<(leq));
112 inline bool operator>=(const Arbint & leq) const
114 return (this->operator==(leq) || this->operator>(leq));
116 inline bool operator>(const Arbint & grea) const
118 return !(this->operator<=(grea));
120 inline Arbint operator>>(unsigned amount) const
122 Arbint result(*this);
126 inline Arbint operator<<(unsigned amount) const
128 Arbint result(*this);
134 inline operator double() const
137 for(int i = m_digits.size()-1; i >= 0; --i)
139 acc += (double)m_digits[i];
140 acc *= (double)UINT64_MAX + 1.0;
142 if (m_sign) acc *= -1;
145 inline operator int64_t() const {return AsDigit();}
146 //inline operator int() const {return int(AsDigit());}
150 inline Arbint Abs() const {Arbint a(*this); a.m_sign = false; return a;}
153 Arbint & AddBasic(const Arbint & add);
154 Arbint & SubBasic(const Arbint & sub);
156 bool GetBit(unsigned i) const;
157 void BitClear(unsigned i);
158 void BitSet(unsigned i);
161 std::vector<digit_t> m_digits;
171 typedef uint64_t digit_t;
172 digit_t add_digits(digit_t * dst, digit_t * add, digit_t size);
173 digit_t sub_digits(digit_t * dst, digit_t * add, digit_t size);
174 digit_t mul_digits(digit_t * dst, digit_t mul, digit_t size);
175 digit_t div_digits(digit_t * dst, digit_t div, digit_t size, digit_t * rem);