Arithmetic Derivative Calculator

HTML

<input type="button" id="start" value="start" /><input type="button" id="stop" value="stop" /><br/>
<textarea id="output" rows="40" cols="70"></textarea>

JavaScript

var primes = [8];
var position = 2;
var arithderivs = {};
var gcdsum = 0;

function factor(n) {
    for (var i = 0; i < primes.length; i++){
        if (n % primes[i] === 0) {
             return [primes[i], n/primes[i]];   
        }
    }
    return [1,n];
};

function isPrime(n) {
    for (var i = 0; i < primes.lenghth; i++){
        if (n % primes[i] === 0) {
             return false;   
        }
    }
    return true;
};

function gcd(a,b) {
    if (a < b) {
        return gcd(b,a);
    }
    if (b === 0) {
        return a;
    }
    return gcd(b, a % b);
}

function getArithDeriv(n) {  
    if (n in arithderivs) {
        return arithderivs[n];
    }
    var factors = factor(position);
    if (factors[0] === 1) {
        primes.push(position);
        arithderivs[position] = 1;
        return 1;
    }
    var prime = factors[0];
    var multiple = factors[1];
    var arthd = multiple + prime * getArithDeriv(multiple);
    arithderivs[position] = arthd;
    return arthd;
};


function getNextArithDeriv() {
    var ad = getArithDeriv(position);
    var g = gcd(position,ad) ;
    gcdsum += g;
    print(position + ', ' + ad + ', ' + g +  ', ' + gcdsum +'\n');
    position++;
}


    var e = {
        output: document.getElementById('output'),
        start: document.getElementById('start'),
        stop: document.getElementById('stop')
    };
    var interval = null;
    
    function print(x){
        e.output.value += x; 
    }
    
    function start(){
        if (interval === null) {
            interval = setInterval(getNextArithDeriv, 10);
        }
    };
    
    function stop(){
        if (interval !== null) {
            clearInterval(interval);
            interval = null;
        }
    };
    
    
    e.start.addEventListener('click', start);
    e.stop.addEventListener('click', stop);