public static DivideResult PolyLongDivision(BigRational[] dividend, BigRational[] divisor) { DivideResult divideResult = new DivideResult(); BigRational[] bufferDividend = dividend; int divisorMaxPower = divisor.Length - 1; BigRational divisorMaxCoeff = divisor.Last(); BigRational[] result = new BigRational[dividend.Length]; while (true) { long dividentMaxPower = bufferDividend.Length - 1; long resultXPower = dividentMaxPower - divisorMaxPower; if (resultXPower < 0) { divideResult.Quotient = RemoveUselessZeros(result); divideResult.Remainder = RemoveUselessZeros(bufferDividend); return divideResult; } BigRational dividentCoeff = bufferDividend.Last(); BigRational resultCoeff = dividentCoeff/divisorMaxCoeff; result[resultXPower] = resultCoeff; BigRational[] buffSubtract = new BigRational[bufferDividend.Length].Select(h => new BigRational(0,1)).ToArray(); Array.Copy(divisor, 0, buffSubtract, resultXPower, divisor.Length); Parallel.For(0, buffSubtract.Length, i => buffSubtract[i] *= resultCoeff); bufferDividend = ArraySubtrInts(bufferDividend, buffSubtract); bufferDividend = RemoveUselessZeros(bufferDividend); } }