8[TypeForwardedFrom(
"System.Numerics, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089")]
54 int num = _bits.Length - 1;
90 return (
_bits[0] & 1) == 0;
92 return (
_sign & 1) == 0;
100 if (
value ==
int.MinValue)
109 [CLSCompliant(
false)]
112 if (
value <=
int.MaxValue)
127 if (
int.MinValue <
value &&
value <=
int.MaxValue)
133 if (
value ==
int.MinValue)
141 num = (ulong)(-
value);
149 if (num <= uint.MaxValue)
152 _bits[0] = (uint)num;
157 _bits[0] = (uint)num;
158 _bits[1] = (uint)(num >> 32);
162 [CLSCompliant(
false)]
165 if (
value <=
int.MaxValue)
170 else if (
value <= uint.MaxValue)
186 : this((double)
value)
192 if (!
double.IsFinite(
value))
194 if (
double.IsInfinity(
value))
233 int num = (exp - 1) / 32 + 1;
234 int num2 = num * 32 - exp;
235 _bits =
new uint[num + 2];
236 _bits[num + 1] = (uint)(man >> num2 + 32);
237 _bits[num] = (uint)(man >> num2);
240 _bits[num - 1] = (uint)((
int)man << 32 - num2);
269 _bits =
new uint[num];
282 [CLSCompliant(
false)]
290 int num =
value.Length;
294 byte b = (isBigEndian ?
value[0] :
value[num - 1]);
295 flag = (b & 0x80u) != 0 && !isUnsigned;
301 for (i = 1; i < num &&
value[i] == 0; i++)
310 while (num >= 0 &&
value[num] == 0)
330 _sign = (flag ? (-1) : 0);
333 for (
int j = 0; j < num; j++)
340 for (
int num2 = num - 1; num2 >= 0; num2--)
346 if (
_sign < 0 && !flag)
351 if (
_sign ==
int.MinValue)
358 int num4 = num / 4 + ((num3 != 0) ? 1 : 0);
359 uint[]
array =
new uint[num4];
365 for (k = 0; k < num4 - ((num3 != 0) ? 1 : 0); k++)
367 for (
int l = 0; l < 4; l++)
369 byte b2 =
value[num6];
379 for (k = 0; k < num4 - ((num3 != 0) ? 1 : 0); k++)
381 for (
int m = 0; m < 4; m++)
383 byte b3 =
value[num6];
394 array[num4 - 1] = uint.MaxValue;
398 for (
int num6 = 0; num6 < num3; num6++)
400 byte b4 =
value[num6];
406 for (
int num6 = num5; num6 >= num - num3; num6--)
408 byte b5 =
value[num6];
416 int num7 = array.Length - 1;
417 while (num7 >= 0 &&
array[num7] == 0)
433 if ((
int)
array[0] > 0)
440 if (num7 !=
array.Length)
443 _bits =
new uint[num7];
469 int num = value.Length - 1;
470 while (num > 0 &&
value[num - 1] == 0)
481 else if (
value.Length == 1 &&
value[0] < 2147483648u)
485 if (
_sign ==
int.MinValue)
492 _sign = ((!negative) ? 1 : (-1));
503 int num =
value.Length;
504 bool flag = num > 0 && (
value[num - 1] & 0x80000000u) == 2147483648u;
505 while (num > 0 &&
value[num - 1] == 0)
515 if ((
int)
value[0] < 0 && !flag)
521 else if (
int.MinValue == (
int)
value[0])
534 if (num !=
value.Length)
537 _bits =
new uint[num];
548 int num2 =
value.Length;
549 while (num2 > 0 &&
value[num2 - 1] == 0)
553 if (num2 == 1 && (
int)
value[0] > 0)
560 if (
value[0] == 2147483648u)
568 else if (num2 !=
value.Length)
571 _bits =
new uint[num2];
657 return dividend / divisor;
662 return dividend % divisor;
667 bool flag = dividend._bits ==
null;
668 bool flag2 = divisor._bits ==
null;
675 remainder = bigInteger2;
680 remainder = dividend;
687 remainder = ((dividend._sign < 0) ? (-1 * remainder2) : remainder2);
690 if (dividend.
_bits.Length < divisor.
_bits.Length)
692 remainder = dividend;
697 remainder =
new BigInteger(remainder3, remainder3, dividend.
_sign < 0);
713 if (
value._sign < 0 || baseValue == 1.0)
717 if (baseValue ==
double.PositiveInfinity)
725 if (baseValue == 0.0 && !
value.IsOne)
729 if (
value._bits ==
null)
733 ulong num =
value._bits[value._bits.Length - 1];
734 ulong num2 = ((value._bits.Length > 1) ?
value._bits[
value._bits.Length - 2] : 0u);
735 ulong num3 = ((value._bits.Length > 2) ?
value._bits[
value._bits.Length - 3] : 0u);
737 long num5 = (long)
value._bits.Length * 32
L - num4;
738 ulong num6 = (num << 32 + num4) | (num2 << num4) | (num3 >> 32 - num4);
739 return Math.
Log(num6, baseValue) + (double)(num5 - 64) /
Math.
Log(baseValue, 2.0);
749 bool flag = left._bits ==
null;
750 bool flag2 = right._bits ==
null;
765 if (right.
_sign == 0)
780 if (rightBits.Length == 1)
785 if (rightBits.Length == 2)
788 ulong left = ((ulong)rightBits[1] << 32) | rightBits[0];
789 ulong right2 = ((ulong)
array[1] << 32) |
array[0];
793 return new BigInteger(array2, array2, negative:
false);
816 if (exponent.
Sign < 0)
820 bool flag = value._bits ==
null;
821 bool flag2 = exponent._bits ==
null;
822 if (modulus.
_bits ==
null)
825 return (
value._sign < 0 && !exponent.
IsEven) ? (-1 * num) : num;
845 bool flag = value._bits ==
null;
848 if (
value._sign == 1)
852 if (
value._sign == -1)
854 if ((exponent & 1) == 0)
860 if (
value._sign == 0)
878 int num2 =
_bits.Length;
886 public override bool Equals([NotNullWhen(
true)]
object?
obj)
909 return _bits[0] == num2;
914 [CLSCompliant(
false)]
925 int num =
_bits.Length;
951 int num =
_bits.Length;
952 if (num !=
other._bits.Length)
957 return diffLength == 0;
976 [CLSCompliant(
false)]
987 int num =
_bits.Length;
1007 if (
other._bits ==
null)
1019 return -
other._sign;
1023 if (
other._bits ==
null || (num =
_bits.Length) > (num2 =
other._bits.Length))
1032 if (diffLength == 0)
1036 if (
_bits[diffLength - 1] >=
other._bits[diffLength - 1])
1058 return ToByteArray(isUnsigned:
false, isBigEndian:
false);
1061 public byte[]
ToByteArray(
bool isUnsigned =
false,
bool isBigEndian =
false)
1063 int bytesWritten = 0;
1086 int bytesWritten = 0;
1088 return bytesWritten;
1113 if (isUnsigned && sign < 0)
1118 uint[] bits =
_bits;
1123 b = (byte)((sign < 0) ? 255u : 0u);
1126 else if (sign == -1)
1129 for (; bits[i] == 0; i++)
1133 if (bits.Length - 1 == i)
1145 if ((b2 = (
byte)(num >> 24)) != b)
1149 else if ((b2 = (
byte)(num >> 16)) != b)
1153 else if ((b2 = (
byte)(num >> 8)) != b)
1162 bool flag = (b2 & 0x80) != (b & 0x80) && !isUnsigned;
1163 int num3 = num2 + 1 + (flag ? 1 : 0);
1166 num3 = checked(4 * (bits.Length - 1) + num3);
1175 bytesWritten = num3;
1178 bytesWritten = num3;
1186 int num4 = (isBigEndian ? (num3 - 1) : 0);
1187 int num5 = ((!isBigEndian) ? 1 : (-1));
1190 for (
int j = 0; j < bits.Length - 1; j++)
1192 uint num6 = bits[j];
1240 return scratch.
Slice(0, 1);
1247 span[0] = (uint)
_sign;
1248 span = span.
Slice(0, 1);
1249 num = ((
_sign < 0) ? uint.MaxValue : 0u);
1251 else if (
_sign == -1)
1255 _bits.AsSpan().CopyTo(span);
1260 span = (uint[])
_bits.Clone();
1263 num = uint.MaxValue;
1271 int num2 = span.Length - 1;
1272 while (num2 > 0 && span[num2] == num)
1276 bool flag2 = (span[num2] & 0x80000000u) != (num & 0x80000000u);
1277 int num3 = num2 + 1 + (flag2 ? 1 : 0);
1279 if (num3 <= scratch.
Length)
1281 scratch = scratch.
Slice(0, num3);
1286 scratch =
new uint[num3];
1290 span.
Slice(0, num2 + 1).CopyTo(scratch);
1324 private static BigInteger Add(uint[] leftBits,
int leftSign, uint[] rightBits,
int rightSign)
1326 bool flag = leftBits ==
null;
1327 bool flag2 = rightBits ==
null;
1330 return (
long)leftSign + (long)rightSign;
1340 return new BigInteger(array2, array2, leftSign < 0);
1342 if (leftBits.Length < rightBits.Length)
1345 return new BigInteger(array3, array3, leftSign < 0);
1348 return new BigInteger(array4, array4, leftSign < 0);
1362 bool flag = leftBits ==
null;
1363 bool flag2 = rightBits ==
null;
1366 return (
long)leftSign - (long)rightSign;
1376 return new BigInteger(array2, array2, leftSign < 0);
1381 return new BigInteger(array3, array3, leftSign >= 0);
1384 return new BigInteger(array4, array4, leftSign < 0);
1392 [CLSCompliant(
false)]
1403 [CLSCompliant(
false)]
1414 [CLSCompliant(
false)]
1425 [CLSCompliant(
false)]
1448 return checked((
byte)(
int)
value);
1451 [CLSCompliant(
false)]
1454 return checked((sbyte)(
int)
value);
1459 return checked((
short)(
int)
value);
1462 [CLSCompliant(
false)]
1465 return checked((ushort)(
int)
value);
1470 if (
value._bits ==
null)
1474 if (
value._bits.Length > 1)
1478 if (
value._sign > 0)
1480 return checked((
int)
value._bits[0]);
1482 if (
value._bits[0] > 2147483648u)
1486 return (
int)(0 -
value._bits[0]);
1489 [CLSCompliant(
false)]
1492 if (
value._bits ==
null)
1494 return checked((uint)
value._sign);
1496 if (
value._bits.Length > 1 ||
value._sign < 0)
1500 return value._bits[0];
1505 if (
value._bits ==
null)
1509 int num =
value._bits.Length;
1515 long num3 = (long)((
value._sign > 0) ? num2 : (0
L - num2));
1516 if ((num3 > 0 &&
value._sign > 0) || (num3 < 0 && value._sign < 0))
1523 [CLSCompliant(
false)]
1526 if (
value._bits ==
null)
1528 return checked((ulong)
value._sign);
1530 int num =
value._bits.Length;
1531 if (num > 2 ||
value._sign < 0)
1539 return value._bits[0];
1544 return (
float)(double)
value;
1549 int sign =
value._sign;
1550 uint[] bits =
value._bits;
1555 int num = bits.Length;
1560 return double.PositiveInfinity;
1562 return double.NegativeInfinity;
1564 ulong num2 = bits[num - 1];
1565 ulong num3 = ((num > 1) ? bits[num - 2] : 0u);
1566 ulong num4 = ((num > 2) ? bits[num - 3] : 0u);
1568 int exp = (num - 2) * 32 - num5;
1569 ulong man = (num2 << 32 + num5) | (num3 << num5) | (num4 >> 32 - num5);
1575 if (
value._bits ==
null)
1579 int num =
value._bits.Length;
1589 hi = (int)
value._bits[2];
1593 mid = (int)
value._bits[1];
1597 lo = (int)
value._bits[0];
1599 return new decimal(lo, mid, hi,
value._sign < 0, 0);
1608 if (left.
_bits ==
null && right.
_bits ==
null)
1610 return left._sign & right.
_sign;
1614 scratch = stackalloc uint[32];
1617 uint num = ((left._sign < 0) ? uint.MaxValue : 0u);
1618 uint num2 = ((right._sign < 0) ? uint.MaxValue : 0u);
1619 for (
int i = 0; i <
array.Length; i++)
1621 uint num3 = ((i < readOnlySpan.
Length) ? readOnlySpan[i] : num);
1622 uint num4 = ((i < readOnlySpan2.
Length) ? readOnlySpan2[i] : num2);
1623 array[i] = num3 & num4;
1638 if (left.
_bits ==
null && right.
_bits ==
null)
1640 return left._sign | right.
_sign;
1644 scratch = stackalloc uint[32];
1647 uint num = ((left._sign < 0) ? uint.MaxValue : 0u);
1648 uint num2 = ((right._sign < 0) ? uint.MaxValue : 0u);
1649 for (
int i = 0; i <
array.Length; i++)
1651 uint num3 = ((i < readOnlySpan.
Length) ? readOnlySpan[i] : num);
1652 uint num4 = ((i < readOnlySpan2.
Length) ? readOnlySpan2[i] : num2);
1653 array[i] = num3 | num4;
1660 if (left.
_bits ==
null && right.
_bits ==
null)
1662 return left._sign ^ right.
_sign;
1666 scratch = stackalloc uint[32];
1669 uint num = ((left._sign < 0) ? uint.MaxValue : 0u);
1670 uint num2 = ((right._sign < 0) ? uint.MaxValue : 0u);
1671 for (
int i = 0; i <
array.Length; i++)
1673 uint num3 = ((i < readOnlySpan.
Length) ? readOnlySpan[i] : num);
1674 uint num4 = ((i < readOnlySpan2.
Length) ? readOnlySpan2[i] : num2);
1675 array[i] = num3 ^ num4;
1686 if (shift ==
int.MinValue)
1688 return value >> int.MaxValue >> 1;
1692 return value >> -shift;
1695 int item = tuple.Quotient;
1696 int item2 = tuple.Remainder;
1700 int num = xd.Length +
item + 1;
1701 uint[] valueArray =
null;
1705 span = stackalloc uint[64];
1706 span2 = span.
Slice(0, num);
1712 span2 = (valueArray =
new uint[num]);
1717 for (
int i = 0; i < xd.
Length; i++)
1719 span2[i +
item] = xd[i];
1724 int num3 = 32 - item2;
1725 for (
int j = 0; j < xd.
Length; j++)
1728 span2[j +
item] = (num4 << item2) | num2;
1729 num2 = num4 >> num3;
1733 return new BigInteger(span2, valueArray, partsForBitManipulation);
1742 if (shift ==
int.MinValue)
1744 return value << int.MaxValue << 1;
1748 return value << -shift;
1751 int item = tuple.Quotient;
1752 int item2 = tuple.Remainder;
1758 if (partsForBitManipulation)
1760 if (shift >= 32 * xd.
Length)
1768 span = stackalloc uint[64];
1779 flag = item2 == 0 && xd[^1] == 0;
1781 int num = xd.Length -
item + (flag ? 1 : 0);
1782 uint[] valueArray =
null;
1789 span = stackalloc uint[64];
1790 span4 = span.
Slice(0, num);
1794 span4 = (valueArray =
new uint[num]);
1800 for (
int num2 = xd.
Length - 1; num2 >=
item; num2--)
1802 span3[num2 -
item] = xd[num2];
1807 int num3 = 32 - item2;
1809 for (
int num5 = xd.
Length - 1; num5 >=
item; num5--)
1811 uint num6 = xd[num5];
1812 if (partsForBitManipulation && num5 == xd.
Length - 1)
1814 span3[num5 -
item] = (num6 >> item2) | (uint)(-1 << num3);
1818 span3[num5 -
item] = (num6 >> item2) | num4;
1820 num4 = num6 << num3;
1823 if (partsForBitManipulation)
1827 span3[^1] = uint.MaxValue;
1831 return new BigInteger(span3, valueArray, partsForBitManipulation);
1870 bool flag = left._bits ==
null;
1871 bool flag2 = right._bits ==
null;
1874 return (
long)left._sign * (long)right.
_sign;
1902 bool flag = dividend._bits ==
null;
1903 bool flag2 = divisor._bits ==
null;
1906 return dividend._sign / divisor.
_sign;
1917 if (dividend.
_bits.Length < divisor.
_bits.Length)
1927 bool flag = dividend._bits ==
null;
1928 bool flag2 = divisor._bits ==
null;
1931 return dividend._sign % divisor.
_sign;
1940 return (dividend.
_sign < 0) ? (-1 * num) : num;
1942 if (dividend.
_bits.Length < divisor.
_bits.Length)
1972 return left.
Equals(right);
1977 return !left.
Equals(right);
2002 return left.
Equals(right);
2007 return !left.
Equals(right);
2032 return right.
Equals(left);
2037 return !right.
Equals(left);
2040 [CLSCompliant(
false)]
2046 [CLSCompliant(
false)]
2052 [CLSCompliant(
false)]
2058 [CLSCompliant(
false)]
2064 [CLSCompliant(
false)]
2067 return left.
Equals(right);
2070 [CLSCompliant(
false)]
2073 return !left.
Equals(right);
2076 [CLSCompliant(
false)]
2082 [CLSCompliant(
false)]
2088 [CLSCompliant(
false)]
2094 [CLSCompliant(
false)]
2100 [CLSCompliant(
false)]
2103 return right.
Equals(left);
2106 [CLSCompliant(
false)]
2109 return !right.
Equals(left);
2115 uint[] bits =
_bits;
2121 num2 = (uint)((sign < 0) ? (-sign) : sign);
2126 num2 = bits[num - 1];
2133 if ((num2 & (num2 - 1)) != 0)
2137 for (
int num4 = num - 2; num4 >= 0; num4--)
2139 if (bits[num4] != 0)
2149 if (x._bits ==
null)
2151 xd[0] = (uint)((x._sign < 0) ? (-x._sign) : x._sign);
2165 if (rgu1[num] != rgu2[num])
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
static double Log(double d)
static int DivRem(int a, int b, out int result)
static byte Max(byte val1, byte val2)
static uint[] Divide(uint[] left, uint right, out uint remainder)
static uint Gcd(uint left, uint right)
static uint[] Pow(uint value, uint power)
static uint[] Add(uint[] left, uint right)
static uint[] Multiply(uint[] left, uint right)
static uint[] Subtract(uint[] left, uint right)
static uint Remainder(uint[] left, uint right)
static unsafe uint[] Square(uint[] value)
static int Compare(uint[] left, uint[] right)
static bool TryParseBigInteger(string value, NumberStyles style, NumberFormatInfo info, out BigInteger result)
static BigInteger ParseBigInteger(string value, NumberStyles style, NumberFormatInfo info)
static string FormatBigInteger(BigInteger value, string format, NumberFormatInfo info)
static bool TryFormatBigInteger(BigInteger value, ReadOnlySpan< char > format, NumberFormatInfo info, Span< char > destination, out int charsWritten)
static int LeadingZeroCount(uint value)
static int CbitHighZero(uint u)
static uint CombineHash(uint u1, uint u2)
static double GetDoubleFromParts(int sign, int exp, ulong man)
static void GetDoubleParts(double dbl, out int sign, out int exp, out ulong man, out bool fFinite)
static ulong MakeUlong(uint uHi, uint uLo)
static void DangerousMakeTwosComplement(Span< uint > d)
static string Overflow_NotANumber
static string Overflow_Int32
static string Overflow_UInt64
static string Overflow_BigIntInfinity
static string ArgumentOutOfRange_MustBeNonNeg
static string Overflow_Int64
static string Overflow_Negative_Unsigned
static string Argument_MustBeBigInt
static string Overflow_Decimal
static string Overflow_UInt32
int CompareTo(ulong other)
static bool TryParse(ReadOnlySpan< char > value, out BigInteger result)
bool TryWriteOrCountBytes(Span< byte > destination, out int bytesWritten, bool isUnsigned=false, bool isBigEndian=false)
static BigInteger operator/(BigInteger dividend, BigInteger divisor)
static bool operator<(BigInteger left, BigInteger right)
static BigInteger ModPow(BigInteger value, BigInteger exponent, BigInteger modulus)
bool TryFormat(Span< char > destination, out int charsWritten, ReadOnlySpan< char > format=default(ReadOnlySpan< char >), IFormatProvider? provider=null)
static BigInteger Divide(BigInteger dividend, BigInteger divisor)
static BigInteger operator|(BigInteger left, BigInteger right)
static BigInteger Subtract(BigInteger left, BigInteger right)
static bool operator!=(BigInteger left, BigInteger right)
static BigInteger operator*(BigInteger left, BigInteger right)
byte[] TryGetBytes(GetBytesMode mode, Span< byte > destination, bool isUnsigned, bool isBigEndian, ref int bytesWritten)
static readonly BigInteger s_bnMinusOneInt
static BigInteger Parse(string value)
static BigInteger DivRem(BigInteger dividend, BigInteger divisor, out BigInteger remainder)
static readonly BigInteger s_bnOneInt
static bool operator<=(BigInteger left, BigInteger right)
int CompareTo(object? obj)
int CompareTo(BigInteger other)
static BigInteger Parse(ReadOnlySpan< char > value, NumberStyles style=NumberStyles.Integer, IFormatProvider? provider=null)
byte[] ToByteArray(bool isUnsigned=false, bool isBigEndian=false)
static double Log10(BigInteger value)
static BigInteger operator<<(BigInteger value, int shift)
static BigInteger Abs(BigInteger value)
static double Log(BigInteger value, double baseValue)
int GetByteCount(bool isUnsigned=false)
static int Compare(BigInteger left, BigInteger right)
bool Equals(BigInteger other)
static readonly BigInteger s_bnZeroInt
static BigInteger GreatestCommonDivisor(uint[] leftBits, uint[] rightBits)
static BigInteger Pow(BigInteger value, int exponent)
static bool GetPartsForBitManipulation(ref BigInteger x, ref Span< uint > xd)
override int GetHashCode()
static bool operator>(BigInteger left, BigInteger right)
override string ToString()
static double Log(BigInteger value)
static bool operator==(BigInteger left, BigInteger right)
static BigInteger operator~(BigInteger value)
static BigInteger operator+(BigInteger value)
static readonly BigInteger s_bnMinInt
static BigInteger operator--(BigInteger value)
static BigInteger Multiply(BigInteger left, BigInteger right)
static bool TryParse([NotNullWhen(true)] string? value, NumberStyles style, IFormatProvider? provider, out BigInteger result)
static BigInteger GreatestCommonDivisor(BigInteger left, BigInteger right)
BigInteger(decimal value)
static BigInteger operator++(BigInteger value)
string ToString(string? format)
static BigInteger operator%(BigInteger dividend, BigInteger divisor)
override bool Equals([NotNullWhen(true)] object? obj)
static bool operator>=(BigInteger left, BigInteger right)
static BigInteger Parse(string value, NumberStyles style)
static BigInteger operator^(BigInteger left, BigInteger right)
string ToString(IFormatProvider? provider)
BigInteger(ReadOnlySpan< byte > value, bool isUnsigned=false, bool isBigEndian=false)
static readonly byte[] s_success
static bool TryParse(ReadOnlySpan< char > value, NumberStyles style, IFormatProvider? provider, out BigInteger result)
static BigInteger Parse(string value, NumberStyles style, IFormatProvider? provider)
static BigInteger MinusOne
static BigInteger Negate(BigInteger value)
string ToString(string? format, IFormatProvider? provider)
static BigInteger Add(BigInteger left, BigInteger right)
static BigInteger operator>>(BigInteger value, int shift)
static BigInteger Add(uint[] leftBits, int leftSign, uint[] rightBits, int rightSign)
static bool TryParse([NotNullWhen(true)] string? value, out BigInteger result)
static BigInteger Parse(string value, IFormatProvider? provider)
BigInteger(int n, uint[] rgu)
static BigInteger operator&(BigInteger left, BigInteger right)
static BigInteger Remainder(BigInteger dividend, BigInteger divisor)
BigInteger(ReadOnlySpan< uint > value, uint[] valueArray, bool negative)
ReadOnlySpan< uint > ToUInt32Span(Span< uint > scratch)
static BigInteger Min(BigInteger left, BigInteger right)
static BigInteger Subtract(uint[] leftBits, int leftSign, uint[] rightBits, int rightSign)
static int GetDiffLength(uint[] rgu1, uint[] rgu2, int cu)
int CompareTo(long other)
static BigInteger operator-(BigInteger left, BigInteger right)
bool TryWriteBytes(Span< byte > destination, out int bytesWritten, bool isUnsigned=false, bool isBigEndian=false)
static BigInteger Max(BigInteger left, BigInteger right)
void CopyTo(Span< T > destination)
Span< T > Slice(int start)