I Nombres premiers Question 1: recherche naïve Question 2: liste

I Nombres premiers
Question 1: recherche naïve
On teste simplement la divisibilté éventuelle de l'entier n par tous les entiers p compris entre 2
et n-1. Le test retourne 1 si l'entier est premis.
> estPremier:=proc(n)
local test, k;
test:=1; for k from 2 to n-1 do
if n mod k =0 then test:= 0; fi;
od;
test;
end:
Question 2: liste des nombres premiers
On teste la primalité de tous les entiers de 2 à n et on conserve dans un tableau ceux qui sont
premiers. La variable compt est augementée de 1 à chaque rencontre d'un nombre premier.
> petitsPremiers:=proc(n)
local k, compt; global premier;
compt:=0;
for k from 2 to n do if estPremier(k)=1 then compt:=compt +1;
premier[compt]:=k; fi;od;
compt;
end:
> Z:=petitsPremiers(100):
> seq(premier[r],r=1..Z);
, , , , , , , , , , , , , , , , , , , , , , , ,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
Question 3: seconde liste en limitant les calculs
Le test de primalité est plus rapide car, pour un entier n donné, si on a deux diviseurs p et q tels
que pq=n, p>1, q>1, il y a obligatoiremnt un des deux entiers inférieur ou égal à racine carrée
de n. Il n'est donc pas nécessaire de faire les tests de divisibilité pour p > racine carrée (n).
> petitsPremiers2:=proc(n)
local k,test,r,compt;
global premier;
premier[1]:=2;k:=3;
compt:=1;if n > 2 then
while k <= n do
test:=1;
r:=3;while r^2 <= k do
if k mod r = 0 then test:= 0 fi;
r:=r+2;od;
if test=1 then compt:=compt+1;
premier[compt]:=k;fi;
k:=k+2;
od;
fi;
compt;
end:
> Z:=petitsPremiers2(500):
> seq(premier[i],i=1..Z);
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, , , , , , , , , , , , , , , , , , , , , , , , ,
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191, , , , , , , , , , , , , , , , , ,
193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283, , , , , , , , , , , , , , , , , ,
293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401, , , , , , , , , , , , , , , , , ,
409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499, , , , , , , , , , , , , , ,
Question 4: Crible d'Erathostène
La procédure proposée suit exactement le principe du crible d'Erathostène. On met en évidence
les multiples d'un entier r donné (qui ne sont donc pas premiers) en affectant la valeur 1 à
Tab[ir].
> petitsPremiers3:=proc(n)
local Tab,k,i,r,s ;
global premier;
Tab:=array[2..n];for k from 2 to n do Tab[k]:=0;od;
# initialisation du tableau
i:=1;
while i <= n do
s:=i+1; while Tab[s]=1 do s:=s+1;od;
# Recherche de l'entier premier suivant i
i:=s;
r:=2;
while i*r<= n do Tab[i*r]:=1; r:=r+1;od;
# suppression des multiples de i
od;
s:=1; for k from 2 to n do if Tab[k]=0 then premier[s]:=k;
s:=s+1;fi;od;
s-1;end:
> Z:=petitsPremiers3(200):
> seq(premier[k],k=1..Z);
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, , , , , , , , , , , , , , , , , , , , , , , , ,
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191, , , , , , , , , , , , , , , , , ,
193 197 199, ,
Question 5: Factorisation d'un entier
Mise en place de l'algorithme proposé dans l'énoncé.
> factoriser:=proc(n)
local N,i,j,p,m;
global premier, facteur;
petitsPremiers3(n);
m:=n; i:=0;j:=0;
while m > 1 do
i:=i+1; p:=premier[i];
while(irem(m,p)=0) do
j:=j+1; facteur[j]:=p;m:=iquo(m,p);
od;
od;
j;end:
> factoriser(2520):
> seq(facteur[i],i=1..7); , , , , , ,2 2 2 3 3 5 7
Question 6: factoriser sans table de nombres premiers
La procédure reprend exactement la calcul fait "à la main" pour décomposer un entier en
facteurs premiers.
> factoriser2:=proc(n)
local m,j,q; global facteur;
m:=n;j:=0;
while (irem(m,2)=0) do j:=j+1; m:=iquo(m,2); facteur[j]:=2;
od; # On effectue les divisions successives de n par 2
q:=1;
while m>1 do q:=q+2;
if q^2> m then j:=j+1; facteur[j]:=m;m:=1;
else while ( irem (m,q)=0) do j:=j+1;
facteur[j]:=q; m:=iquo(m,q);
od;fi;
od;
j;
end:
> Z:=factoriser2(2205336):
> seq(facteur[k],k=1..Z);
, , , , ,2 2 2 3 7 13127
II Reconnaître les
puissances
Question 7: comptage des multiplicités
On reprend l'algorithme précédent en comptant le nombre de répétitions de chaque facteur
premier.
> calculerAlpha:=proc(n)
local m,k,q,s; global alpha;
m:=n; s:=0; k:=0;
while irem(m,2)=0 do s:=s+1; m:=iquo(m,2); od;
if s> 0 then k:=k+1; alpha[k]:=s; fi; # recherche des
puissances éventuelles de 2
q:=1;
while m>1 do
q:=q+2;
if q^2 > m then k:=k+1; alpha[k]:=1; m:=1;
else s:=0;
while(irem(m,q)=0) do s:=s+1;m:=iquo(m,q); od;
if s>0 then k:=k+1; alpha[k]:=s; fi;
fi;
od;
k;
end:
> Z:=calculerAlpha(14286*9*25):seq(alpha[k],k=1..Z);
, , ,1 3 2 1
Question 8: Recherche des nombres de la forme a^b
On détermine les multiplicités des facteurs premiers de n et on vérifie si elles sont ou non
multiples de b.
> estPuissance:=proc(n,b)
local N, i, test ; global alpha;
N:=calculerAlpha(n);
i:=1;
while i<=N and ( irem(alpha[i],b)=0) do
i:=i+1;
od;
if i>N then test:=1 else test:=0; fi;
test;
end:
> estPuissance (1016255020032,5);
1
Question 9: Recherche de carrés (b=2)
Soit n un entier donné, n>1. On peut rechercher le plus grand entier p tel que p^2 soit inférieur
ou égal à n. Puis on regarde si p^2=n.
> estCarre:= proc(n)
local i,test;
i:=2; while i^2<=n do i:=i+1;od;
if (i-1)^2=n then test:=1 else test:=0; fi;
test;
end;
estCarre nproc( ) :=
local ;,i test
:= i2;
while do end do^i2n := i + i1 ;
if then else end if
= ^( )i1 2 n := test 1 := test 0 ;
test
end proc
> estCarre(225);
1
III. Nombres de
Carmichaël
Question 10: Tester si un entier est un nombre de
Carmichael
On effectue la factorisation de n et on vérifie la condition de définition. On reprend
l'algorithme vu en question 6.
> estCarmichael:=proc(c)
local test,m,q;
test:=1; m:=c;
if irem (n,2)=0 then test:=0 fi;
q:=1;
while (m>1) and test =1 do
q:=q+2;
if q^2 > m then
if m=c then test :=0
else if (irem(c-1,m-1)<>0) then test:=0
fi;
m:=1;fi;
elif irem(m,q)=0 then
m:=iquo(m,q);
if irem(m,q)=0 or (irem(c-1,q-1)<>0) then test:=0;
fi:
fi;
od;
test;
end:
> estCarmichael(1105);
1
Question 11: recherche des nombres de Carmichael produit
de trois facteurs premiers.
On suit les indications de l'énoncé. On détermine les nombres premiers inférieurs à n, on
effectue les produits de trois premiers distincts et on vérifie si on a un nombre de
Carmichael.
> calculerCarmichael3:=proc(n)
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !