-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbig_integer.h
More file actions
135 lines (74 loc) · 3.32 KB
/
big_integer.h
File metadata and controls
135 lines (74 loc) · 3.32 KB
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
#ifndef BIG_INTEGER_H
#define BIG_INTEGER_H
#include <string>
#include <vector>
#include "optvector.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 std::string to_string(big_integer const &a);
private:
big_integer div_long_short(uint32_t d) const;
big_integer mul_long_short(uint32_t d) const;
big_integer &convert();
int compare(big_integer const &b) const;
big_integer &unsigned_add(big_integer const &other);
big_integer &unsigned_sub(big_integer const &other);
big_integer &bit_operation(big_integer const &rhs, int type);
inline void remove_zeroes() __attribute__((always_inline)) {
while (this->data.size() > 1 && this->data.back() == 0)
this->data.pop_back();
}
const static uint64_t BASE = 4294967296;
const static uint32_t BASE_LEN = 32;
std::vector<uint32_t> data;
//optvector data;
bool sign;
bool is_zero() const;
};
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);
std::string to_string(big_integer const &a);
std::ostream &operator<<(std::ostream &s, big_integer const &a);
#endif // BIG_INTEGER_H