--- id: 5eb3e4aa847216613aa81983 title: Semiprime challengeType: 5 forumTopicId: 385318 --- ## Description
Semiprime numbers are natural numbers that are products of exactly two (possibly equal) prime numbers.
1679  =  23 x 73
## Instructions
Write a function that returns true if a number is semiprime, or false if it is not.
## Tests
```yml tests: - text: isSemiPrime should be a function. testString: assert(typeof isSemiPrime === 'function'); - text: isSemiPrime(100) should return a boolean. testString: assert(typeof isSemiPrime(100) === 'boolean'); - text: isSemiPrime(100) should return false. testString: assert.equal(isSemiPrime(100), false); - text: isSemiPrime(504) should return false. testString: assert.equal(isSemiPrime(504), false); - text: isSemiPrime(4) should return true. testString: assert.equal(isSemiPrime(4), true); - text: isSemiPrime(46) should return true. testString: assert.equal(isSemiPrime(46), true); - text: isSemiPrime(13) should return false. testString: assert.equal(isSemiPrime(13), false); - text: isSemiPrime(74) should return true. testString: assert.equal(isSemiPrime(74), true); - text: isSemiPrime(1679) should return true. testString: assert.equal(isSemiPrime(1679), true); - text: isSemiPrime(2) should return false. testString: assert.equal(isSemiPrime(2), false); - text: isSemiPrime(95) should return true. testString: assert.equal(isSemiPrime(95), true); - text: isSemiPrime(124) should return false. testString: assert.equal(isSemiPrime(124), false); ```
## Challenge Seed
```js function isSemiPrime(n) { } ```
## Solution
```js function isSemiPrime(n) { if (n <= 3) return false; var ans = []; var done = false; while (!done) { if (n % 2 === 0) { ans.push(2); n /= 2; continue; } if (n % 3 === 0) { ans.push(3); n /= 3; continue; } if (n === 1) return ans.length == 2; var sr = Math.sqrt(n); done = true; // try to divide the checked number by all numbers till its square root. for (var i = 6; i <= sr; i += 6) { if (n % (i - 1) === 0) { // is n divisible by i-1? ans.push(i - 1); n /= i - 1; done = false; break; } if (n % (i + 1) === 0) { // is n divisible by i+1? ans.push(i + 1); n /= i + 1; done = false; break; } } } ans.push(n); return ans.length == 2; } ```