जैसा कि आपने कहा, आपके पास एक तालिका हो सकती है जो 10 मिलियन तक के सभी प्राइम्स को संग्रहीत करती है . तब यह देखना तुच्छ होगा कि कोई संख्या अभाज्य थी या नहीं। सवाल यह है कि कौन सी विधि तेज होगी। मुझे संदेह है कि तालिका बहुत तेज़ होगी (मैंने इस दावे का परीक्षण नहीं किया है)।
प्राइम टेबल सॉल्यूशन
-
https:// www.simple-talk.com/sql/t-sql-programming/celkos-summer-sql-stumpers-prime-numbers/
कुछ समाधान प्रदान करता है और टिप्पणियों में और भी हैं। -
https:// sqlserverfast.com/blog/hugo/2006/09/the-prime-number-challenge-great-waste-of-time/
यहां वही है। कुछ समाधान दिए गए।
एसक्यूएल फ़ंक्शन समाधान
समाधान 0यहां ट्रांजैक्ट-एसक्यूएल फ़ंक्शन के साथ अभाज्य संख्याएं ढूंढना :
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
समाधान 1 यहां के माध्यम से एक और समाधान दिया गया है। कैसे पता करें कि एक चयन कथन के साथ अभाज्य है या अभाज्य? अन्य टिप्पणियों में भी अधिक जानकारी है।
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