13 _bits =
new uint[size];
20 _bits =
new uint[size];
27 fixed (uint* ptr2 =
_bits)
29 fixed (uint* ptr =
value._bits)
31 fixed (uint* bits = temp._bits)
51 fixed (uint* bits = temp._bits)
64 public unsafe
void Reduce(uint[] modulus)
70 fixed (uint* left =
_bits)
72 fixed (uint* right = modulus)
86 fixed (uint* left =
_bits)
88 fixed (uint* right = modulus._bits)
102 uint num = (uint)
value;
103 uint num2 = (uint)(
value >> 32);
106 _length = ((num2 != 0) ? 2 : ((num != 0) ? 1 : 0));
146 uint[] bits = temp._bits;
157 private readonly uint[]
_mu;
159 private readonly uint[]
_q1;
161 private readonly uint[]
_q2;
167 uint[]
array =
new uint[modulus.Length * 2 + 1];
171 _q1 =
new uint[modulus.Length * 2 + 2];
172 _q2 =
new uint[modulus.Length * 2 + 1];
187 private unsafe
static int DivMul(uint[] left,
int leftLength, uint[] right,
int rightLength, uint[] bits,
int k)
193 fixed (uint* ptr2 = left)
195 fixed (uint* ptr = right)
197 fixed (uint* bits2 = bits)
199 if (leftLength < rightLength)
201 Multiply(ptr, rightLength, ptr2 + k, leftLength, bits2, leftLength + rightLength);
205 Multiply(ptr2 + k, leftLength, ptr, rightLength, bits2, leftLength + rightLength);
215 private unsafe
static int SubMod(uint[] left,
int leftLength, uint[] right,
int rightLength, uint[] modulus,
int k)
225 fixed (uint* left2 = left)
227 fixed (uint* right2 = right)
229 fixed (uint* right3 = modulus)
233 while (
Compare(left2, leftLength, right3, modulus.Length) >= 0)
235 SubtractSelf(left2, leftLength, right3, modulus.Length);
241 Array.
Clear(left, leftLength, left.Length - leftLength);
254 public static uint[]
Add(uint[] left, uint right)
256 uint[]
array =
new uint[left.Length + 1];
257 long num = (long)left[0] + (
long)right;
258 array[0] = (uint)num;
259 long num2 = num >> 32;
260 for (
int i = 1; i < left.Length; i++)
262 num = left[i] + num2;
263 array[i] = (uint)num;
266 array[left.Length] = (uint)num2;
270 public unsafe
static uint[]
Add(uint[] left, uint[] right)
272 uint[]
array =
new uint[left.Length + 1];
273 fixed (uint* left2 = left)
275 fixed (uint* right2 = right)
277 fixed (uint* bits = &
array[0])
279 Add(left2, left.Length, right2, right.Length, bits,
array.Length);
286 private unsafe
static void Add(uint* left,
int leftLength, uint* right,
int rightLength, uint* bits,
int bitsLength)
290 for (; i < rightLength; i++)
292 long num2 = left[i] + num + right[i];
293 bits[i] = (uint)num2;
296 for (; i < leftLength; i++)
298 long num3 = left[i] + num;
299 bits[i] = (uint)num3;
305 private unsafe
static void AddSelf(uint* left,
int leftLength, uint* right,
int rightLength)
309 for (; i < rightLength; i++)
311 long num2 = left[i] + num + right[i];
312 left[i] = (uint)num2;
315 while (num != 0
L && i < leftLength)
317 long num3 = left[i] + num;
318 left[i] = (uint)num3;
324 public static uint[]
Subtract(uint[] left, uint right)
326 uint[]
array =
new uint[left.Length];
327 long num = (long)left[0] - (
long)right;
328 array[0] = (uint)num;
329 long num2 = num >> 32;
330 for (
int i = 1; i < left.Length; i++)
332 num = left[i] + num2;
333 array[i] = (uint)num;
339 public unsafe
static uint[]
Subtract(uint[] left, uint[] right)
341 uint[]
array =
new uint[left.Length];
342 fixed (uint* left2 = left)
344 fixed (uint* right2 = right)
346 fixed (uint* bits =
array)
348 Subtract(left2, left.Length, right2, right.Length, bits,
array.Length);
355 private unsafe
static void Subtract(uint* left,
int leftLength, uint* right,
int rightLength, uint* bits,
int bitsLength)
359 for (; i < rightLength; i++)
361 long num2 = left[i] + num - right[i];
362 bits[i] = (uint)num2;
365 for (; i < leftLength; i++)
367 long num3 = left[i] + num;
368 bits[i] = (uint)num3;
373 private unsafe
static void SubtractSelf(uint* left,
int leftLength, uint* right,
int rightLength)
377 for (; i < rightLength; i++)
379 long num2 = left[i] + num - right[i];
380 left[i] = (uint)num2;
383 while (num != 0
L && i < leftLength)
385 long num3 = left[i] + num;
386 left[i] = (uint)num3;
392 public static int Compare(uint[] left, uint[] right)
394 if (left.Length < right.Length)
398 if (left.Length > right.Length)
402 for (
int num = left.Length - 1; num >= 0; num--)
404 if (left[num] < right[num])
408 if (left[num] > right[num])
416 private unsafe
static int Compare(uint* left,
int leftLength, uint* right,
int rightLength)
418 if (leftLength < rightLength)
422 if (leftLength > rightLength)
426 for (
int num = leftLength - 1; num >= 0; num--)
428 if (left[num] < right[num])
432 if (left[num] > right[num])
440 public static uint[]
Divide(uint[] left, uint right, out uint remainder)
442 uint[]
array =
new uint[left.Length];
444 for (
int num2 = left.Length - 1; num2 >= 0; num2--)
446 ulong num3 = (num << 32) | left[num2];
447 ulong num4 = num3 / right;
448 array[num2] = (uint)num4;
449 num = num3 - num4 * right;
451 remainder = (uint)num;
455 public static uint[]
Divide(uint[] left, uint right)
457 uint[]
array =
new uint[left.Length];
459 for (
int num2 = left.Length - 1; num2 >= 0; num2--)
461 ulong num3 = (num << 32) | left[num2];
462 ulong num4 = num3 / right;
463 array[num2] = (uint)num4;
464 num = num3 - num4 * right;
472 for (
int num2 = left.Length - 1; num2 >= 0; num2--)
474 ulong num3 = (num << 32) | left[num2];
480 public unsafe
static uint[]
Divide(uint[] left, uint[] right, out uint[] remainder)
482 uint[]
array = left.AsSpan().ToArray();
483 uint[] array2 =
new uint[left.Length - right.Length + 1];
484 fixed (uint* left2 = &
array[0])
486 fixed (uint* right2 = &right[0])
488 fixed (uint* bits = &array2[0])
490 Divide(left2,
array.Length, right2, right.Length, bits, array2.Length);
498 public unsafe
static uint[]
Divide(uint[] left, uint[] right)
502 if (left.Length <= 64)
504 span = stackalloc uint[64];
506 span = left.AsSpan();
511 span = left.AsSpan();
514 uint[]
array =
new uint[left.Length - right.Length + 1];
517 fixed (uint* right2 = &right[0])
519 fixed (uint* bits = &
array[0])
528 public unsafe
static uint[]
Remainder(uint[] left, uint[] right)
530 uint[]
array = left.AsSpan().ToArray();
531 fixed (uint* left2 = &
array[0])
533 fixed (uint* right2 = &right[0])
535 Divide(left2,
array.Length, right2, right.Length,
null, 0);
541 private unsafe
static void Divide(uint* left,
int leftLength, uint* right,
int rightLength, uint* bits,
int bitsLength)
543 uint num = right[rightLength - 1];
544 uint num2 = ((rightLength > 1) ? right[rightLength - 2] : 0u);
546 int num4 = 32 - num3;
549 uint num5 = ((rightLength > 2) ? right[rightLength - 3] : 0u);
550 num = (num << num3) | (num2 >> num4);
551 num2 = (num2 << num3) | (num5 >> num4);
553 for (
int num6 = leftLength; num6 >= rightLength; num6--)
555 int num7 = num6 - rightLength;
556 uint num8 = ((num6 < leftLength) ? left[num6] : 0u);
557 ulong num9 = ((ulong)num8 << 32) | left[num6 - 1];
558 uint num10 = ((num6 > 1) ? left[num6 - 2] : 0u);
561 uint num11 = ((num6 > 2) ? left[num6 - 3] : 0u);
562 num9 = (num9 << num3) | (num10 >> num4);
563 num10 = (num10 << num3) | (num11 >> num4);
565 ulong num12 = num9 / num;
566 if (num12 > uint.MaxValue)
568 num12 = 4294967295uL;
576 uint num13 =
SubtractDivisor(left + num7, leftLength - num7, right, rightLength, num12);
579 num13 =
AddDivisor(left + num7, leftLength - num7, right, rightLength);
585 bits[num7] = (uint)num12;
587 if (num6 < leftLength)
594 private unsafe
static uint
AddDivisor(uint* left,
int leftLength, uint* right,
int rightLength)
597 for (
int i = 0; i < rightLength; i++)
599 ulong num2 = left[i] + num + right[i];
600 left[i] = (uint)num2;
606 private unsafe
static uint
SubtractDivisor(uint* left,
int leftLength, uint* right,
int rightLength, ulong q)
609 for (
int i = 0; i < rightLength; i++)
612 uint num2 = (uint)num;
625 ulong num = divHi * q;
626 ulong num2 = divLo * q;
655 if ((
value & 0xFFFF0000u) == 0)
660 if ((
value & 0xFF000000u) == 0)
665 if ((
value & 0xF0000000u) == 0)
670 if ((
value & 0xC0000000u) == 0)
675 if ((
value & 0x80000000u) == 0)
682 public static uint
Gcd(uint left, uint right)
686 uint num = left % right;
693 public static ulong
Gcd(ulong left, ulong right)
695 while (right > uint.MaxValue)
697 ulong num = left % right;
703 return Gcd((uint)right, (uint)(left % right));
708 public static uint
Gcd(uint[] left, uint right)
711 return Gcd(right, right2);
714 public static uint[]
Gcd(uint[] left, uint[] right)
718 Gcd(ref left2, ref right2);
724 while (right.GetLength() > 2)
735 if (num6 > uint.MaxValue)
739 ulong num7 = num + num6 * num3;
740 ulong num8 = num2 + num6 * num4;
741 ulong num9 = x - num6 * y;
742 if (num7 >
int.MaxValue || num8 >
int.MaxValue || num9 < num8 || num9 + num7 > y - num3)
755 if (num6 > uint.MaxValue)
759 num7 = num4 + num6 * num2;
760 num8 = num3 + num6 * num;
762 if (num7 >
int.MaxValue || num8 >
int.MaxValue || num9 < num8 || num9 + num7 > x - num2)
777 left.Reduce(ref right);
783 LehmerCore(ref left, ref right, num, num2, num3, num4);
791 if (right.GetLength() > 0)
794 uint[] bits = right.GetBits();
795 uint[] bits2 = left.GetBits();
796 ulong left2 = ((ulong)bits[1] << 32) | bits[0];
797 ulong right2 = ((ulong)bits2[1] << 32) | bits2[0];
798 left.Overwrite(
Gcd(left2, right2));
805 uint[] bits = xBuffer.GetBits();
806 int length = xBuffer.GetLength();
807 uint[] bits2 = yBuffer.GetBits();
808 int length2 = yBuffer.GetLength();
809 ulong num = bits[
length - 1];
810 ulong num2 = bits[
length - 2];
811 ulong num3 = bits[
length - 3];
839 x = ((num << 32 + num7) | (num2 << num7) | (num3 >> 32 - num7)) >> 1;
840 y = ((num4 << 32 + num7) | (num5 << num7) | (num6 >> 32 - num7)) >> 1;
845 uint[] bits = xBuffer.GetBits();
846 uint[] bits2 = yBuffer.GetBits();
847 int length = yBuffer.GetLength();
850 for (
int i = 0; i <
length; i++)
852 long num3 = a * bits[i] - b * bits2[i] + num;
853 long num4 = d * bits2[i] - c * bits[i] + num2;
856 bits[i] = (uint)num3;
857 bits2[i] = (uint)num4;
867 return PowCore(power, ref value2);
874 return PowCore(power, ref value2);
879 int size =
value.GetSize();
886 private static int PowBound(uint power,
int valueLength,
int resultLength)
892 if ((power & 1) == 1)
894 resultLength += valueLength;
898 valueLength += valueLength;
910 if ((power & 1) == 1)
912 result.MultiplySelf(ref
value, ref temp);
916 value.SquareSelf(ref temp);
922 public static uint
Pow(uint
value, uint power, uint modulus)
927 public static uint
Pow(uint[]
value, uint power, uint modulus)
930 return PowCore(power, modulus, num, 1uL);
933 public static uint
Pow(uint
value, uint[] power, uint modulus)
938 public static uint
Pow(uint[]
value, uint[] power, uint modulus)
941 return PowCore(power, modulus, num, 1uL);
944 private static uint
PowCore(uint[] power, uint modulus, ulong
value, ulong result)
946 for (
int i = 0; i < power.Length - 1; i++)
949 for (
int j = 0; j < 32; j++)
953 result = result *
value % modulus;
962 private static uint
PowCore(uint power, uint modulus, ulong
value, ulong result)
966 if ((power & 1) == 1)
968 result = result *
value % modulus;
976 return (uint)(result % modulus);
979 public static uint[]
Pow(uint
value, uint power, uint[] modulus)
981 int size = modulus.Length + modulus.Length;
983 return PowCore(power, modulus, ref value2);
986 public static uint[]
Pow(uint[]
value, uint power, uint[] modulus)
988 if (
value.Length > modulus.Length)
992 int size = modulus.Length + modulus.Length;
994 return PowCore(power, modulus, ref value2);
997 public static uint[]
Pow(uint
value, uint[] power, uint[] modulus)
999 int size = modulus.Length + modulus.Length;
1001 return PowCore(power, modulus, ref value2);
1004 public static uint[]
Pow(uint[]
value, uint[] power, uint[] modulus)
1006 if (
value.Length > modulus.Length)
1010 int size = modulus.Length + modulus.Length;
1012 return PowCore(power, modulus, ref value2);
1017 int size =
value.GetSize();
1022 PowCore(power, modulus, ref
value, ref result, ref temp);
1027 PowCore(power, ref reducer, ref
value, ref result, ref temp);
1034 int size =
value.GetSize();
1039 PowCore(power, modulus, ref
value, ref result, ref temp);
1044 PowCore(power, ref reducer, ref
value, ref result, ref temp);
1051 for (
int i = 0; i < power.Length - 1; i++)
1053 uint num = power[i];
1054 for (
int j = 0; j < 32; j++)
1058 result.MultiplySelf(ref
value, ref temp);
1059 result.Reduce(modulus);
1061 value.SquareSelf(ref temp);
1062 value.Reduce(modulus);
1066 PowCore(power[^1], modulus, ref
value, ref result, ref temp);
1073 if ((power & 1) == 1)
1075 result.MultiplySelf(ref
value, ref temp);
1076 result.Reduce(modulus);
1080 value.SquareSelf(ref temp);
1081 value.Reduce(modulus);
1089 for (
int i = 0; i < power.Length - 1; i++)
1091 uint num = power[i];
1092 for (
int j = 0; j < 32; j++)
1096 result.MultiplySelf(ref
value, ref temp);
1097 result.Reduce(ref reducer);
1099 value.SquareSelf(ref temp);
1100 value.Reduce(ref reducer);
1104 PowCore(power[^1], ref reducer, ref
value, ref result, ref temp);
1111 if ((power & 1) == 1)
1113 result.MultiplySelf(ref
value, ref temp);
1114 result.Reduce(ref reducer);
1118 value.SquareSelf(ref temp);
1119 value.Reduce(ref reducer);
1141 uint[]
array =
new uint[value.Length +
value.Length];
1142 fixed (uint* value2 =
value)
1144 fixed (uint* bits =
array)
1152 private unsafe
static void Square(uint*
value,
int valueLength, uint* bits,
int bitsLength)
1156 for (
int i = 0; i < valueLength; i++)
1159 for (
int j = 0; j < i; j++)
1161 ulong num2 = bits[i + j] + num;
1162 ulong num3 = (ulong)
value[j] * (ulong)
value[i];
1163 bits[i + j] = (uint)(num2 + (num3 << 1));
1164 num = num3 + (num2 >> 1) >> 31;
1166 ulong num4 = (ulong)((
long)
value[i] * (long)
value[i]) + num;
1167 bits[i + i] = (uint)num4;
1168 bits[i + i + 1] = (uint)(num4 >> 32);
1172 int num5 = valueLength >> 1;
1173 int num6 = num5 << 1;
1175 uint* ptr =
value + num5;
1176 int num8 = valueLength - num5;
1178 uint* ptr2 = bits + num6;
1179 int num10 = bitsLength - num6;
1181 Square(ptr, num8, ptr2, num10);
1182 int num11 = num8 + 1;
1183 int num12 = num11 + num11;
1186 uint* ptr3 = stackalloc uint[num11];
1188 uint* ptr4 = stackalloc uint[num12];
1190 Add(ptr, num8,
value, num7, ptr3, num11);
1191 Square(ptr3, num11, ptr4, num12);
1193 AddSelf(bits + num5, bitsLength - num5, ptr4, num12);
1196 fixed (uint* ptr5 =
new uint[num11])
1198 fixed (uint* ptr6 =
new uint[num12])
1200 Add(ptr, num8,
value, num7, ptr5, num11);
1201 Square(ptr5, num11, ptr6, num12);
1203 AddSelf(bits + num5, bitsLength - num5, ptr6, num12);
1212 uint[]
array =
new uint[left.Length + 1];
1213 for (; i < left.Length; i++)
1215 ulong num2 = (ulong)((
long)left[i] * (long)right) + num;
1216 array[i] = (uint)num2;
1219 array[i] = (uint)num;
1223 public unsafe
static uint[]
Multiply(uint[] left, uint[] right)
1225 uint[]
array =
new uint[left.Length + right.Length];
1226 fixed (uint* left2 = left)
1228 fixed (uint* right2 = right)
1230 fixed (uint* bits =
array)
1232 Multiply(left2, left.Length, right2, right.Length, bits,
array.Length);
1239 private unsafe
static void Multiply(uint* left,
int leftLength, uint* right,
int rightLength, uint* bits,
int bitsLength)
1243 for (
int i = 0; i < rightLength; i++)
1246 for (
int j = 0; j < leftLength; j++)
1248 ulong num2 = bits[i + j] + num + (ulong)((
long)left[j] * (long)right[i]);
1249 bits[i + j] = (uint)num2;
1252 bits[i + leftLength] = (uint)num;
1256 int num3 = rightLength >> 1;
1257 int num4 = num3 << 1;
1259 uint* left2 = left + num3;
1260 int num6 = leftLength - num3;
1261 int rightLength2 = num3;
1262 uint* ptr = right + num3;
1263 int num7 = rightLength - num3;
1265 uint* ptr2 = bits + num4;
1266 int num9 = bitsLength - num4;
1267 Multiply(left, num5, right, rightLength2, bits, num8);
1268 Multiply(left2, num6, ptr, num7, ptr2, num9);
1269 int num10 = num6 + 1;
1270 int num11 = num7 + 1;
1271 int num12 = num10 + num11;
1274 uint* ptr3 = stackalloc uint[num10];
1276 uint* ptr4 = stackalloc uint[num11];
1278 uint* ptr5 = stackalloc uint[num12];
1280 Add(left2, num6, left, num5, ptr3, num10);
1281 Add(ptr, num7, right, rightLength2, ptr4, num11);
1282 Multiply(ptr3, num10, ptr4, num11, ptr5, num12);
1284 AddSelf(bits + num3, bitsLength - num3, ptr5, num12);
1287 fixed (uint* ptr6 =
new uint[num10])
1289 fixed (uint* ptr7 =
new uint[num11])
1291 fixed (uint* ptr8 =
new uint[num12])
1293 Add(left2, num6, left, num5, ptr6, num10);
1294 Add(ptr, num7, right, rightLength2, ptr7, num11);
1295 Multiply(ptr6, num10, ptr7, num11, ptr8, num12);
1297 AddSelf(bits + num3, bitsLength - num3, ptr8, num12);
1303 private unsafe
static void SubtractCore(uint* left,
int leftLength, uint* right,
int rightLength, uint* core,
int coreLength)
1307 for (; i < rightLength; i++)
1309 long num2 = core[i] + num - left[i] - right[i];
1310 core[i] = (uint)num2;
1313 for (; i < leftLength; i++)
1315 long num3 = core[i] + num - left[i];
1316 core[i] = (uint)num3;
1319 while (num != 0
L && i < coreLength)
1321 long num4 = core[i] + num;
1322 core[i] = (uint)num4;
static unsafe void Clear(Array array)
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
static uint[] Pow(uint[] value, uint power, uint[] modulus)
static unsafe void Subtract(uint *left, int leftLength, uint *right, int rightLength, uint *bits, int bitsLength)
static unsafe uint[] Divide(uint[] left, uint[] right, out uint[] remainder)
static int ReducerThreshold
static int LeadingZeros(uint value)
static uint[] Divide(uint[] left, uint right, out uint remainder)
static unsafe void Add(uint *left, int leftLength, uint *right, int rightLength, uint *bits, int bitsLength)
static int SquareThreshold
static unsafe void Square(uint *value, int valueLength, uint *bits, int bitsLength)
static uint[] Pow(uint[] value, uint power)
static uint Gcd(uint left, uint right)
static uint Pow(uint value, uint power, uint modulus)
static int MultiplyThreshold
static uint[] Gcd(uint[] left, uint[] right)
static uint Pow(uint[] value, uint power, uint modulus)
static void PowCore(uint power, uint[] modulus, ref BitsBuffer value, ref BitsBuffer result, ref BitsBuffer temp)
static uint[] Pow(uint value, uint power)
static uint[] Add(uint[] left, uint right)
static int ActualLength(uint[] value)
static unsafe void SubtractCore(uint *left, int leftLength, uint *right, int rightLength, uint *core, int coreLength)
static bool DivideGuessTooBig(ulong q, ulong valHi, uint valLo, uint divHi, uint divLo)
static uint[] Pow(uint[] value, uint[] power, uint[] modulus)
static void ExtractDigits(ref BitsBuffer xBuffer, ref BitsBuffer yBuffer, out ulong x, out ulong y)
static int ActualLength(uint[] value, int length)
static uint Pow(uint[] value, uint[] power, uint modulus)
static uint Pow(uint value, uint[] power, uint modulus)
static uint[] Pow(uint value, uint[] power, uint[] modulus)
static uint[] Multiply(uint[] left, uint right)
static uint[] PowCore(uint power, uint[] modulus, ref BitsBuffer value)
static unsafe uint[] Subtract(uint[] left, uint[] right)
static uint[] Subtract(uint[] left, uint right)
static uint[] Pow(uint value, uint power, uint[] modulus)
static void LehmerCore(ref BitsBuffer xBuffer, ref BitsBuffer yBuffer, long a, long b, long c, long d)
static ulong Gcd(ulong left, ulong right)
static uint PowCore(uint power, uint modulus, ulong value, ulong result)
static int PowBound(uint power, int valueLength, int resultLength)
static uint Remainder(uint[] left, uint right)
static void PowCore(uint[] power, uint[] modulus, ref BitsBuffer value, ref BitsBuffer result, ref BitsBuffer temp)
static unsafe uint[] Square(uint[] value)
static uint[] PowCore(uint[] power, uint[] modulus, ref BitsBuffer value)
static int AllocationThreshold
static unsafe uint AddDivisor(uint *left, int leftLength, uint *right, int rightLength)
static unsafe uint[] Divide(uint[] left, uint[] right)
static unsafe int Compare(uint *left, int leftLength, uint *right, int rightLength)
static void PowCore(uint power, ref FastReducer reducer, ref BitsBuffer value, ref BitsBuffer result, ref BitsBuffer temp)
static uint Gcd(uint[] left, uint right)
static unsafe uint[] Multiply(uint[] left, uint[] right)
static void Gcd(ref BitsBuffer left, ref BitsBuffer right)
static void PowCore(uint[] power, ref FastReducer reducer, ref BitsBuffer value, ref BitsBuffer result, ref BitsBuffer temp)
static void PowCore(uint power, ref BitsBuffer value, ref BitsBuffer result, ref BitsBuffer temp)
static unsafe void Divide(uint *left, int leftLength, uint *right, int rightLength, uint *bits, int bitsLength)
static unsafe void AddSelf(uint *left, int leftLength, uint *right, int rightLength)
static int Compare(uint[] left, uint[] right)
static unsafe uint[] Remainder(uint[] left, uint[] right)
static uint[] Divide(uint[] left, uint right)
static unsafe void Multiply(uint *left, int leftLength, uint *right, int rightLength, uint *bits, int bitsLength)
static unsafe uint[] Add(uint[] left, uint[] right)
static unsafe uint SubtractDivisor(uint *left, int leftLength, uint *right, int rightLength, ulong q)
static uint[] PowCore(uint power, ref BitsBuffer value)
static unsafe void SubtractSelf(uint *left, int leftLength, uint *right, int rightLength)
static uint PowCore(uint[] power, uint modulus, ulong value, ulong result)
void Overwrite(uint value)
unsafe void SquareSelf(ref BitsBuffer temp)
void Refresh(int maxLength)
void Reduce(ref FastReducer reducer)
void Overwrite(ulong value)
unsafe void Reduce(uint[] modulus)
BitsBuffer(int size, uint value)
BitsBuffer(int size, uint[] value)
void Apply(ref BitsBuffer temp, int maxLength)
unsafe void MultiplySelf(ref BitsBuffer value, ref BitsBuffer temp)
unsafe void Reduce(ref BitsBuffer modulus)
int Reduce(uint[] value, int length)
static unsafe int DivMul(uint[] left, int leftLength, uint[] right, int rightLength, uint[] bits, int k)
static unsafe int SubMod(uint[] left, int leftLength, uint[] right, int rightLength, uint[] modulus, int k)
FastReducer(uint[] modulus)
void CopyTo(Span< T > destination)
Span< T > Slice(int start)