Search code examples
sqlsql-serversql-server-2012primes

SQL Prime number function


If I have a number X and want to say IsPrime(X) = true/false using sql-server what is the best approach?

Do I just import a table of primes or is there an algorithm that is fairly efficient for the smaller primes?

Note: I'm not interested in numbers greater than approx. 10 million.

Ended up using the following:

CREATE FUNCTION [dbo].[isPrime]
(
    @number INT
)
RETURNS VARCHAR(10)

BEGIN


    DECLARE @retVal VARCHAR(10) = 'TRUE';

    DECLARE @x INT = 1;
    DECLARE @y INT = 0;

    WHILE (@x <= @number )
    BEGIN

            IF (( @number % @x) = 0 )
            BEGIN
                SET @y = @y + 1;
            END

            IF (@y > 2 )
            BEGIN
                SET @retVal = 'FALSE'
                BREAK
            END

            SET @x = @x + 1

    END

    RETURN @retVal
END

Solution

  • You could, as you said, have a table that stores all the primes up to 10 million. Then it would be trivial to look up whether a number was prime or not. The question then is which method would be faster. I suspect the table would be much faster (I have not tested this claim).

    Prime Table Solution

    SQL Function Solutions

    Solution 0

    Here's one solution via Finding prime numbers with a Transact-SQL function:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    –- =============================================
    –- Author:        Nicolas Verhaeghe
    –- Create date: 12/14/2008
    –- Description:   Determines if a given integer is a prime
    /*
    
          SELECT dbo.IsPrime(1)
    
          SELECT dbo.IsPrime(9)
    
          SELECT dbo.IsPrime(7867)
    
    */
    –- =============================================
    CREATE FUNCTION [dbo].[isPrime]
    (
          @NumberToTest int
    )
    RETURNS bit
    AS
    BEGIN
          -– Declare the return variable here
          DECLARE @IsPrime bit,
                      @Divider int
    
          –- To speed things up, we will only attempt dividing by odd numbers
    
          –- We first take care of all evens, except 2
          IF (@NumberToTest % 2 = 0 AND @NumberToTest > 2)
                SET @IsPrime = 0
          ELSE
                SET @IsPrime = 1 –- By default, declare the number a prime
    
          –- We then use a loop to attempt to disprove the number is a prime
    
          SET @Divider = 3 -– Start with the first odd superior to 1
    
          –- We loop up through the odds until the square root of the number to test
          –- or until we disprove the number is a prime
          WHILE (@Divider <= floor(sqrt(@NumberToTest))) AND (@IsPrime = 1)
          BEGIN
    
                –- Simply use a modulo
                IF @NumberToTest % @Divider = 0
                      SET @IsPrime = 0
                –- We only consider odds, therefore the step is 2
                SET @Divider = @Divider + 2
          END  
    
          –- Return the result of the function
          RETURN @IsPrime
    
    END
    
    Solution 1

    Here's another solution via how to find whether is a prime or non prime with one select statement? There's more information in other comments as well.

    CREATE FUNCTION isPrime
    (
        @number INT
    )
    RETURNS VARCHAR(10)
    BEGIN
        DECLARE @prime_or_notPrime INT
        DECLARE @counter INT
        DECLARE @retVal VARCHAR(10)
        SET @retVal = 'FALSE'
    
        SET @prime_or_notPrime = 1
        SET @counter = 2
    
        WHILE (@counter <= @number/2 )
        BEGIN
    
            IF (( @number % @counter) = 0 )
            BEGIN
                set @prime_or_notPrime = 0
                BREAK
            END
    
            IF (@prime_or_notPrime = 1 )
            BEGIN
                SET @retVal = 'TRUE'
            END
    
            SET @counter = @counter + 1
        END
        return @retVal
    END