Épreuve pratique 2009, sujet 105

samedi 7 novembre 2009
par  Alain BUSSER

Sujet de spécialité sur les nombres en division harmonique. Un test de primalité sur les nombres de Mersenne premiers est nécessaire mais vite créé (en modifiant le début du TP).

Les nombres 32 et 140

Pour calculer le nombre de diviseurs de 32 et la somme de leurs inverses, une seule boucle suffit. On initialise une variable diviseurs (le nombre de diviseurs) à zéro, et on l’incrémente chaque fois qu’on trouve un diviseur (avec « diviseurs++ »). De même on initialise une variable somme et on lui ajoute l’inverse du diviseur chaque fois qu’on en trouve un.

Voici le résultat :

/*Programme tp 105a
*/
var somme=0,diviseurs=0;
for(d=1;d<=32;d=d+1){
	if(32%d==0){
		diviseurs++;
		somme=somme+1/d;
	}
}
Println(diviseurs/somme);

Son exécution sous CaRMetal donne 3,0476190476190474 comme quotient, ce qui révèle que 32 n’est pas en division harmonique.

En remplaçant dans le script ci-dessus les deux occurences de 32 par 140, on obtient un quotient de 5 ce qui montre que 140 est en division harmonique.


Nombres premiers

La question suivante consiste à chercher les cinq plus petits nombres de Mersenne premiers.

Une modification du script précédent permet d’y arriver sans calcul formel : Il suffit de compter les diviseurs (un nombre étant premier lorsqu’il en a deux), et de mettre le tout dans une boucle. Le nombre 17 qui clôt la boucle a été trouvé par tâtonnements (moins que 17, on a moins de 5 nombres premiers, et plus que 17, c’est inutile).

Voici le nouveau script :

/*Programme tp 105b
*/
for(n=2;n<=17;n=n+1){
	var qn=Math.pow(2,n+1)-1;
	var diviseurs=0;
	for(d=1;d<=qn;d=d+1){
		if(qn%d==0){
			diviseurs++;
		}
	}
	if(diviseurs==2){
		Println(n+","+qn);
	}
}

Elle produit les valeurs suivantes [1] :

valeur de n Nombre premier
2 7
4 31
6 127
12 8191
16 131071

On y apprend notamment que 131071 est un nombre premier de Mersenne.


Nombres en division harmonique

Pour finir le TP, il reste à panacher les deux scripts précédents :

/*Programme tp 105a
*/
var n=2;
var qn=Math.pow(2,n+1)-1;
var an=Math.pow(2,n)*qn;
var somme=0,diviseurs=0;
for(d=1;d<=an;d=d+1){
	if(an%d==0){
		diviseurs++;
		somme=somme+1/d;
	}
}
Println(diviseurs+","+somme+","+diviseurs/somme);

En remplaçant 2 par les autres valeurs de n trouvées précédemment, on construit au fur et à mesure le tableau suivant :

Valeur de n Nombre de diviseurs Somme des inverses
2 6 2
4 10 2
6 14 2
12 26 2

où on voit que le nombre de diviseurs étant pair, et la somme des inverses égale à 2, ces nombres sont en division harmonique.

Pour n=12, il faut presque une minute pour avoir le résultat.

n=16 semble au-delà des possibilités de CaRMetal (et n’était d’ailleurs pas demandé dans l’énoncé du TP : « si possible »...). Ceci dit, wxmaxima confirme que pour n=16 aussi, la somme des inverses des diviseurs est 2 :


[1En fait le tableau a été engendré au format spip par une légère modification du script.


Commentaires