public ConcurrentSkipListSet<Double> factorise(int significant_figures) {

        ConcurrentSkipListSet<Double> factors = new ConcurrentSkipListSet<>();
        int maxFactors = this.getOrder();
        System.out.println("\nFACTORISING {");
        DoubleFunction<Boolean> test = (n) -> {
            double factor = newtonsMethod(n, significant_figures, 2000);
            if (factor != Double.NaN && !factors.contains(factor)) {
                System.out.println(factor);
                factors.add(factor);
                return true;
            } else {
                return false;
            }
        };

        ArrayList<Double> possibleRoots = this.rationalRootsTest();
        int factorCount = 0;
        for (Double root : possibleRoots) {
            //System.out.println(root);
            if (test.apply(root)) {
                factorCount++;
                if (factorCount >= maxFactors) {
                    System.out.println("} EARLY TERMINATION");
                    return factors;
                }
            }
        }
        System.out.println("}");
        return factors;
    }