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
entiers premiers inférieurs à un nombre donné
: on écrit les entiers de 2 à
et on barre les multiples des nombres
premiers inférieurs à
. 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]