DECLARE @c int = 1000;
DECLARE @numbers TABLE (n int NOT NULL PRIMARY KEY);
DECLARE @products TABLE (p int NOT NULL PRIMARY KEY);
DECLARE @primes TABLE (p int NOT NULL PRIMARY KEY);
-- The 'composite exclusion' approach
-- 1. list all n = 2, 3, 4, ... c
WITH numbers AS
(
SELECT 2 AS n
UNION ALL
SELECT n + 1 FROM numbers
WHERE n <= @c - 1
)
INSERT INTO @numbers SELECT n FROM numbers OPTION(MAXRECURSION 0);
-- 2. find all products n x n <= c
WITH products AS
(
SELECT DISTINCT m.n * n.n AS p
FROM @numbers m LEFT OUTER JOIN
@numbers n ON 1 = 1
WHERE m.n * n.n <= @c
)
INSERT INTO @products SELECT p FROM products;
-- 3. numbers with no matching products are not composite, i.e, they're prime numbers.
INSERT INTO @primes
SELECT n.n FROM @numbers n LEFT JOIN @products p ON n.n = p.p WHERE p.p IS NULL;
Es ist eine Art One-Pass-Sieb von Eratosthenes Ansatz.Ist das ein guter Algorithmus zum Auflisten von Primzahlen?
Ich habe Schleifen, gespeicherte Prozeduren und dergleichen sowie Pseudocode- und andere Sprachimplementierungen gesehen, aber es scheint mir, dass dieser einfache, mengenbasierte Ansatz, der aus der Definition von Primzahlen resultiert, ausreichen sollte.
Bitte beachten Sie, dass ich nicht auf Leistung oder Speicherverbrauch oder Optimierungen zu diesem Zeitpunkt, und ich habe es nicht mit größeren Zahlen getestet. Ich möchte nur den Algorithmus veröffentlichen und die Leute bestätigen lassen (oder herausfordern), dass das Ausschließen von zusammengesetzten Zahlen aus der Liste ausreicht.
(1) Dies ist keine Kommentarseite für die Angemessenheit von Algorithmen, daher ist Ihre Frage unklar. (2) Warum möchten Sie Primzahlen in einer Datenbank erzeugen? (3) Wenn du das Sieb von Eratosthenes in einer Datenbank erstellen willst, generiere alle gewünschten Zahlen, lege sie in eine Tabelle und benutze 'delete', um die zusammengesetzten Zahlen loszuwerden. –
Vielen Dank für Ihre Kommentare. Ich denke, die richtige Frage war, ob es einen besseren Algorithmus gibt - und da ist die Tally-Tabelle. Dies war nur eine Übung; Ich glaube, ich suchte nach einem "nur einfügen", leicht zu lesen Ansatz; Der Tally-Ansatz ist weniger lesbar, aber bei weitem billiger als meins. – thor2k