public static BigInteger cbrt(BigInteger n) {
		BigInteger guess = n.divide(BigInteger.valueOf((long) n.bitLength() / 3));
		boolean go = true;
		int c = 0;
		BigInteger test = guess;
		while (go) {
			BigInteger numOne = n.divide(guess.multiply(guess));
			BigInteger numTwo = guess.multiply(new BigInteger("2"));
			guess = numOne.add(numTwo).divide(new BigInteger("3"));
			if (numOne.equals(numTwo)) {
				go = false;
			}
			if (guess.mod(new BigInteger("2")).equals(BigInteger.ONE)) {
				guess = guess.add(BigInteger.ONE);
			}
			// System.out.println(guess.toString());
			c++;
			c %= 5;
			if (c == 4 && (test.equals(guess))) {
				return guess;
			}
			if (c == 2) {
				test = guess;
			}
		}

		if ((guess.multiply(guess)).equals(number)) {
			return guess;
		}
		return guess.add(BigInteger.ONE);
	}