private static StringBuilder quadraticCongruenceStepsNatural(int a, int b, int c, int m) {
        final StringBuilder result = new StringBuilder(256);
        final List<Pair<Integer, Integer>> factors = Algorithms.factorize(m);
        final int factSize = factors.size();
        if ((factSize < 2) || (factSize > 4)) 
            return result;
        
        final List<Integer> subMods = new ArrayList<>();
        final List<StringBuilder> lineEnds = new ArrayList<>();
        for (int i = 0; i < factSize; ++i) {
            final int pi = factors.get(i).getFirst();
            final int ei = factors.get(i).getSecond();
            final int mi = (int)Math.pow(pi, ei);
            subMods.add(mi);
            lineEnds.add(buildModLineEnd(mi));
        }
        result.append(SEPARATOR);
        for (int i = 0; i < lineEnds.size(); ++i) {
            final StringBuilder lineEnd = lineEnds.get(i);
            int ai = a;
            int bi = b;
            int ci = c;
            final int mi = subMods.get(i);
            result.append(buildBinomialCongruence(a, 'x', 2, b, c, lineEnd));
            if (normalizeIntModuloChanges(a, b, c, mi)) {
                ai = Algorithms.normalizeIntModulo(a, mi);
                bi = Algorithms.normalizeIntModulo(b, mi);
                ci = Algorithms.normalizeIntModulo(c, mi);
                result.append(buildBinomialCongruence(ai, 'x', 2, bi, ci, lineEnd));
            }
            final List<Integer> subResult =
                    Algorithms.quadraticCongruenceGeneral(ai, bi, ci, subMods.get(i));
            result.append(quadraticCongruenceSimpleBuildSolution(subResult, 'x', false));
            if (!Utils.lastForCycle(i, lineEnds.size()))
                result.append(SEPARATOR);
        }
        return result;
    }