using System;
using System.Diagnostics.Contracts;
+using System.Linq;
namespace Novacoin
{
return a;
}
+ public static uint160 operator /(uint160 a, uint divisor)
+ {
+ var result = new uint160();
+
+ ulong r = 0;
+ int i = a.nWidth;
+
+ while (i-- > 0)
+ {
+ r <<= 32;
+ r |= a.pn[i];
+ result.pn[i] = (uint)(r / divisor);
+ r %= divisor;
+ }
+
+ return result;
+ }
+
+ public static uint160 operator *(uint160 a, uint multiplier)
+ {
+ var result = new uint160();
+
+ ulong c = 0;
+ uint i = 0;
+
+ do
+ {
+ c += a.pn[i] * (ulong)multiplier;
+ result.pn[i] = (uint)c;
+ c >>= 32;
+ } while (++i < result.nWidth);
+
+ return result;
+ }
+
+ public static uint operator %(uint160 a, uint divisor)
+ {
+ ulong r = 0;
+ int i = a.nWidth;
+
+ while (i-- > 0)
+ {
+ r <<= 32;
+ r |= a.pn[i];
+ r %= divisor;
+ }
+
+ return (uint)r;
+ }
+
+ public static uint160 operator /(uint160 a, uint160 b)
+ {
+ if (b.bits <= 32)
+ {
+ return a / b.Low32;
+ }
+
+ uint160 result = new uint160();
+
+ uint[] quotient;
+ uint[] remainder_value;
+
+ int m = a.bits / 32 + (a.bits % 32 != 0 ? 1 : 0);
+ int n = b.bits / 32 + (b.bits % 32 != 0 ? 1 : 0);
+
+ BignumHelper.DivModUnsigned(a.pn.Take(m).ToArray(), b.pn.Take(n).ToArray(), out quotient, out remainder_value);
+
+ quotient.CopyTo(result.pn, 0);
+
+ return result;
+ }
+
+ public static uint160 operator %(uint160 a, uint160 b)
+ {
+ if (b.bits <= 32)
+ {
+ return a % b.Low32;
+ }
+
+ uint160 result = new uint160();
+
+ uint[] quotient;
+ uint[] remainder_value;
+
+ int m = a.bits / 32 + (a.bits % 32 != 0 ? 1 : 0);
+ int n = b.bits / 32 + (b.bits % 32 != 0 ? 1 : 0);
+
+ BignumHelper.DivModUnsigned(a.pn.Take(m).ToArray(), b.pn.Take(n).ToArray(), out quotient, out remainder_value);
+
+ remainder_value.CopyTo(result.pn, 0);
+
+ return result;
+
+ }
+
#endregion
#region Shift