Primes

A (lengthly) solution to http://www.codewars.com/kata/534a0c100d03ad9772000539

by Kyle Falconer

JavaScript

// http://www.codewars.com/kata/534a0c100d03ad9772000539
function PrimeFactorizer(n) {
    //your code here
    this.factor = (function (n) {
        var factorization = {};
        var current = n;
        var limit = Math.sqrt(n);
        var p = Math.floor(limit);
        //window.console.log('Factoring ' + n);
        while (p >= 1) {
            p = prevPrime(p);
            //window.console.log('Trying ' + p);
            while (current % p === 0) { // divisible by p
                //window.console.log(current + ' is divisible by ' + p);
                if (factorization[p + '']) {
                    factorization[p + ''] = factorization[p + ''] + 1;
                } else {
                    factorization[p + ''] = 1;
                }
                if (current == current / p) {
                    return factorization;
                }
                current = current / p;
            }
            if (current == 1) {
                return factorization;
            } else if (isPrime(current)) {
                factorization[current + ''] = 1;
                return factorization;
            }
        }
        return factorization;
    })(n);

    function prevPrime(p) {
        var np = p;
        if (p == 2) {
            return 1;
        }
        while (p > 1) {
            np--;
            if (isPrime(np)) {
                return np;
            }
        }
    }

    function isPrime(n) {
        // borrowed from http://en.wikipedia.org/wiki/Primality_test
        if (n <= 3) {
            return n > 1;
        }
        if (n % 2 === 0 || n % 3 === 0) {
            return false;
        }
        for (var i = 5; i * i <= n; i += 6) {
            if (n % i === 0 || n % (i + 2) === 0) {
                return false;
            }
        }
        return true;
    }
}

window.console.log(new PrimeFactorizer(13).factor);