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

            }
        }