Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Gcd() [1/5]

static void System.Numerics.BigIntegerCalculator.Gcd ( ref BitsBuffer left,
ref BitsBuffer right )
inlinestaticprivate

Definition at line 722 of file BigIntegerCalculator.cs.

723 {
724 while (right.GetLength() > 2)
725 {
726 ExtractDigits(ref left, ref right, out var x, out var y);
727 uint num = 1u;
728 uint num2 = 0u;
729 uint num3 = 0u;
730 uint num4 = 1u;
731 int num5 = 0;
732 while (y != 0L)
733 {
734 ulong num6 = x / y;
735 if (num6 > uint.MaxValue)
736 {
737 break;
738 }
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)
743 {
744 break;
745 }
746 num = (uint)num7;
747 num2 = (uint)num8;
748 x = num9;
749 num5++;
750 if (x == num2)
751 {
752 break;
753 }
754 num6 = y / x;
755 if (num6 > uint.MaxValue)
756 {
757 break;
758 }
759 num7 = num4 + num6 * num2;
760 num8 = num3 + num6 * num;
761 num9 = y - num6 * x;
762 if (num7 > int.MaxValue || num8 > int.MaxValue || num9 < num8 || num9 + num7 > x - num2)
763 {
764 break;
765 }
766 num4 = (uint)num7;
767 num3 = (uint)num8;
768 y = num9;
769 num5++;
770 if (y == num3)
771 {
772 break;
773 }
774 }
775 if (num2 == 0)
776 {
777 left.Reduce(ref right);
778 BitsBuffer bitsBuffer = left;
779 left = right;
780 right = bitsBuffer;
781 continue;
782 }
783 LehmerCore(ref left, ref right, num, num2, num3, num4);
784 if (num5 % 2 == 1)
785 {
786 BitsBuffer bitsBuffer2 = left;
787 left = right;
788 right = bitsBuffer2;
789 }
790 }
791 if (right.GetLength() > 0)
792 {
793 left.Reduce(ref right);
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));
799 right.Overwrite(0u);
800 }
801 }
static uint Gcd(uint left, uint right)
static void ExtractDigits(ref BitsBuffer xBuffer, ref BitsBuffer yBuffer, out ulong x, out ulong y)
static void LehmerCore(ref BitsBuffer xBuffer, ref BitsBuffer yBuffer, long a, long b, long c, long d)

References System.Numerics.BigIntegerCalculator.ExtractDigits(), System.Numerics.BigIntegerCalculator.Gcd(), System.L, System.Numerics.BigIntegerCalculator.LehmerCore(), and System.Numerics.BigIntegerCalculator.BitsBuffer.Reduce().