Bonsoir à tous,
Je suis en train de faire des exercices de "style". Le sujet en question est : "Différentes écritures pour la recherche des nombres premiers"
L'algo est celui d'Eratosthène légèrement modifié.
Donc voici le code qui fonctionne :
--
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 -- Creation de la table CREATE TABLE [dbo].[nombre]( [numero] [int] NULL, [multiple] [bit] NOT NULL) ON [PRIMARY] GO --Alimentation de la table insert into dbo.nombre select top 32767 ROW_NUMBER() over (order by nb) as numero, 0 as multiple from (select 0 as nb from sys.all_columns C1 ,sys.all_columns C2 ,sys.all_columns C3 ,sys.all_columns C4 ,sys.all_columns C5 ,sys.all_columns C6,sys.all_columns C7 ,sys.all_columns C8 ,sys.all_columns C9,sys.all_columns C0) as T;
-- Select qui liste les valeurs NON premières entre 3 et 32767
--
-- celui-ci fonctionne : 81456 lignes en 00:00:02
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 declare @limit int ; set @limit =32767; with Curseur(valeurtest) as (select 3 union all select valeurtest+2 from curseur where valeurtest <@limit) ,Discriminant(Valeurmultiple, valeurtest, pas) as (select valeurtest*valeurtest, valeurtest, valeurtest*2 from Curseur union all select Valeurmultiple + valeurtest, valeurtest, pas from Discriminant where Valeurmultiple <@limit) select * from discriminant D join nombre n on n.numero=D.valeurtest order by valeurtest desc, Valeurmultiple option (maxrecursion 32767);
--
-- Et là c'est super long et ça plante !!
--
-- L'instruction a été terminée. La récursivité maximale 32767 a été épuisée avant la fin de l'instruction.
-- 0 lignes en 00:30:08
--
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 declare @limit int ; set @limit =32767; with Curseur(valeurtest) as (select 3 union all select valeurtest+2 from curseur where valeurtest <square(@limit)) ,Discriminant(Valeurmultiple, valeurtest, pas, Mutiple) as (select valeurtest*valeurtest, valeurtest, valeurtest*2,0 from Curseur union all select Valeurmultiple + valeurtest, valeurtest, pas,1 from Discriminant where Valeurmultiple <square(@limit) ) select D.* from discriminant D join nombre n on n.numero=D.valeurtest order by valeurtest desc, Valeurmultiple option (maxrecursion 32767);
--
--
En plus les 2 requêtes ont le même plan d'exécution.
qui a une idée ??
Partager