Created
March 31, 2012 19:04
-
-
Save robrighter/2267570 to your computer and use it in GitHub Desktop.
Detect functions with the additive property for prime numbers up to a specified limit.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function isAdditive(f,x,y){ | |
return ((f(x) + f(y)) === f(x+y)); | |
} | |
function everyCombinationOfTwo(arr){ | |
var toreturn = []; | |
arr.forEach(function(first){ | |
arr.forEach(function(second){ | |
toreturn.push([first,second]); | |
}); | |
}); | |
return toreturn; | |
} | |
function getAllPrimesUpToLimit(limit){ | |
var primes = [2]; | |
var i = 2; | |
while(i<=limit){ | |
if(determineIfPrimeFromList(i,primes)){ | |
primes.push(i); | |
} | |
i++; | |
} | |
return primes; | |
} | |
function determineIfPrimeFromList(x, primes){ | |
for(var i=0;i<primes.length;i++){ | |
if((x%primes[i])===0){ | |
return false; | |
} | |
else if(primes[i]>Math.sqrt(x)){ | |
return true | |
} | |
} | |
return true; | |
} | |
function solve(secret,limit){ | |
var combos = everyCombinationOfTwo(getAllPrimesUpToLimit(limit)); | |
for(var i=0;i<combos.length;i++){ | |
if(!isAdditive(secret,combos[i][0],combos[i][1])){ | |
return false | |
} | |
} | |
return true; | |
} | |
function tests(){ | |
var assert = require('assert'); | |
//TEST isAdditive | |
var additive = function(x){ return 3*x; }; | |
var notAdditive = function(x) {return x-1; }; | |
assert.equal(isAdditive(additive,3,5),true, "isAdditive should be true"); | |
assert.equal(isAdditive(notAdditive,3,5),false, "isAdditive should be false"); | |
//TEST everyCombinationOfTwo | |
assert.deepEqual(everyCombinationOfTwo([1,2,3]), [ [1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3] ], "everyCombinationOfTwo([1,2,3])"); | |
//TEST getAllPrimesUpToLimit | |
var primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149]; | |
assert.deepEqual(getAllPrimesUpToLimit(150), primes, "getAllPrimesUpToLimit(150)"); | |
//TEST determineIfPrimeFromList | |
assert.equal(determineIfPrimeFromList(5, [2,3,5,7]), true, "determineIfPrimeFromList with prime number in list"); | |
assert.equal(determineIfPrimeFromList(4, [2,3,5,7]), false, "determineIfPrimeFromList with nonprime number less than last"); | |
assert.equal(determineIfPrimeFromList(14, [2,3,5,7]), false, "determineIfPrimeFromList with nonprime number greater than last"); | |
//TEST solve | |
assert.equal(solve(additive,500), true, "solve() should have returned true"); | |
assert.equal(solve(notAdditive,900), false, "solve() should have returned false"); | |
//VISIBLE TEST | |
function secret(x){ | |
return (6*x); | |
} | |
console.log('secret(12): ' + secret(12)); | |
console.log('secret(22): ' + secret(22)); | |
console.log('secret(12+22): ' + secret(12+22)); | |
console.log('secret(12) + secret(22): ' + (secret(12) + secret(22)) ); | |
console.log('Is Additive? = ' + solve(secret)); | |
} | |
tests(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment