Skip to content

Instantly share code, notes, and snippets.

@robrighter
Created March 31, 2012 19:04
Show Gist options
  • Save robrighter/2267570 to your computer and use it in GitHub Desktop.
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.
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