docs: private static void divideUnsignedMultiPrecision(int[] dividend, int[] divisor, int[] quotient)
      {
          checkArgument(dividend.length == NUMBER_OF_INTS * 2 + 1);
          checkArgument(divisor.length == NUMBER_OF_INTS * 2);
          checkArgument(quotient.length == NUMBER_OF_INTS * 2);
  
          int divisorLength = digitsInIntegerBase(divisor);
          int dividendLength = digitsInIntegerBase(dividend);
  
          if (dividendLength < divisorLength) {
              return;
          }
  
          if (divisorLength == 1) {
              int remainder = divideUnsignedMultiPrecision(dividend, dividendLength, divisor[0]);
              checkState(dividend[dividend.length - 1] == 0);
              arraycopy(dividend, 0, quotient, 0, quotient.length);
              fill(dividend, 0);
              dividend[0] = remainder;
              return;
          }
  
          // normalize divisor. Most significant divisor word must be > BASE/2
          // effectively it can be achieved by shifting divisor left until the leftmost bit is 1
          int nlz = Integer.numberOfLeadingZeros(divisor[divisorLength - 1]);
          shiftLeftMultiPrecision(divisor, divisorLength, nlz);
          int normalizedDividendLength = Math.min(dividend.length, dividendLength + 1);
          shiftLeftMultiPrecision(dividend, normalizedDividendLength, nlz);
  
          divideKnuthNormalized(dividend, normalizedDividendLength, divisor, divisorLength, quotient);
  
          // un-normalize remainder which is stored in dividend
          shiftRightMultiPrecision(dividend, normalizedDividendLength, nlz);
      }