Prime number calculation fun

前端 未结 18 1770
深忆病人
深忆病人 2020-12-05 15:32

We\'re having a bit of fun here at work. It all started with one of the guys setting up a Hackintosh and we were wondering whether it was faster than a Windows Box of (nearl

18条回答
  •  粉色の甜心
    2020-12-05 15:52

    I found this code somewhere on my machine when I started reading this blog entry about prime numbers. The code is in C# and the algorithm I used came from my head although it is probably somewhere on Wikipedia. ;) Anyway, it can fetch the first 150000 prime numbers in about 300ms. I discovered that the sum of the n first odd numbers is equal to n^2. Again, there is probably a proof of this somewhere on wikipedia. So knowing this, I can write an algorithm that wil never have to calculate a square root but I have to calculate incrementally to find the primes. So if you want the Nth prime, this algo will have to find the (N-1) preceding primes before! So there it is. Enjoy!

    
    //
    // Finds the n first prime numbers.
    //
    //count: Number of prime numbers to find.
    //listPrimes: A reference to a list that will contain all n first prime if getLast is set to false.
    //getLast: If true, the list will only contain the nth prime number.
    //
    static ulong GetPrimes(ulong count, ref IList listPrimes, bool getLast)
    {
        if (count == 0)
            return 0;
        if (count == 1)
        {
            if (listPrimes != null)
            {
                if (!getLast || (count == 1))
                    listPrimes.Add(2);
            }
    
            return count;
        }
    
        ulong currentSquare = 1;
        ulong nextSquare = 9;
        ulong nextSquareIndex = 3;
        ulong primesCount = 1;
    
        List dividers = new List();
    
        //Only check for odd numbers starting with 3.
        for (ulong curNumber = 3; (curNumber  (nextSquareIndex % div) == 0) == false)
                    dividers.Add(nextSquareIndex);
    
                //Move to next square number
                currentSquare = nextSquare;
    
                //Skip the even dividers so take the next odd square number.
                nextSquare += (4 * (nextSquareIndex + 1));
                nextSquareIndex += 2;
    
                //We may continue as a square number is never a prime number for obvious reasons :).
                continue;
            }
    
            //Check if there is at least one divider for the current number.
            //If so, this is not a prime number.
            if (dividers.Exists(div => (curNumber % div) == 0) == false)
            {
                if (listPrimes != null)
                {
                    //Unless we requested only the last prime, add it to the list of found prime numbers.
                    if (!getLast || (primesCount + 1 == count))
                        listPrimes.Add(curNumber);
                }
                primesCount++;
            }
        }
    
        return primesCount;
    }
    

提交回复
热议问题