next up previous
suivant: Décomposition des entiers en monter: Deuxième exemple d'application en précédent: Deuxième exemple d'application en

Tests et cribles

Nous pouvons tester si un nombre est premier :


$ »$ test1:=proc(n)

$ »$ local L;

$ »$ begin

$ »$ L:=[]; # On crée une liste, vide au départ, pour y placer les éventuels diviseurs de n#

$ »$ for i from 2 to floor(sqrt(n)) do # floor signifie partie entière #

$ »$ if n mod i = 0 then L:=L.[i]: end_if # si le reste est nul, on ajoute i à la liste #

$ »$ end_for;

$ »$ if L=[] then print(expr2text(n). " est premier" ); # si L est vide, n est premier #

$ »$ else print(expr2text(n). " n'est pas premier" ); end_if

$ »$ end_proc:


$ »$ test1(1321235158);

"1321235158 n'est pas premier"


$ »$ test1(101!+1);

Error: Computation aborted; during evaluation of 'test1'


Ce test a donc des limites et nécessitera de nombreuses améliorations.


Mais nous pouvons faire mieux : nous pouvons obtenir rapidement une liste des $ petits$ entiers premiers inférieurs à un nombre donné $ n$ : on écrit les entiers de 2 à $ n$ et on barre les multiples des nombres premiers inférieurs à $ \sqrt{n}$. Les entiers restant sont premiers. Nous ne sommes pas les premiers à avoir eu cette idée, Eratosthène l'a eu avant nous en 240 avant JiCé.

$ »$ Erato:=proc(n)

$ »$ local x,i,y,P;

$ »$ begin

$ »$ x := array(1..n); # On crée une liste de n nombres #

$ »$ for i from 1 to n do

$ »$ x[i]:=1; #ces nombres valent tous 1 au départ#

$ »$ end_for;

$ »$ x[1]:=0; #1 n'est pas premier donc on le "raye" en lui associant 0#

$ »$ for y from 2 to floor(sqrt(n)) do #on teste les entiers jusqu'à Vn (floor = partie entière)#

$ »$ if(x[y]=1) then #si le yème nombre n'est pas barré#

$ »$ for i from 2 to floor(n/y) do

$ »$ x[i*y]:=0; #on barre tous ses multiples#

$ »$ end_for;

$ »$ end_if;

$ »$ end_for;

$ »$ P:=[]; #on crée une liste vide#

$ »$ for i from 1 to n do

$ »$ if(x[i]=1) then P:= P.[i]; #on ajoute tous les entiers non barrés#

$ »$ end_if;

$ »$ end_for;

$ »$ P; #on affiche la liste des entiers restant : ils sont premiers#

$ »$ end_proc:


Cela nous donne :


$ »$ Erato(100);

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]


next up previous
suivant: Décomposition des entiers en monter: Deuxième exemple d'application en précédent: Deuxième exemple d'application en
moi 2005-06-08