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();
}
}
}