public static String gcdSteps(int a, int b) {
        final StringBuilder gcdEquals = buildGCDEquals(a, b);
        if (a < 0) {
            if (b < 0)
                b = -b;
            return gcdEquals.append(buildGCDNewline(-a, b)).append(gcdSteps(-a, b)).toString();
        }
        if (b < 0)
            return gcdEquals.append(buildGCDNewline(a, -b)).append(gcdSteps(a, -b)).toString();
        if (a < b)
            return gcdEquals.append(buildGCDNewline(b, a)).append(gcdSteps(b, a)).toString();
        
        final StringBuilder result = new StringBuilder(128);
        while (b > 0) {
            int r = a % b;
            result.append(a).append(" = ");
            result.append(a / b).append(MULT);
            result.append(b).append(" + ");
            result.append(r).append(NEWLINE);
            a = b;
            b = r;
        }
        return result.append(gcdEquals).append(a).append(NEWLINE).toString();
    }