On Tuesday, 19 March 2013 at 16:47:43 UTC, Andrea Fontana wrote:

On Tuesday, 19 March 2013 at 15:55:19 UTC, ixid wrote:
I was just looking at the Rosetta code for prime decomposition and it seems bugged to me, wanted to make sure as you seem to be the one coordinating these things:

http://rosettacode.org/wiki/Prime_decomposition#D

This will potentially return a 1 in the list of primes which is a bug as 1 isn't prime.

You're right. I think the right code for decompose is this:

T[] decompose(T)(T n) /*pure nothrow*/ {
        T[] res;
        for (T i = 2; n % i == 0;) {
                res ~= i;
                n /= i;
        }
        for (T i = 3; n != 1; i += 2) { // ----- Changed condition
                while (n % i == 0) {
                        res ~= i;
                        n /= i;
                }
        }
        // ----- Removed concat here
        return res;
}

T[] primeDecomposition2(T)(T n) /*pure nothrow*/ {
    T[] res;
    for (T i = 2; n % i == 0;) {
        res ~= i;
        n /= i;
    }
    for (T i = 3; n >= i * i; i += 2) {
        while (n % i == 0) {
            res ~= i;
            n /= i;
        }
    }

        if(n != 1)
                res ~= n;

    return res;
}

I think this is quite a lot faster, otherwise for numbers that are the products of a small and larger prime it will waste a lot of time reaching the larger prime's value.

Reply via email to