Kth Arithmetic Derivative

by wio_dude

HTML

<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML&amp;dummy=.js"></script>
<script type="text/x-mathjax-config"> MathJax.Hub.Config({   tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]} }); </script>





$ n= $ <input type="text" id="n"/><br />
$ k= $ <input type="text" id="k"/><br />
<input type="button" id="calculate" value="Calculate"/>
<div id="output"></div>
<div id="work"></div>

JavaScript

var e = {
    n: document.getElementById('n'),
    k: document.getElementById('k'),
    calculate: document.getElementById('calculate'),
    output: document.getElementById('output'),
    work: document.getElementById('work')
};

var primes = [2];

function lastPrime() {
    return primes[primes.length-1];
}
function nextPrime() {
    var i, j = lastPrime(), hasFactor;
    while (true) {
        j++;
        hasFactor = false;
        for (i = 0; i < primes.length; i++) {
            if (j % primes[i] === 0) {
                hasFactor = true;
                break;
            }
        }
        if (!hasFactor) {
            break;
        }
    }
    primes.push(j);
    return j;
}
function nthPrime(n) {
    while (primes.length <= n) {
        nextPrime();
    }
    return primes[n];
}
function isPrime(n) {
    var i = 0, p;
    while (true) {
        p = nthPrime(i);
        if (n % p === 0) {
            return (n == p);
        }
        i++;
    }
}

function factor(n) {
    var i = 0, p;
    while (true) {
        p = nthPrime(i);
        if (n % p === 0) {
           return [p, n/p];
        }
        i++;
    }
}

function arithDeriv(n,k) {
    if (k <= 0) {
        return n;
    }
    if (n === 1) {
        return 0;
    }
    var factors = factor(n);
    var p = factors[0];
    var m = factors[1];
    if (m === 1) {
        if (k === 1) {
            return 1;
        } else {
            return 0;
        }
    }
    return arithDeriv(m,k-1) + p * arithDeriv(m,k);
}

function arithDerivWork(n,k) {
    if (k <= 0) {
        return n;
    }
    if (n === 1) {
        return 0;
    }
    var factors = factor(n);
    var p = factors[0];
    var m = factors[1];
    if (m === 1) {
        if (k === 1) {
            e.work.innerHTML += "\\[" + 
                n + "^{[" + k + "]} = " + 1 + " \\]";
            MathJax.Hub.Queue(["Typeset",MathJax.Hub,"work"]);
            return 1;
        } else {
            return 0;
        }
    }
    e.work.innerHTML...