private static BigInteger mp(BigInteger base,BigInteger exponent,BigInteger modulus) {
	    BigInteger result=BigInteger.ONE;	// initialize variable
	    
		// failsafe
		if( base.compareTo(BigInteger.ONE) < 0 || exponent.compareTo(BigInteger.ZERO) < 0 || modulus.compareTo(BigInteger.ONE) < 1) {
	    	return BigInteger.ZERO;
	    }
		
		
		while(exponent.compareTo(BigInteger.ZERO) > 0) {
			// if ((exponent % 2) == 1)
			if(exponent.mod( BigInteger.ONE.add(BigInteger.ONE )).equals(BigInteger.ONE)) {
				// result = (result*base)%modulus;
				result = (result.multiply(base)).mod(modulus);
			}
			// base = (base*base) %mod
			base = (base.multiply(base)).mod(modulus);	
			// exponent = floor(exponent/2)
			exponent = exponent.divide(BigInteger.ONE.add(BigInteger.ONE ));
		}
		
		return result;
	}