Skip to content

Instantly share code, notes, and snippets.

@Woodsphreaker
Last active June 19, 2017 01:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Woodsphreaker/4b87cd82a096d86193f288e9a54d192e to your computer and use it in GitHub Desktop.
Save Woodsphreaker/4b87cd82a096d86193f288e9a54d192e to your computer and use it in GitHub Desktop.
Prime Number Check
const generateRangeOfNumbers = (start = 0, end = 1) =>
Array.from({ "length": (end + 1) - start }, (notUsed, index) => start + index)
const isInteger = (number) => Number.isInteger(number)
const squareRoot = (number) => Math.sqrt(number)
const isIntegerSqrt = (number) => isInteger(squareRoot(number))
const isBiggerThan = (divisors) => (number) =>
number > Math.max(...divisors)
const mergeInArray = (x, y) => [].concat(x, y)
const hasExactDivisor = (divisor) => (dividend) => divisor % dividend === 0
const hasExactSquareRoot = (number) =>
isIntegerSqrt(number)
? mergeInArray(number, squareRoot(number))
: number
const divisors = generateRangeOfNumbers(1, 9)
const hasBigger = isBiggerThan(divisors)
const allDivisors = (number) =>
hasBigger (number)
? mergeInArray(divisors, hasExactSquareRoot(number))
: divisors
const theNumber = (number) => {
return {
yesIsPrime: `O numero ${number} é primo, pois só existem dois divisores exatos [${primeTest(number)}]`,
notIsPrime: `Ops, o numero ${number} não é primo, pois é divisivel por mais de 2 números inteiros [${primeTest(number)}]`
}
}
const sort = (list) => list.sort((a, b) => a > b)
const primeTest = (number) => sort(allDivisors(number).filter(hasExactDivisor(number)))
const hasONLYTwoDivisors = (number) => primeTest(number).length === 2
const isPrime = (number) =>
hasONLYTwoDivisors(number)
? theNumber(number)["yesIsPrime"]
: theNumber(number)["notIsPrime"]
const tests = [10, 25, 5, 289, 10003, 10004, 100003, 100004, 361]
tests.forEach(number =>
console.log(isPrime(number))
)
/*
Ops, o numero 10 não é primo, pois é divisivel por mais de 2 números inteiros [1,2,5,10]
Ops, o numero 25 não é primo, pois é divisivel por mais de 2 números inteiros [1,5,5,25]
O numero 5 é primo, pois só existem dois divisores exatos [1,5]
Ops, o numero 289 não é primo, pois é divisivel por mais de 2 números inteiros [1,17,289]
Ops, o numero 10003 não é primo, pois é divisivel por mais de 2 números inteiros [1,7,10003]
Ops, o numero 10004 não é primo, pois é divisivel por mais de 2 números inteiros [1,2,4,10004]
O numero 100003 é primo, pois só existem dois divisores exatos [1,100003]
Ops, o numero 100004 não é primo, pois é divisivel por mais de 2 números inteiros [1,2,4,100004]
Ops, o numero 361 não é primo, pois é divisivel por mais de 2 números inteiros [1,19,361]
*/
@suissa
Copy link

suissa commented Jun 17, 2017

As refatorações que eu faria:

  • colocar em uma função o Math.max(...divisors)
  • colocar em uma função o [].concat(divisors,number)
  • colocar em uma função o number % cur === 0
  • colocaria em uma função as respostas q são texto

@suissa
Copy link

suissa commented Jun 17, 2017

E sua função final não demonstra o que vc quer fazer

const isPrime = (number) => primeTest(number).length === 2 ? O numero ${number} é primo:Ops, o numero ${number} não é primo, pois é divisivel por mais de 2 números inteiros [${primeTest(number)}]

Eu sei o pq mas uma pessoa normal nao saberia o pq disso: primeTest(number).length === 2

@suissa
Copy link

suissa commented Jun 17, 2017

E outra não são todos números q podem ser divididos por 1 ao 9.

Exemplo o 289 que só é dividido por 17 e não por 9 nem 3 que são divisores do 9.

@wdiasvargas
Copy link

tem um jeito de resolver isso com testes de primalidade, no momento to tentando refatorar esse codigo
function isPrime(n) {
if (n == 2 || n == 3 || n == 5 || n == 7) {
return true;
} else if ((n < 2) || (n % 2 == 0)) {
return false;
} else {
for (var i = 3; i <= Math.sqrt(n); i += 2) {
if (n % i == 0)
return false;
}
return true;
}
}
https://rosettacode.org/wiki/Primality_by_trial_division#JavaScript

https://github.com/wdiasvargas/primality_tests/tree/master/trial_division

@Woodsphreaker
Copy link
Author

Finalizei o refat, acho que agora ficou melhor.
Testei alguns casos aqui é acho que está cumprindo o proposto.
Qualquer contribuição será muito bem vinda :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment