1. Introduction

"Le monde des nombres premiers s'organise autour de quelques vérités faciles à assimiler. Les principales sont qu'il existe une infinité de nombres premiers,et que tout nombre entier se décompose d'une façon unique en un produit de nombres premiers." (Jean-Paul Delahaye4, Mars 2002. Merveilleux nombres premiers. Imprimé en France par I.M.E.-25110 Baume-les-Dames : Pour la Science.)

Les nombres premiers sont des nombres entiers naturels qui, par définition, sont divisible par deux diviseurs distinct : eu-même et un. Ces nombres ne sont pas aisément calculable. Certaines méthodes ont été élaborées dans le but de les calculer ou de vérifier qu'ils soient bien des nombres premiers. Ce projet ne se basera cependant sur aucune de ces méthodes et n'utilisera donc que la "méthode du crible" lors de ses recherches de nombres premiers. L'objectif de ce projet ne sera pas d'établir un record du plus grand nombres premiers jamais découvert comme il est mode dans ce domaine, il sera, dans des mesures plus modestes, de fournir à l'utilisateur les nombres premiers qu'il souhaitera trouvez dans un certain intervalle défini ou alors de lui indiquer si un nombre est premier ou pas.

2. Matériel et méthodes

Le matériel?

  1. Un crayon, du papier pour poser gris sur blanc l'objectif final et se donner une idée de l'agencement du code .
  2. Un ordinateur, un clavier, une souris (pour le confort des déplacements graphiques) comme matériel de base pour coder.
  3. Notepad++ pour aider à y voir clair.
  4. Un navigateur internet, avec un accès à http://fr.openclassrooms.com/ afin d' apprendre des fonctions encore inconnues et ainsi aider à coder.

La méthode utilisée dans la recherche de nombres premiers, comme mentionné plus haut, est le criblage d'un nombre. Pour être plus explicite pour savoir si un nombre est premier ou pas il suffit d'essayer de le diviser par tous les nombres entiers naturels qui précèdent sa racine carrée. En effet si l'on définit un entier naturel par N=Q*M, avec Q et N des entiers naturels, lorsque Q=M ils valent la racine de N. M et Q sont inversement proportionnels (N/Q=M et N/M=Q) et donc lorsque Q>sqrt(N) alors obligatoirement M<sqrt(N). Dans un criblage tel que celui utilisé ici la valeur de M aura déjà été testé en tant que Q, il est donc inutile de dépasser la racine de N.

@@@@
 function Prem1(nb1){//Fonction qui détermine si un nombre est premier ou non(true or false).
   var div=2;//Cette variable servira de diviseur au nombre testé
   var prems=false;//Celle-ci sera mise à true si le nombre est premier
   while (div<=nb1) {
   	if (nb1%div==0 && div<nb1){
   	prems=false;
   	div=nb1+1;
   	} 
   	else if (div>Math.sqrt(nb1)){
   	prems=true;
   	div++;
   	}
   	else{
   	div++;
   	}
   }
   return (prems);
  }

Cette fonction pourrait être améliorée dans bien des aspects mais, du fait qu'elle fonctionne et que le but de ce travail n'est pas de créer la fonction la plus optimisée pour déterminer si un nombre est premier ou non, il n'était pas utile de s'y attarder.

Cette fonction rempli donc presque le deuxième objectif de ce projet qui est de pouvoir savoir si un nombre est premier ou non. Il manque encore un moyen de faire parvenir l'information envoyée par l'utilisateur et de lui faire parvenir en retour l'information qu'il demande. L'utilisation de popup javascript aurait été une solution mais ça n'est graphiquement pas très agréable d'avoir une page blanche devant soi, surmontée d'un petit rectangle gris. Il a donc fallu utiliser la méthode suivante :

@@@@
	   <div class="divA" id="div2">
		<form name="form2" id="form2">
			<p>
			Vous voulez savoir si un nombre est premier? Vérifiez-le de suite :
			<input type="number" min="0 " max="9999999999" name="nbC" value="2" id="nbC"/>
			<input type="button" onclick="e2();" value="Tester!"/>
			</p>
		</form>
	   </div>

Les informations entrées par un utilisateur dans la page se trouvaient dans "la branche" <form> du document sous le "name" form2 et la valeur désirée était celle insérée dans la balise <input> de "name" nbC. Il a donc fallut l' assigner à une variable javascript de la manière suivante :

   var nb1=parseInt(document.form2.nbC.value);

La fonction parseInt() étant présente pour modifier le type d'information enregistrée, en effet les valeurs envoyée par "document.form2.nbC.value" était de type "string" ou chaîne de caractère ce qui empêchait la comparaison des nombres en tant que tels. ParseInt() transformait donc les "string" en "number" et rendait donc le traitement de cette information possible.

Le renvois de l'information était similaire, il suffisait d'indiquer en javascript à l'ordinateur de prendre un élément HTML et de le modifier au niveau du langage HTML, ainsi grâce à la méthode suivante :

document.getElementById('div4').innerHTML = "";

il était possible de modifier la page web sans la recharger. Ici javascript récupère l'élément ayant l'id "div4" et le modifie pour qu'il n'y aie rien à l'intérieur. L'ajout d'une réponse pour l'utilisateur est faites entre les guillemets. Exemple :

document.getElementById('div4').innerHTML = nb1+" est premier!";

