docs: protected List<BigInteger> split(
        BigInteger start,
        BigInteger range,
        BigInteger ringEnd,
        BigInteger ringLength,
        int numberOfSplits) {
      BigInteger[] tmp = range.divideAndRemainder(BigInteger.valueOf(numberOfSplits));
      BigInteger divider = tmp[0];
      int remainder = tmp[1].intValue();
  
      List<BigInteger> results = Lists.newArrayListWithExpectedSize(numberOfSplits - 1);
      BigInteger current = start;
      BigInteger dividerPlusOne =
          (remainder == 0)
              ? null // won't be used
              : divider.add(BigInteger.ONE);
  
      for (int i = 1; i < numberOfSplits; i++) {
        current = current.add(remainder-- > 0 ? dividerPlusOne : divider);
        if (ringEnd != null && current.compareTo(ringEnd) > 0) current = current.subtract(ringLength);
        results.add(current);
      }
      return results;
    }