private static boolean phiIsCube(long n) {
		/**
		 * n = p1^k1*p2^k2*...*pr^kr
		 * 
		 * phi(n^2) = n*phi(n) = n^2*(1-1/p1)(1-1/p2)...(1-1/pr)
		 * 			
		 * 			= p1^(2*k1)*p2^(2*k2)*...*pr^(2*kr)   *   ((p1-1)/p1)((p2-1)/p2)...((pr-1)/pr)
		 * 
		 * 			= p1^(2*k1-1)*p2^(2*k2-1)*...*pr^(2*kr-1)     *    (p1-1)*(p2-1)*...*(pr-1)
		 * 
		 */
		
		List<Integer> primeFactors = pelle[(int)n];
		
		Map<Integer, Integer> ps = new HashMap<Integer, Integer>();
		
		for (int p : primeFactors) {
			int k = 1;
			long temp = n/p;
			while (temp % p == 0) {
				temp/=p;
				k++;
			}
			
			ps.put(p, 2*k-1);
		}
		
		for (int p : primeFactors) {
			for (Map.Entry<Integer, Integer> entry: Euler.primeFactorMap(p-1).entrySet()) {
				Integer prime = entry.getKey();
				ps.put(prime, (ps.containsKey(prime) ? ps.get(prime) : 0) + entry.getValue());
			}
		}
		
		for (Map.Entry<Integer, Integer> entry : ps.entrySet()) {
			if (entry.getValue() % 3 != 0)
				return false;
		}
		
		return true;
	}