Anthony
Anthony

Reputation: 21

finding the nth prime javascript

the functions below are supposed to spit out the nth prime number. However, it keeps on spitting out 3. Can somebody please help? Cheers, Anthony

function Prime(num) {
output = true  
    for (i=2 ; i<num ; i++) {
        if (num%i === 0)  {
           output = false ; break
        }
    }
return output
}

function PrimeMover(num) {
var count = 0
    for (i=2 ; i<10000 ; i++)  {
        if (Prime(i) === true) {
            count = count + 1 
        }
        if (count === num) {
            return i
            break
        } 
    }
}

Upvotes: 0

Views: 9786

Answers (7)

New contributor
New contributor

Reputation: 162

So, I decided to optimise the hell out of the code (cuz why not). It is almost 6 times as fast as that of ppseprus (297ms vs 1773ms in nth_prime(100000)).

let primes = [2, 3]; 

const nth_prime = (n) => {
    if (n <= primes.length) return primes[n - 1]; // handle values which have been cached

    let i = 1; 
    
    while (1){
        const a = 6 * i - 1, b = 6 * i + 1, a_limit = Math.sqrt(a), b_limit = Math.sqrt(b); // the 6n - 1 and 6n + 1 rule for primes
        let a_prime = true, b_prime = true; 

        i++; 
        
        // prime check

        for (const prime of primes){
            if (prime > a_limit) break; 
            if (a % prime == 0){
                a_prime = false; 
                break; 
            }
        }
        
        if (a_prime){
            if (primes.length + 1 == n) return a; 
            primes.push(a); // cache
        }
        
        for (const prime of primes){
            if (prime > b_limit) break; 
            if (b % prime == 0){
                b_prime = false; 
                break; 
            }
        }
        
        if (b_prime){
            if (primes.length + 1 == n) return b; 
            primes.push(b); // cache
        }
    }
}

Upvotes: 1

Sameer Safi
Sameer Safi

Reputation: 1

Try this

var pos=10001;
console.log(primeNumforPos(pos));

function primeNumforPos(pos){
  var num=2,curPos=0;
  while(curPos<=pos){
    if(isPrime(num)){
      curPos++;
    }
    if(curPos==pos){
      return num;
    }else{
      num++;
    }
  }
}

function isPrime(num){
  for(var i=2;i<=Math.sqrt(num);i++){
    if(num%i==0){
      return false;
    }
  }
  return true;
}

Upvotes: 0

Saju
Saju

Reputation: 1

const findPrime = num => {
let i, primes = [2, 3], n = 5
const isPrime = n => {
    let i = 1, p = primes[i],
        limit = Math.ceil(Math.sqrt(n))
    while (p <= limit) {
        if (n % p === 0) {
            return false
        }
        i += 1
        p = primes[i]
    }
    return true
}
for (i = 2; i <= num; i += 1) {
    while (!isPrime(n)) {
        n += 2
    }
    primes.push(n)
    n += 2
};
return primes[num - 1]

} console.time('Time')

let x = findPrime(9999)

console.timeEnd('Time')

console.log(x)

Upvotes: -1

Won
Won

Reputation: 1805

For minimal code lovers,

function nthprime(n)
{
  var prime=[], i=1
  while (i++ && prime.length<n) prime.reduce((a,c)=>(i%c)*a,2) && prime.push(i)
  return prime.length?prime.pop():-1
}
[-1,0,1,2,3,5,10,100].forEach(n=>console.log(`nthprime(${n})=${nthprime(n)}`))

Upvotes: 2

Ashish Yadav
Ashish Yadav

Reputation: 3196

function main(inp) {
  var count = 0;
  for (var i = 2; i <= 100000; i++) {
   if (isPrime(i)) count = count + 1;
   if (count == inp) return i;
 }
}
function isPrime(i) {
 for (var j = 2; j < i; j++) {
  //instead of `j < i` it can be reduced using other conditions 
  if (i % j == 0) {
   return false
  }
 }
 return true
}
main(5) // any number

Upvotes: 1

ppseprus
ppseprus

Reputation: 548

This might be a bit more optimal

function nthPrime(n) {
    var P = 0;

    function isPrime(x) {
        var isPrime= true;

        for (var d = 2; d <= Math.sqrt(x); d++) {
            if((x/d) % 1 == 0) {
                isPrime = false;
                break;
            }
        }

        return isPrime;
    }

    for (var i = 1; 0 < n; i++) {

        if(isPrime(i)) {
            P = i; n--;
        }

        // we can skip the even numbers
        if(3 <= i){
            i++;
        }

    }

    return P;
}

Upvotes: 0

balajisoundar
balajisoundar

Reputation: 571

You have created loop counter i in global scope.so both PrimeMover and Prime mutates same global i.In every iteration ,PrimeMover assigns i=2.After that Prime assigns i=2.your i variable's value will be changed between 2 and 3.use local loop counter variable var i=0;

function Prime(num) {
output = true  
for (var i=2 ; i<num ; i++) { //var i=2
    if (num%i === 0)  {
       output = false ; break
    }
}
return output
}

function PrimeMover(num) {
var count = 0
for (var i=2 ; i<10000 ; i++)  { //var i=2
    if (Prime(i) === true) {
        count = count + 1 
    }
    if (count === num) {
        return i
        break
    } 
}
}

Upvotes: 2

Related Questions