Most efficient code for the first 10000 prime numbers?

前端 未结 30 1398
日久生厌
日久生厌 2020-11-29 19:09

I want to print the first 10000 prime numbers. Can anyone give me the most efficient code for this? Clarifications:

  1. It does not matter if your code is ineffici
相关标签:
30条回答
  • 2020-11-29 19:24

    Sieve of Eratosthenes is the way to go, because of it's simplicity and speed. My implementation in C

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <math.h>
    
    int main(void)
    {
        unsigned int lim, i, j;
    
        printf("Find primes upto: ");
        scanf("%d", &lim);
        lim += 1;
        bool *primes = calloc(lim, sizeof(bool));
    
        unsigned int sqrtlim = sqrt(lim);
        for (i = 2; i <= sqrtlim; i++)
            if (!primes[i])
                for (j = i * i; j < lim; j += i)
                    primes[j] = true;
    
        printf("\nListing prime numbers between 2 and %d:\n\n", lim - 1);
        for (i = 2; i < lim; i++)
            if (!primes[i])
                printf("%d\n", i);
    
        return 0;
    }
    

    CPU Time to find primes (on Pentium Dual Core E2140 1.6 GHz, using single core)

    ~ 4s for lim = 100,000,000

    0 讨论(0)
  • 2020-11-29 19:25

    Using GMP, one could write the following:

    #include <stdio.h>
    #include <gmp.h>
    
    int main() {
      mpz_t prime;
      mpz_init(prime);
      mpz_set_ui(prime, 1);
      int i;
      char* num = malloc(4000);
      for(i=0; i<10000; i++) {
        mpz_nextprime(prime, prime);
        printf("%s, ", mpz_get_str(NULL,10,prime));
      }
    }
    

    On my 2.33GHz Macbook Pro, it executes as follows:

    time ./a.out > /dev/null
    
    real    0m0.033s
    user    0m0.029s
    sys    0m0.003s
    

    Calculating 1,000,000 primes on the same laptop:

    time ./a.out > /dev/null
    
    real    0m14.824s
    user    0m14.606s
    sys     0m0.086s
    

    GMP is highly optimized for this sort of thing. Unless you really want to understand the algorithms by writing your own, you'd be advised to use libGMP under C.

    0 讨论(0)
  • 2020-11-29 19:25
    def compute_primes(bound):
    """
    Return a list of the prime numbers in range(2, bound)
    Implement the Sieve of Eratosthenes
    https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
    """
    primeNumber = [True for i in range(bound + 1)]
    start_prime_number = 2
    primes = []
    while start_prime_number * start_prime_number <=bound:
        # If primeNumber[start_prime_number] is not changed, then it is a prime
        if primeNumber[start_prime_number]:
            # Update all multiples of start_prime_number
            for i in range(start_prime_number * start_prime_number, bound + 1, start_prime_number):
                primeNumber[i] = False
        start_prime_number += 1
    
    # Print all prime numbers
    for start_prime_number in range(2, bound + 1):
        if primeNumber[start_prime_number]:
            primes.append(start_prime_number)
    
    return primes
    

    print(len(compute_primes(200)))

    print(len(compute_primes(2000)))

    0 讨论(0)
  • 2020-11-29 19:26

    The Sieve of Atkin is probably what you're looking for, its upper bound running time is O(N/log log N).

    If you only run the numbers 1 more and 1 less than the multiples of 6, it could be even faster, as all prime numbers above 3 are 1 away from some multiple of six. Resource for my statement

    0 讨论(0)
  • 2020-11-29 19:26

    I have written this using python, as I just started learning it, and it works perfectly fine. The 10,000th prime generate by this code as same as mentioned in http://primes.utm.edu/lists/small/10000.txt. To check if n is prime or not, divide n by the numbers from 2 to sqrt(n). If any of this range of number perfectly divides n then it's not prime.

    import math
    print ("You want prime till which number??")
    a = input()
    a = int(a)
    x = 0
    x = int(x)
    count = 1
    print("2 is prime number")
    for c in range(3,a+1):
        b = math.sqrt(c)
        b = int(b)
        x = 0
        for b in range(2,b+1):
            e  = c % b
            e = int(e)
            if (e == 0):
                x = x+1
        if (x == 0):
            print("%d is prime number" % c)
            count = count + 1
    print("Total number of prime till %d is %d" % (a,count))
    
    0 讨论(0)
  • 2020-11-29 19:26

    I can give you some tips, you have to implement it.

    1. For each number, get the half of that number. E.g. for checking 21, only obtain the remainder by dividing it from range 2-10.
    2. If its an odd number, only divide by odd number, and vice versa. Such as for 21, divide with 3, 5, 7, 9 only.

    Most efficient method I got up to so far.

    0 讨论(0)
提交回复
热议问题