-
Notifications
You must be signed in to change notification settings - Fork 1
/
big_integer.h
160 lines (85 loc) · 3.85 KB
/
big_integer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#ifndef BIG_INTEGER_H
#define BIG_INTEGER_H
#include <cstddef>
#include <iosfwd>
#include <algorithm>
#include <cmath>
#include <vector/socow_vector.h>
struct big_integer {
big_integer();
big_integer(big_integer const &other);
big_integer(int a);
explicit big_integer(std::string const &str);
~big_integer();
big_integer &operator=(big_integer const &other);
big_integer &operator+=(big_integer const &rhs);
big_integer &operator-=(big_integer const &rhs);
big_integer &operator*=(big_integer const &rhs);
big_integer &operator/=(big_integer const &rhs);
big_integer &operator%=(big_integer const &rhs);
big_integer &operator&=(big_integer const &rhs);
big_integer &operator|=(big_integer const &rhs);
big_integer &operator^=(big_integer const &rhs);
big_integer &operator<<=(int rhs);
big_integer &operator>>=(int rhs);
big_integer operator+() const;
big_integer operator-() const;
big_integer operator~() const;
big_integer &operator++();
big_integer operator++(int);
big_integer &operator--();
big_integer operator--(int);
friend bool operator==(big_integer const &a, big_integer const &b);
friend bool operator!=(big_integer const &a, big_integer const &b);
friend bool operator<(big_integer const &a, big_integer const &b);
friend bool operator>(big_integer const &a, big_integer const &b);
friend bool operator<=(big_integer const &a, big_integer const &b);
friend bool operator>=(big_integer const &a, big_integer const &b);
friend int8_t comp(big_integer const &a, big_integer const &b);
friend int8_t comp_abs(big_integer const &a, big_integer const &b);
friend std::string to_string(big_integer const &a);
void mul_short(const big_integer &a, const unsigned int &x);
private:
socow_vector data;
bool sign;
bool is_zero() const;
void shrink_zeroes();
size_t length() const;
unsigned int get_digit(const size_t &i) const;
void set_digit(const size_t &i, const unsigned int &val);
void resize(const size_t &ns);
unsigned int back() const;
void len_prepare(const size_t &new_size);
void reverse_digits();
void complem_two();
void recomplem_two();
void ar_gen(const big_integer &r, const bool &rev);
void add_abs(const big_integer &r, const size_t &offset);
void sub_abs(const big_integer &l, const big_integer &r);
unsigned int div_short(const unsigned int &a);
template<class FunctorT>
big_integer &bit_gen(const big_integer &rhs, FunctorT functor);
void bit_prepare(const big_integer &r);
big_integer divide(const big_integer &rhs, const bool &mode);
};
big_integer operator+(big_integer a, big_integer const &b);
big_integer operator-(big_integer a, big_integer const &b);
big_integer operator*(big_integer a, big_integer const &b);
big_integer operator/(big_integer a, big_integer const &b);
big_integer operator%(big_integer a, big_integer const &b);
big_integer operator&(big_integer a, big_integer const &b);
big_integer operator|(big_integer a, big_integer const &b);
big_integer operator^(big_integer a, big_integer const &b);
big_integer operator<<(big_integer a, int b);
big_integer operator>>(big_integer a, int b);
bool operator==(big_integer const &a, big_integer const &b);
bool operator!=(big_integer const &a, big_integer const &b);
bool operator<(big_integer const &a, big_integer const &b);
bool operator>(big_integer const &a, big_integer const &b);
bool operator<=(big_integer const &a, big_integer const &b);
bool operator>=(big_integer const &a, big_integer const &b);
int8_t comp(big_integer const &a, big_integer const &b);
int8_t comp_abs(big_integer const &a, big_integer const &b);
std::string to_string(big_integer const &a);
std::ostream &operator<<(std::ostream &s, big_integer const &a);
#endif // BIG_INTEGER_H