PIVX Core  5.6.99
P2P Digital Currency
bignum.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2012 The Bitcoin developers
3 // Copyright (c) 2017-2021 The PIVX Core developers
4 // Distributed under the MIT/X11 software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef PIVX_LIBZEROCOIN_BIGNUM_H
8 #define PIVX_LIBZEROCOIN_BIGNUM_H
9 
10 #if defined HAVE_CONFIG_H
11 #include "config/pivx-config.h"
12 #endif
13 
14 #include <gmp.h>
15 
16 #include <stdexcept>
17 #include <vector>
18 #include <limits.h>
19 
20 #include "arith_uint256.h"
21 #include "serialize.h"
22 #include "uint256.h"
23 #include "version.h"
24 #include "random.h"
25 
27 class bignum_error : public std::runtime_error
28 {
29 public:
30  explicit bignum_error(const std::string& str) : std::runtime_error(str) {}
31 };
32 
34 class CBigNum
35 {
36  mpz_t bn;
37 public:
38  CBigNum();
39  CBigNum(const CBigNum& b);
40  CBigNum& operator=(const CBigNum& b);
41  ~CBigNum();
42 
43  //CBigNum(char n) is not portable. Use 'signed char' or 'unsigned char'.
44  CBigNum(signed char n);
45  CBigNum(short n);
46  CBigNum(int n);
47  CBigNum(long n);
48  CBigNum(long long n);
49  CBigNum(unsigned char n);
50  CBigNum(unsigned short n);
51  CBigNum(unsigned int n);
52  CBigNum(unsigned long n);
53  CBigNum(unsigned long long n);
54  explicit CBigNum(uint256 n);
55  explicit CBigNum(const std::vector<unsigned char>& vch);
56 
62  static CBigNum randBignum(const CBigNum& range);
63 
68  int bitSize() const;
69  void setulong(unsigned long n);
70  unsigned long getulong() const;
71  unsigned int getuint() const;
72  int getint() const;
73  void setint64(int64_t sn);
74  void setuint64(uint64_t n);
75  void setuint256(uint256 n);
76  arith_uint256 getuint256() const;
77  void setvch(const std::vector<unsigned char>& vch);
78  std::vector<unsigned char> getvch() const;
79  void SetDec(const std::string& str);
80  void SetHex(const std::string& str);
81  bool SetHexBool(const std::string& str);
82  std::string ToString(int nBase=10) const;
83  std::string GetHex() const;
84  std::string GetDec() const;
85 
86  template<typename Stream>
87  void Serialize(Stream& s) const
88  {
89  ::Serialize(s, getvch());
90  }
91 
92  template<typename Stream>
93  void Unserialize(Stream& s)
94  {
95  std::vector<unsigned char> vch;
96  ::Unserialize(s, vch);
97  setvch(vch);
98  }
99 
105  CBigNum pow(const int e) const;
106 
112  CBigNum pow(const CBigNum& e) const;
113 
119  CBigNum mul_mod(const CBigNum& b, const CBigNum& m) const;
120 
126  CBigNum pow_mod(const CBigNum& e, const CBigNum& m) const;
127 
134  CBigNum inverse(const CBigNum& m) const;
135 
141  CBigNum gcd( const CBigNum& b) const;
142 
149  bool isPrime(const int checks=15) const;
150 
151  bool isOne() const;
152  bool operator!() const;
153  CBigNum& operator+=(const CBigNum& b);
154  CBigNum& operator-=(const CBigNum& b);
155  CBigNum& operator*=(const CBigNum& b);
156  CBigNum& operator/=(const CBigNum& b);
157  CBigNum& operator%=(const CBigNum& b);
158  CBigNum& operator<<=(unsigned int shift);
159  CBigNum& operator>>=(unsigned int shift);
160  CBigNum& operator++();
161  const CBigNum operator++(int);
162  CBigNum& operator--();
163  const CBigNum operator--(int);
164 
165  friend inline const CBigNum operator+(const CBigNum& a, const CBigNum& b);
166  friend inline const CBigNum operator-(const CBigNum& a, const CBigNum& b);
167  friend inline const CBigNum operator/(const CBigNum& a, const CBigNum& b);
168  friend inline const CBigNum operator%(const CBigNum& a, const CBigNum& b);
169  friend inline const CBigNum operator*(const CBigNum& a, const CBigNum& b);
170  friend inline const CBigNum operator<<(const CBigNum& a, unsigned int shift);
171  friend inline const CBigNum operator-(const CBigNum& a);
172  friend inline bool operator==(const CBigNum& a, const CBigNum& b);
173  friend inline bool operator!=(const CBigNum& a, const CBigNum& b);
174  friend inline bool operator<=(const CBigNum& a, const CBigNum& b);
175  friend inline bool operator>=(const CBigNum& a, const CBigNum& b);
176  friend inline bool operator<(const CBigNum& a, const CBigNum& b);
177  friend inline bool operator>(const CBigNum& a, const CBigNum& b);
178 };
179 
180 inline const CBigNum operator+(const CBigNum& a, const CBigNum& b) {
181  CBigNum r;
182  mpz_add(r.bn, a.bn, b.bn);
183  return r;
184 }
185 inline const CBigNum operator-(const CBigNum& a, const CBigNum& b) {
186  CBigNum r;
187  mpz_sub(r.bn, a.bn, b.bn);
188  return r;
189 }
190 inline const CBigNum operator-(const CBigNum& a) {
191  CBigNum r;
192  mpz_neg(r.bn, a.bn);
193  return r;
194 }
195 inline const CBigNum operator*(const CBigNum& a, const CBigNum& b) {
196  CBigNum r;
197  mpz_mul(r.bn, a.bn, b.bn);
198  return r;
199 }
200 inline const CBigNum operator/(const CBigNum& a, const CBigNum& b) {
201  CBigNum r;
202  mpz_tdiv_q(r.bn, a.bn, b.bn);
203  return r;
204 }
205 inline const CBigNum operator%(const CBigNum& a, const CBigNum& b) {
206  CBigNum r;
207  mpz_mmod(r.bn, a.bn, b.bn);
208  return r;
209 }
210 inline const CBigNum operator<<(const CBigNum& a, unsigned int shift) {
211  CBigNum r;
212  mpz_mul_2exp(r.bn, a.bn, shift);
213  return r;
214 }
215 inline const CBigNum operator>>(const CBigNum& a, unsigned int shift) {
216  CBigNum r = a;
217  r >>= shift;
218  return r;
219 }
220 inline bool operator==(const CBigNum& a, const CBigNum& b) { return (mpz_cmp(a.bn, b.bn) == 0); }
221 inline bool operator!=(const CBigNum& a, const CBigNum& b) { return (mpz_cmp(a.bn, b.bn) != 0); }
222 inline bool operator<=(const CBigNum& a, const CBigNum& b) { return (mpz_cmp(a.bn, b.bn) <= 0); }
223 inline bool operator>=(const CBigNum& a, const CBigNum& b) { return (mpz_cmp(a.bn, b.bn) >= 0); }
224 inline bool operator<(const CBigNum& a, const CBigNum& b) { return (mpz_cmp(a.bn, b.bn) < 0); }
225 inline bool operator>(const CBigNum& a, const CBigNum& b) { return (mpz_cmp(a.bn, b.bn) > 0); }
226 
227 inline std::ostream& operator<<(std::ostream &strm, const CBigNum &b) { return strm << b.ToString(10); }
228 
229 typedef CBigNum Bignum;
230 
233 const CBigNum BN_ONE = CBigNum(1);
234 const CBigNum BN_TWO = CBigNum(2);
236 
237 #endif // PIVX_LIBZEROCOIN_BIGNUM_H
const CBigNum operator>>(const CBigNum &a, unsigned int shift)
Definition: bignum.h:215
bool operator!=(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:221
const CBigNum operator*(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:195
bool operator<(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:224
const CBigNum operator+(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:180
const CBigNum operator<<(const CBigNum &a, unsigned int shift)
Definition: bignum.h:210
const CBigNum operator%(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:205
bool operator<=(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:222
const CBigNum BN_THREE
Definition: bignum.h:235
const CBigNum BN_ZERO
constant bignum instances
Definition: bignum.h:232
const CBigNum BN_TWO
Definition: bignum.h:234
const CBigNum operator/(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:200
bool operator>=(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:223
const CBigNum BN_ONE
Definition: bignum.h:233
bool operator>(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:225
CBigNum Bignum
Definition: bignum.h:229
const CBigNum operator-(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:185
bool operator==(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:220
C++ wrapper for BIGNUM.
Definition: bignum.h:35
std::vector< unsigned char > getvch() const
Definition: bignum.cpp:139
unsigned long getulong() const
Definition: bignum.cpp:88
~CBigNum()
Definition: bignum.cpp:27
bool isOne() const
Definition: bignum.cpp:267
std::string ToString(int nBase=10) const
Definition: bignum.cpp:177
friend bool operator!=(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:221
CBigNum(unsigned long long n)
mpz_t bn
Definition: bignum.h:36
void SetDec(const std::string &str)
Definition: bignum.cpp:164
CBigNum & operator*=(const CBigNum &b)
Definition: bignum.cpp:289
CBigNum & operator+=(const CBigNum &b)
Definition: bignum.cpp:277
CBigNum()
C++ wrapper for BIGNUM (Gmp bignum)
Definition: bignum.cpp:10
bool SetHexBool(const std::string &str)
Definition: bignum.cpp:170
void Unserialize(Stream &s)
Definition: bignum.h:93
CBigNum & operator/=(const CBigNum &b)
Definition: bignum.cpp:341
void Serialize(Stream &s) const
Definition: bignum.h:87
CBigNum & operator<<=(unsigned int shift)
Definition: bignum.cpp:295
CBigNum gcd(const CBigNum &b) const
Calculates the greatest common divisor (GCD) of two numbers.
Definition: bignum.cpp:248
unsigned int getuint() const
Definition: bignum.cpp:93
CBigNum & operator%=(const CBigNum &b)
Definition: bignum.cpp:347
friend const CBigNum operator*(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:195
bool isPrime(const int checks=15) const
Miller-Rabin primality test on this element.
Definition: bignum.cpp:261
friend bool operator<(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:224
std::string GetHex() const
Definition: bignum.cpp:321
friend const CBigNum operator+(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:180
friend const CBigNum operator<<(const CBigNum &a, unsigned int shift)
Definition: bignum.h:210
arith_uint256 getuint256() const
Definition: bignum.cpp:113
friend const CBigNum operator%(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:205
CBigNum & operator--()
Definition: bignum.cpp:314
bool operator!() const
Definition: bignum.cpp:272
CBigNum pow_mod(const CBigNum &e, const CBigNum &m) const
modular exponentiation: this^e mod n
Definition: bignum.cpp:220
std::string GetDec() const
Definition: bignum.cpp:326
void SetHex(const std::string &str)
Definition: bignum.cpp:336
friend bool operator<=(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:222
CBigNum & operator=(const CBigNum &b)
Definition: bignum.cpp:21
static CBigNum randBignum(const CBigNum &range)
Generates a cryptographically secure random number between zero and range exclusive i....
Definition: bignum.cpp:58
CBigNum pow(const int e) const
exponentiation with an int.
Definition: bignum.cpp:331
void setvch(const std::vector< unsigned char > &vch)
Definition: bignum.cpp:123
int bitSize() const
Returns the size in bits of the underlying bignum.
Definition: bignum.cpp:78
CBigNum mul_mod(const CBigNum &b, const CBigNum &m) const
modular multiplication: (this * b) mod m
Definition: bignum.cpp:207
CBigNum & operator-=(const CBigNum &b)
Definition: bignum.cpp:283
friend const CBigNum operator/(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:200
CBigNum & operator++()
Definition: bignum.cpp:307
void setulong(unsigned long n)
Definition: bignum.cpp:83
void setint64(int64_t sn)
CBigNum inverse(const CBigNum &m) const
Calculates the inverse of this element mod m.
Definition: bignum.cpp:236
friend bool operator>=(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:223
void setuint256(uint256 n)
Definition: bignum.cpp:108
friend bool operator>(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:225
void setuint64(uint64_t n)
friend const CBigNum operator-(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:185
CBigNum & operator>>=(unsigned int shift)
Definition: bignum.cpp:301
friend bool operator==(const CBigNum &a, const CBigNum &b)
Definition: bignum.h:220
int getint() const
Definition: bignum.cpp:98
256-bit unsigned big integer.
Errors thrown by the bignum class.
Definition: bignum.h:28
bignum_error(const std::string &str)
Definition: bignum.h:30
256-bit opaque blob.
Definition: uint256.h:138
Definition: uint256.h:212