public static String eulerPhiSteps(final int n) {
        Algorithms.positiveCheck(n);
        if (n < 2)
            return buildPhiEquals(n).append(n).toString();
        
        String factorization = factorizeSteps(n);
        final StringBuilder result = new StringBuilder(256);
        result.append(factorization).append(NEWLINE);
        factorization = factorization.replaceFirst(n + " = ", "");
        result.append(buildPhiEquals(n)).append(buildPhi(factorization));
        
        final StringBuilder tmp = new StringBuilder(factorization.replaceAll(
                " \\* ", ") \\*" + PHIB));
        if (!tmp.toString().equals(factorization))
            result.append(buildPhiEquals(n)).append(buildPhi(tmp.toString()));
        
        result.append(buildPhiEquals(n));
        int phi = 1;
        final List<Pair<Integer, Integer>> factors = Algorithms.factorize(n);
        final int factSize = factors.size();
        for (int i = 0; i < factSize; ++i) {
            final int prime = factors.get(i).getFirst();
            final int exponent = factors.get(i).getSecond();
            phi *= prime - 1;
            phi *= Math.pow(prime, exponent - 1);
            result.append("(").append(prime - 1).append(MULT);
            result.append(buildPower(prime, exponent - 1)).append(")");
            if (!Utils.lastForCycle(i, factSize))
                result.append(MULT);
        }
        result.append(NEWLINE).append(buildPhiEquals(n));
        for (int i = 0; i < factSize; ++i) {
            final int prime = factors.get(i).getFirst();
            final int exponent = factors.get(i).getSecond();
            result.append((prime - 1) * (int)(Math.pow(prime, exponent - 1)));
            if (!Utils.lastForCycle(i, factSize))
                result.append(MULT);
        }
        result.append(NEWLINE);
        if (factSize > 1)
            result.append(buildPhiEquals(n)).append(phi).append(NEWLINE);
        return result.toString();
    }