@NonNull
	public ECPoint multiply(@NonNull final BigInteger k) {
		if (k.signum() < 0) {
			throw new IllegalArgumentException(
					"The multiplicator cannot be negative"); //$NON-NLS-1$
		}

		if (isInfinity()) {
			return this;
		}

		if (k.signum() == 0) {
			return O;
		}

		// TODO Probably should try to add this
		// BigInteger e = k.mod(n);
		final BigInteger h = k.multiply(BigInteger.valueOf(3));

		final ECPoint neg = negate();
		ECPoint r = this;

		for (int i = h.bitLength() - 2; i > 0; --i) {
			r = r.twice();

			final boolean hBit = h.testBit(i);
			final boolean eBit = k.testBit(i);

			if (hBit != eBit) {
				r = r.add(hBit ? this : neg);
			}
		}

		return r;
	}