public PAdic multiply(final PAdic multiplier) {
        PAdic.checkForBaseEquality(this, multiplier);

        PAdic result = new PAdic(new int[] {0}, 0, this.base);

        for (int i = 0; i < PAdic.len; ++i) {
            final int temp[] = multiplyToInteger(digits, multiplier.digits[i]);
            final PAdic adder = new PAdic(temp, 0, this.base, false);
            result = result.add(adder, i);
        }

        // In some cases when we multiply numbers, it may happens that
        // real index of the most right non-zero coefficient gets greater than it must be.
        // For example, multiplying ...00000.1 (order = -1)  by ...000010 (order = 1)
        // we will get ...0000010 (order = 1) that's incorrect, because its order must be zero.
        // So, the order calculated correctly, but we need to shift the result a little to the right.

        final int minOrder = Math.min(this.getOrder(), multiplier.getOrder());
        final int maxOrder = Math.max(this.getOrder(), multiplier.getOrder());

        if (minOrder < 0 && 0 < maxOrder) {
            int pos = 0;

            while (pos < -minOrder && result.digits[pos] == 0) {
                ++pos;
            }

            for (int i = 0; i + pos < PAdic.len; ++i) {
                result.digits[i] = result.digits[i + pos];
            }
        }

        final int order = PAdic.calculateOrder(result.digits, this.getOrder(), multiplier.getOrder(), Operation.MULTIPLICATION);

        return new PAdic(result.digits, order, this.base, false);
    }