Example #1
0
        public void Set(ulong uu)
        {
            uint hi = NumericsHelpers.GetHi(uu);

            if (hi == 0)
            {
                _uSmall = (uint)uu;
                _iuLast = 0;
            }
            else
            {
                SetSizeLazy(2);
                _rgu[0] = (uint)uu;
                _rgu[1] = hi;
            }
        }
Example #2
0
        private static void LehmerGcd(ref BigIntegerBuilder reg1, ref BigIntegerBuilder reg2)
        {
            int  num;
            uint num2;
            int  sign = 1;

START:
            num = reg1._iuLast + 1;
            int b = reg2._iuLast + 1;

            if (num < b)
            {
                Py.Core.Util.Swap <BigIntegerBuilder>(ref reg1, ref reg2);
                Py.Core.Util.Swap <int>(ref num, ref b);
            }
            if (b == 1)
            {
                if (num == 1)
                {
                    reg1._uSmall = NumericsHelpers.GCD(reg1._uSmall, reg2._uSmall);
                    return;
                }
                if (reg2._uSmall != 0)
                {
                    reg1.Set(NumericsHelpers.GCD(Mod(ref reg1, reg2._uSmall), reg2._uSmall));
                }
                return;
            }
            if (num == 2)
            {
                reg1.Set(NumericsHelpers.GCD(reg1.GetHigh2(2), reg2.GetHigh2(2)));
                return;
            }
            if (b <= (num - 2))
            {
                reg1.Mod(ref reg2);
                goto START;
            }
            ulong a    = reg1.GetHigh2(num);
            ulong num6 = reg2.GetHigh2(num);
            int   num7 = NumericsHelpers.CbitHighZero((ulong)(a | num6));

            if (num7 > 0)
            {
                a    = (a << num7) | (reg1._rgu[num - 3] >> (0x20 - num7));
                num6 = (num6 << num7) | (reg2._rgu[num - 3] >> (0x20 - num7));
            }
            if (a < num6)
            {
                Py.Core.Util.Swap <ulong>(ref a, ref num6);
                Py.Core.Util.Swap <BigIntegerBuilder>(ref reg1, ref reg2);
            }
            if ((a == ulong.MaxValue) || (num6 == ulong.MaxValue))
            {
                a    = a >> 1;
                num6 = num6 >> 1;
            }
            if (a == num6)
            {
                reg1.Sub(ref sign, ref reg2);
                goto START;
            }
            if (NumericsHelpers.GetHi(num6) == 0)
            {
                reg1.Mod(ref reg2);
                goto START;
            }
            uint num8  = 1;
            uint num9  = 0;
            uint num10 = 0;
            uint num11 = 1;

Label_0162:
            num2 = 1;
            ulong num12 = a - num6;

            while ((num12 >= num6) && (num2 < 0x20))
            {
                num12 -= num6;
                num2++;
            }
            if (num12 >= num6)
            {
                ulong num13 = a / num6;
                if (num13 > 0xffffffffL)
                {
                    goto Label_02A3;
                }
                num2  = (uint)num13;
                num12 = a - (num2 * num6);
            }
            ulong num14 = num8 + (num2 * num10);
            ulong num15 = num9 + (num2 * num11);

            if (((num14 <= 0x7fffffffL) && (num15 <= 0x7fffffffL)) && ((num12 >= num15) && ((num12 + num14) <= (num6 - num10))))
            {
                num8 = (uint)num14;
                num9 = (uint)num15;
                a    = num12;
                if (a > num9)
                {
                    num2  = 1;
                    num12 = num6 - a;
                    while ((num12 >= a) && (num2 < 0x20))
                    {
                        num12 -= a;
                        num2++;
                    }
                    if (num12 >= a)
                    {
                        ulong num16 = num6 / a;
                        if (num16 > 0xffffffffL)
                        {
                            goto Label_02A3;
                        }
                        num2  = (uint)num16;
                        num12 = num6 - (num2 * a);
                    }
                    num14 = num11 + (num2 * num9);
                    num15 = num10 + (num2 * num8);
                    if (((num14 <= 0x7fffffffL) && (num15 <= 0x7fffffffL)) && ((num12 >= num15) && ((num12 + num14) <= (a - num9))))
                    {
                        num11 = (uint)num14;
                        num10 = (uint)num15;
                        num6  = num12;
                        if (num6 > num10)
                        {
                            goto Label_0162;
                        }
                    }
                }
            }
Label_02A3:
            if (num9 == 0)
            {
                if ((a / ((ulong)2L)) >= num6)
                {
                    reg1.Mod(ref reg2);
                }
                else
                {
                    reg1.Sub(ref sign, ref reg2);
                }
            }
            else
            {
                reg1.SetSizeKeep(b, 0);
                reg2.SetSizeKeep(b, 0);
                int num17 = 0;
                int num18 = 0;
                for (int i = 0; i < b; i++)
                {
                    uint num20 = reg1._rgu[i];
                    uint num21 = reg2._rgu[i];
                    long num22 = ((num20 * num8) - (num21 * num9)) + num17;
                    long num23 = ((num21 * num11) - (num20 * num10)) + num18;
                    num17        = (int)(num22 >> 0x20);
                    num18        = (int)(num23 >> 0x20);
                    reg1._rgu[i] = (uint)num22;
                    reg2._rgu[i] = (uint)num23;
                }
                reg1.Trim();
                reg2.Trim();
            }
            goto START;
        }