Ici le bloque "div4" sera modifié pour indiquer que la valeur de la variable nb1 "est premier!".

Le deuxième objectifs du projet, qui est le plus simple, est donc réalisé. Le deuxième objectif quand à lui nécessitait un moyen de stocker les nombres trouvés dans l'intervalle de nombres avant de les redonner à l'utilisateur. Le meilleur moyen trouvé a été de les insérer dans un objet javascript de type "tableau". Cette variable qui contient une suite de valeurs peut être modifiée aisément en y ajoutant simplement de nouvelles valeurs. Une fonction qui passait un par un les nombre de l'intervalle désiré dans la fonction Prem1 présentée plus haut les enregistrait donc dans un tableau javascript lorsque la valeur retournée par Prem1 était vraie (true). Finalement il a fallu retourner l'information à l'utilisateur. Pour ce faire, la même méthode que celle utilisée précédemment a été adoptée mais cette fois avec un ajout de ligne et de cellule d'un tableau HTML :

@@@@
 function addLigne(tableauJS){//Cette fonction convertit les tableau javascript en un tableau HTML.
 var tabHtml= document.getElementById("tab1");
 var adL;//variable qui ajoutera une ligne
 var adC;//variable qui ajoutera une colonne.
 var nL=Math.ceil(tableauJS.length/7);//nombre de ligne sachant qu'une ligne aura une longueur max de 7
 var nC;//nombre de colonne (défini en fonction de la ligne).
 var ligne=1;//Nème ligne
 var colonne;//Nème colonne
 var i=0;//position du nombre premier dans le tableau javascript
 document.getElementById("tab1").innerHTML ="";//nettoie le tableau avant d'en recréer un nouveau.
	while (ligne<=nL){
	colonne=0;
	adL=tabHtml.insertRow(-1);
		if(ligne==nL && tableauJS.length%7!=0){//définition du nombre de colonne.
		nC=tableauJS.length%7;//calcule du nombre de cellule par ligne.
		}
		else{
		nC=7;
		}
		while (colonne<=nC-1){
		i=7*(ligne-1)+colonne;//calcul de la position dans le tableauJS du nombre premier qui sera inscrit dans la
 case du tableau HTML. 
		adC=adL.insertCell(colonne);	
		adC.innerHTML += tableauJS[i];
		colonne++;
		}
	ligne++;
	}
 }

Cette fonction calcule le nombre de lignes et de cellules par ligne (avec un maximum de 7 cellules par lignes), et les ajoutes à un tableau HTML, qu'elle aura vidé auparavant, si il contenait quelque chose, et insère dans chaque case la valeur du tableau javascript qui lui correspond. Cette fois deux méthodes sont utilisées pour donner l'information en HTML :

 .insertRow(-1); 

qui ajoute une ligne à la fin (d'ou le -1, ce qui veut dire "ajoute une ligne après la ligne d'avant la fin") du tableau HTML et :

 .insertCell(n);

qui ajoute une cellule à la position (n) de la ligne (La première position étant 0, la deuxième 1 etc...). ".insertRow()" s'applique à un tableau HTML déjà existant qui peut être enregistré dans une variable javascript comme dans le code au-dessus :

 var tabHtml= document.getElementById("tab1");

Le première objectif du projet est donc atteint de cette manière.

3. Résultats

Malgré ses nombreux défauts, le code fonctionne parfaitement bien. Résultat ici!

4. Discussion

Le code comme je l'ai sus-mentionné pourrait être largement optimisé et certaine fonction, comme celle qui transforme le tableau javascript en tableau HTML pourrait être généralisé de façon à transcrire n'importe quelle variable tableau dans le tableau HTML désiré.

5. Conclusion

En conclusion, le travail qu'a nécessité ce projet force la réflexion sur la façon d'agencer un code et de l'optimiser. Les possibilités qui restent à explorer suite à ce projet seraient justement d'optimiser ce code et de généraliser certaines fonctions afin de pouvoir y ajouter de nouvelles fonctionnalités. Un exemple de fonctionnalité pourrait être une fonction qui décompose un nombre en facteurs premiers et les indique à l'utilisateur sous forme d'un tableau HTML. L'utilité peut paraître moindre, car il est aisé de faire ce genre de déduction et de calcul manuellement, mais l'économie de temps, que cette page web apporte lorsqu'il faut appliquer ces calculs à une quantité conséquente de nombres ou que ces nombres sont trop grands, n'est pas négligeable.

Sources

"http://fr.openclassrooms.com/" avec les cours suivant :

"http://fr.openclassrooms.com/informatique/cours/maitriser-les-tableaux-html-avec-javascript" par Pilou Face

"http://fr.openclassrooms.com/informatique/cours/dynamisez-vos-sites-web-avec-javascript" par Johann Pardanaud et Sébastien de la Marck : "Je suis passionné du Web et plus surtout du Javascript et je trouve que ce langage doit être maitrisé au même titre qu'HTML, CSS et PHP !"

"http://fr.openclassrooms.com/informatique/cours/apprenez-a-creer-votre-site-web-avec-html5-et-css3", rédigé par Mathieu Nebra, Entrepreneur à temps plein, auteur à temps plein et fondateur d'OpenClassrooms.

"http://www.toutjavascript.com/reference/reference.php?ref=parseInt" par Toutjavascript.com