(function($) {
"use strict";
try {
Object.defineProperties($.prototype, {
nextPrimeFactor: {
value: function() {
var
value = this;
while(!(++value).isPrime()) {}
return value;
}
},
// Para futuras implementações, como retorno de fatores primos de determinado valor, podemos usar um algorítmo determinístico como os dos dois links abaixo
// É interessante calcular somente os fatores primos que caberiam para determinado número ao invés de testar com todo número natural até chegar a ele, e salvá-los em i como um array, e no if calcular o retorno 0 somente para estes. Devendo o próprio número ser retornado caso não haja quantidade de múltiplos maior que 1, pois 1 e ele mesmo não deverão entrar no vetor para ser calculado.
// http://pt.wikipedia.org/wiki/Crivo_de_Erat%C3%B3stenes
// http://pt.wikipedia.org/wiki/Teste_de_primalidade_AKS
// dá para usar com gcd
primeFactors: {
value: function() {
var
factors = [],
n = parseFloat(this);
if(n < 0) {n = Math.abs(n);}
while(true) {
factors.push(n.firstMultiple());
n = n/n.firstMultiple();
if(n == 1) {break;}
}
return factors;
}
},
multipleOf: {
value: function(numbers) {
var
args = Array.from(arguments),
i = 0,
n = parseFloat(this),
callback = function(item, i) {
return parseFloat(Math.abs(arguments[i]));
};
args = args.map(callback);
if(args.length === 0) {return true;}
i = 0;
while(true) {
if(args[i] > n || n % args[i] !== 0) {return false;}
if(i == args.length -1) {break;}
i++;
}
return true;
}
},
areMultiples: {
value: function(numbers) {
var
current,
i = 0,
args = Array.from(arguments);
args.push(this);
args = args.uniq().desc();
current = parseFloat(args.shift());
while(true) {
while(true) {
if(!current.multipleOf(args[i++])) {return false;}
if (i == args.length) {break;}
}
i = 0;
current = args.delete(i);
if(!args.length) {break;}
}
return true;
}
},
isPrime: {
value: function() {
var
amount = 2,
i = amount,
n = parseFloat(this);
if(n < 0) {n = Math.abs(n);}
if(n == 1) {return false;}
if(n < 1 || n == 2) {return true;}
while(true) {
if (i == n || amount > 2) {break;}
if (n.multipleOf(i)) {amount++;}
i++;
}
if(amount == 2) {
return true;
} else {
return false;
}
}
},
multiples: {
value: function() {
var
n = parseFloat(this),
i = 1,
multiples = [];
if(n === 0) {return ["∞"];}
if(n < 0) {n = Math.abs(n);}
if(n.isPrime()) {return [1, n];}
while(true) {
if(n.multipleOf(i)) {multiples.push(i);}
if(i == n) {break;}
i++;
}
return multiples;
}
},
firstMultiple: {
value: function() {
var
i = 2,
n = parseFloat(this);
if (n < 0) {n = Math.abs(n);}
if (n <= 1) {return n;}
while(true) {
if(n.multipleOf(i)) {
return i;
}
i++;
}
}
},
fraction: {
value: function(places) {
var
numerator,
dLength,
n = parseFloat(this),
denominator = '1',
gcd = 1,
i = 1;
if( places && places <= 10 ) {
n = parseFloat(n.toFixed(places));
} else if(((n.toString().split('.') )[1]).toString()
.length > 10) {
n = parseFloat( n.toFixed(10) );
}
n = n.toString().split('.');
dLength = n[1].length;
numerator = parseInt(n[0]+n[1]);
while(true) {
denominator += '0';
if(i == dLength) {break;}
i++;
}
denominator = parseInt(denominator);
gcd = Math.gcd(numerator, denominator);
return (numerator/gcd).toString() + '/' + (denominator/gcd)
.toString();
}
}
});
} catch(e) {}
})(Number);