2 using System.Collections.Generic;
5 using System.Threading.Tasks;
7 using Org.BouncyCastle.Math;
12 /// Wrapper for bouncycastle's Biginteger class.
14 public class BigNum : IComparable<BigNum>, IEquatable<BigNum>
17 /// Internal coby of Biginteger object.
19 private BigInteger bn;
22 public BigNum(BigInteger bnValue)
27 public BigNum(byte[] dataBytes)
29 bn = new BigInteger(dataBytes);
32 public BigNum(ulong ulongValue)
34 bn = new BigInteger(BitConverter.GetBytes(ulongValue));
37 public BigNum(uint256 uint256Value)
39 bn = new BigInteger(uint256Value);
43 #region Basic arithmetics
44 public static BigNum operator +(BigNum a, ulong b)
46 var bnValueToAdd = new BigInteger(BitConverter.GetBytes(b));
47 return new BigNum(a.bn.Add(bnValueToAdd));
50 public static BigNum operator -(BigNum a, ulong b)
52 var bnValueToSubstract = new BigInteger(BitConverter.GetBytes(b));
53 return new BigNum(a.bn.Subtract(bnValueToSubstract));
56 public static BigNum operator +(BigNum a, uint256 b)
58 var bnValueToAdd = new BigInteger(b);
59 return new BigNum(a.bn.Add(bnValueToAdd));
62 public static BigNum operator -(BigNum a, uint256 b)
64 var bnValueToSubstract = new BigInteger(b);
65 return new BigNum(a.bn.Subtract(bnValueToSubstract));
68 public static BigNum operator +(BigNum a, BigNum b)
70 return new BigNum(a.bn.Add(b.bn));
73 public static BigNum operator -(BigNum a, BigNum b)
75 return new BigNum(a.bn.Subtract(b.bn));
78 public static BigNum operator /(BigNum a, ulong b)
80 var bnDivider = new BigInteger(BitConverter.GetBytes(b));
81 return new BigNum(a.bn.Divide(bnDivider));
84 public static BigNum operator /(BigNum a, uint256 b)
86 var bnDivider = new BigInteger(b);
87 return new BigNum(a.bn.Divide(bnDivider));
90 public static BigNum operator /(BigNum a, BigNum b)
92 return new BigNum(a.bn.Divide(b.bn));
95 public static BigNum operator *(BigNum a, ulong b)
97 var bnMultiplier = new BigInteger(BitConverter.GetBytes(b));
98 return new BigNum(a.bn.Multiply(bnMultiplier));
101 public static BigNum operator *(BigNum a, uint256 b)
103 var bnMultiplier = new BigInteger(b);
104 return new BigNum(a.bn.Multiply(bnMultiplier));
107 public static BigNum operator *(BigNum a, BigNum b)
109 return new BigNum(a.bn.Multiply(b.bn));
113 #region Comparison operations
114 public static bool operator <(BigNum a, BigNum b)
116 return a.bn.CompareTo(b.bn) < 0;
118 public static bool operator <=(BigNum a, BigNum b)
120 return a.bn.CompareTo(b.bn) <= 0;
123 public static bool operator >(BigNum a, BigNum b)
125 return a.bn.CompareTo(b.bn) > 0;
128 public static bool operator >=(BigNum a, BigNum b)
130 return a.bn.CompareTo(b.bn) >= 0;
133 public static bool operator ==(BigNum a, BigNum b)
135 return a.bn.CompareTo(b.bn) == 0;
138 public static bool operator !=(BigNum a, BigNum b)
140 return a.bn.CompareTo(b.bn) != 0;
145 #region Cast operators
146 public static implicit operator BigNum(BigInteger bnValue)
148 return new BigNum(bnValue);
151 public static implicit operator BigNum(ulong ulongValue)
153 return new BigNum(ulongValue);
156 public static implicit operator BigNum(uint256 uint256Value)
158 return new BigNum(uint256Value);
161 public static implicit operator ulong (BigNum a)
163 return (ulong)a.bn.LongValue;
166 public int CompareTo(BigNum other)
168 return bn.CompareTo(other.bn);
171 public bool Equals(BigNum other)
173 if (object.ReferenceEquals(other, null))
178 return this == other;
181 public override int GetHashCode()
183 return bn.GetHashCode();
186 public override bool Equals(object obj)
188 if (object.ReferenceEquals(obj, null))
193 return this == (obj as BigNum);