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
78 inline Arbint operator*(const Arbint & mul) const
85 inline Arbint & operator/=(const Arbint & div)
89 this->Division(div, result, remainder);
90 this->operator=(result);
93 inline Arbint operator/(const Arbint & div)
99 inline Arbint operator%(const Arbint & div)
102 Arbint remainder(0L);
103 this->Division(div, result, remainder);
107 bool operator==(const Arbint & equ) const;
108 bool operator<(const Arbint & less) const;
111 inline bool operator!=(const Arbint & equ) const
113 return !(this->operator==(equ));
115 inline bool operator<=(const Arbint & leq) const
117 return (this->operator==(leq) || this->operator<(leq));
120 inline bool operator>=(const Arbint & leq) const
122 return (this->operator==(leq) || this->operator>(leq));
124 inline bool operator>(const Arbint & grea) const
126 return !(this->operator<=(grea));
128 inline Arbint operator>>(unsigned amount) const
130 Arbint result(*this);
134 inline Arbint operator<<(unsigned amount) const
136 Arbint result(*this);
142 inline operator double() const
145 for (int i = m_digits.size()-1; i >= 0; --i)
147 acc += (double)m_digits[i];
148 acc *= (double)UINT64_MAX + 1.0;
150 if (m_sign) acc *= -1;
153 inline operator int64_t() const {return AsDigit();}
154 //inline operator int() const {return int(AsDigit());}
158 inline Arbint Abs() const {Arbint a(*this); a.m_sign = false; return a;}
161 Arbint & AddBasic(const Arbint & add);
162 Arbint & SubBasic(const Arbint & sub);
164 void GrowDigit(digit_t new_msd); // add a new most significant digit
166 bool GetBit(unsigned i) const;
167 void BitClear(unsigned i);
168 void BitSet(unsigned i);
171 std::vector<digit_t> m_digits;
181 typedef uint64_t digit_t;
182 digit_t add_digits(digit_t * dst, digit_t * add, digit_t size);
183 digit_t sub_digits(digit_t * dst, digit_t * add, digit_t size);
184 digit_t mul_digits(digit_t * dst, digit_t mul, digit_t size);
185 digit_t div_digits(digit_t * dst, digit_t div, digit_t size, digit_t * rem);