System.Numerics.BigIntegerBuilder.ModDivCore C# (CSharp) Метод

ModDivCore() приватный статический Метод

private static ModDivCore ( BigIntegerBuilder &regNum, BigIntegerBuilder &regDen, bool fQuo, BigIntegerBuilder &regQuo ) : void
regNum BigIntegerBuilder
regDen BigIntegerBuilder
fQuo bool
regQuo BigIntegerBuilder
Результат void
        private static void ModDivCore(ref BigIntegerBuilder regNum, ref BigIntegerBuilder regDen, bool fQuo, ref BigIntegerBuilder regQuo) {
            regQuo.Set((uint)0);
            if (regNum._iuLast >= regDen._iuLast) {
                int num = regDen._iuLast + 1;
                int num2 = regNum._iuLast - regDen._iuLast;
                int cu = num2;
                int index = regNum._iuLast;
                while (true) {
                    if (index < num2) {
                        cu++;
                        break;
                    }
                    if (regDen._rgu[index - num2] != regNum._rgu[index]) {
                        if (regDen._rgu[index - num2] < regNum._rgu[index]) {
                            cu++;
                        }
                        break;
                    }
                    index--;
                }
                if (cu != 0) {
                    if (fQuo) {
                        regQuo.SetSizeLazy(cu);
                    }
                    uint u = regDen._rgu[num - 1];
                    uint num6 = regDen._rgu[num - 2];
                    int num7 = NumericsHelpers.CbitHighZero(u);
                    int num8 = 0x20 - num7;
                    if (num7 > 0) {
                        u = (u << num7) | (num6 >> num8);
                        num6 = num6 << num7;
                        if (num > 2) {
                            num6 |= regDen._rgu[num - 3] >> num8;
                        }
                    }
                    regNum.EnsureWritable();
                    int num9 = cu;
                    while (--num9 >= 0) {
                        uint uHi = ((num9 + num) <= regNum._iuLast) ? regNum._rgu[num9 + num] : 0;
                        ulong num11 = NumericsHelpers.MakeUlong(uHi, regNum._rgu[(num9 + num) - 1]);
                        uint uLo = regNum._rgu[(num9 + num) - 2];
                        if (num7 > 0) {
                            num11 = (num11 << num7) | (uLo >> num8);
                            uLo = uLo << num7;
                            if ((num9 + num) >= 3) {
                                uLo |= regNum._rgu[(num9 + num) - 3] >> num8;
                            }
                        }
                        ulong num13 = num11 / ((ulong)u);
                        ulong num14 = (uint)(num11 % ((ulong)u));
                        if (num13 > 0xffffffffL) {
                            num14 += (ulong)u * (num13 - 0xffffffffL);
                            num13 = 0xffffffffL;
                        }
                        while ((num14 <= 0xffffffffL) && ((num13 * num6) > NumericsHelpers.MakeUlong((uint)num14, uLo))) {
                            num13 -= (ulong)1L;
                            num14 += (ulong)u;
                        }
                        if (num13 > 0L) {
                            ulong num15 = 0L;
                            for (int i = 0; i < num; i++) {
                                num15 += regDen._rgu[i] * num13;
                                uint num17 = (uint)num15;
                                num15 = num15 >> 0x20;
                                if (regNum._rgu[num9 + i] < num17) {
                                    num15 += (ulong)1L;
                                }
                                regNum._rgu[num9 + i] -= num17;
                            }
                            if (uHi < num15) {
                                uint uCarry = 0;
                                for (int j = 0; j < num; j++) {
                                    uCarry = AddCarry(ref regNum._rgu[num9 + j], regDen._rgu[j], uCarry);
                                }
                                num13 -= (ulong)1L;
                            }
                            regNum._iuLast = (num9 + num) - 1;
                        }
                        if (fQuo) {
                            if (cu == 1) {
                                regQuo._uSmall = (uint)num13;
                            }
                            else {
                                regQuo._rgu[num9] = (uint)num13;
                            }
                        }
                    }
                    regNum._iuLast = num - 1;
                    regNum.Trim();
                }
            }
        }