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(long longValue)
39 bn = new BigInteger(Math.Sign(longValue), BitConverter.GetBytes(longValue));
42 public BigNum(uint256 uint256Value)
44 bn = new BigInteger(uint256Value);
48 #region Basic arithmetics
49 public static BigNum operator +(BigNum a, ulong b)
51 var bnValueToAdd = new BigInteger(BitConverter.GetBytes(b));
52 return new BigNum(a.bn.Add(bnValueToAdd));
55 public static BigNum operator +(BigNum a, long b)
57 var bnValueToAdd = new BigInteger(BitConverter.GetBytes(b));
58 return new BigNum(a.bn.Add(bnValueToAdd));
61 public static BigNum operator -(BigNum a, ulong b)
63 var bnValueToSubstract = new BigInteger(BitConverter.GetBytes(b));
64 return new BigNum(a.bn.Subtract(bnValueToSubstract));
66 public static BigNum operator -(BigNum a, long b)
68 var bnValueToSubstract = new BigInteger(BitConverter.GetBytes(b));
69 return new BigNum(a.bn.Subtract(bnValueToSubstract));
72 public static BigNum operator +(BigNum a, uint256 b)
74 var bnValueToAdd = new BigInteger(b);
75 return new BigNum(a.bn.Add(bnValueToAdd));
78 public static BigNum operator -(BigNum a, uint256 b)
80 var bnValueToSubstract = new BigInteger(b);
81 return new BigNum(a.bn.Subtract(bnValueToSubstract));
84 public static BigNum operator +(BigNum a, BigNum b)
86 return new BigNum(a.bn.Add(b.bn));
89 public static BigNum operator -(BigNum a, BigNum b)
91 return new BigNum(a.bn.Subtract(b.bn));
94 public static BigNum operator /(BigNum a, ulong b)
96 var bnDivider = new BigInteger(BitConverter.GetBytes(b));
97 return new BigNum(a.bn.Divide(bnDivider));
100 public static BigNum operator /(BigNum a, long b)
102 var bnDivider = new BigInteger(BitConverter.GetBytes(b));
103 return new BigNum(a.bn.Divide(bnDivider));
106 public static BigNum operator /(BigNum a, uint256 b)
108 var bnDivider = new BigInteger(b);
109 return new BigNum(a.bn.Divide(bnDivider));
112 public static BigNum operator /(BigNum a, BigNum b)
114 return new BigNum(a.bn.Divide(b.bn));
117 public static BigNum operator *(BigNum a, ulong b)
119 var bnMultiplier = new BigInteger(BitConverter.GetBytes(b));
120 return new BigNum(a.bn.Multiply(bnMultiplier));
123 public static BigNum operator *(BigNum a, long b)
125 var bnMultiplier = new BigInteger(BitConverter.GetBytes(b));
126 return new BigNum(a.bn.Multiply(bnMultiplier));
129 public static BigNum operator *(BigNum a, uint256 b)
131 var bnMultiplier = new BigInteger(b);
132 return new BigNum(a.bn.Multiply(bnMultiplier));
135 public static BigNum operator *(BigNum a, BigNum b)
137 return new BigNum(a.bn.Multiply(b.bn));
141 #region Comparison operations
142 public static bool operator <(BigNum a, BigNum b)
144 return a.bn.CompareTo(b.bn) < 0;
146 public static bool operator <=(BigNum a, BigNum b)
148 return a.bn.CompareTo(b.bn) <= 0;
151 public static bool operator >(BigNum a, BigNum b)
153 return a.bn.CompareTo(b.bn) > 0;
156 public static bool operator >=(BigNum a, BigNum b)
158 return a.bn.CompareTo(b.bn) >= 0;
161 public static bool operator ==(BigNum a, BigNum b)
163 return a.bn.CompareTo(b.bn) == 0;
166 public static bool operator !=(BigNum a, BigNum b)
168 return a.bn.CompareTo(b.bn) != 0;
173 #region Cast operators
174 public static implicit operator BigNum(BigInteger bnValue)
176 return new BigNum(bnValue);
179 public static implicit operator BigNum(ulong ulongValue)
181 return new BigNum(ulongValue);
184 public static implicit operator BigNum(long ulongValue)
186 return new BigNum(ulongValue);
189 public static implicit operator BigNum(uint256 uint256Value)
191 return new BigNum(uint256Value);
194 public static implicit operator ulong (BigNum a)
196 return (ulong)a.bn.LongValue;
199 public static implicit operator long (BigNum a)
201 return a.bn.LongValue;
204 public int CompareTo(BigNum other)
206 return bn.CompareTo(other.bn);
209 public bool Equals(BigNum other)
211 if (object.ReferenceEquals(other, null))
216 return this == other;
219 public override int GetHashCode()
221 return bn.GetHashCode();
224 public override bool Equals(object obj)
226 if (object.ReferenceEquals(obj, null))
231 return this == (obj as BigNum);