Décomposition en facteurs premiers

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 608 fois - Téléchargée 17 fois

Contenu du snippet

Ce petit programme javascript permet de décomposer un grand nombre en produits de nombres premiers.

Une version directement utilisable à cette adresse:

http://minilog.freehostia.com/Decomposition_en_facteurs_premiers.php

Source / Exemple :


<html>

<head>
	<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
</head>

<script language="javascript" type="text/javascript">

var JC , JCV , textea , nb2 , nb1 , nb , limite , i , j , x , caract , sup1 , sup2 , choice_affich;

function init(){document.getElementById("defaut_affich").checked = true;}

function choice_affiche(value){choice_affich = value;}

function affich(a)// je met cette fonction ainsi pour ceux qui désire modifier le mode d'affichage....
{
	document.getElementById("texte_2").innerHTML = a;
}

function choixcaract(form)
{
	if(choice_affich == 2)
	{
		caract = "*";
		sup1 = "^";
		sup2 = "";
	}
	else
	{
		if(choice_affich == 1){caract = " . ";}
		else{caract = " × ";}
		sup1 = "<sup>";
		sup2 = "</sup>";
	}
}

function JCVD(x)//...Security
{
	JC = parseInt(x);
	JCV = JC.toString();
	if(JCV.length == x.length && JCV != "NaN"){return Math.abs(JC);}
	else{return 0;}
}

function process(form)
{
	nb = JCVD(form.fact.value);

    textea = "===> " + nb + " = ";

	if(nb <= 2)
	{
		if(nb != 2){textea += "Ni premier ni composé.";}
		else{textea += "Nombre premier.";}
	}
	else
	{
		choixcaract(form);
		nb1 = nb;
        j = 0;
        i = 2;
        x = 0;
        limite = Math.sqrt(nb1) + 1;

        while(1)
		{
			if(i>limite)
            {
				if(nb == nb1){textea += "Nombre premier.";}
                else
                {
					if(nb1 > 1){textea += caract + nb1;}
                }
                break;
            }

			nb2=nb1/i;

            if(nb2 - Math.floor(nb2) > 0.0000000000001)
            {
				if(j > 0)
                {
					if(x != 0){textea += caract;}
					else{x = 1;}
                    if(j == 1){textea += i;}
                    else{textea += i + sup1 + j + sup2;}
                    j=0;
                }

                i++;
            }
            else
            {
				j++;
                nb1=nb2;
            }
		}
	}
}

</script>

<body onLoad="init();" lang="fr-FR">

<h1 >Décomposition en facteurs premiers</h1>

<p align="center">Lors de la saisie d'un grand chiffre, une fenêtre "Attention: le script ne répond pas" peut s'afficher.
<br />Si c'est le cas, cliquez sur "Continuer" autant de fois que cette fenêtre se réactualisera.
<br />Et si toutefois le calcul est trop long vous pouvez toujours cliquer sur "Arrêter le script".
<br /><br />Indiquez dans le champ ci-dessous un chiffre (entier) à décomposer en facteurs premiers, puis, appuyez sur la touche "Entrée" de votre clavier ou cliquez sur "Décomposer".
</p>

<br>
<form name="decomposition" action="javascript:affich(textea);" onsubmit = "javascript:process(this);">
  <input type="radio" name="choice_aff" value="0" onChange="choice_affiche(this.value);" id="defaut_affich"/> Affichage basique
  <br />
  <input type="radio" name="choice_aff" value="1" onChange="choice_affiche(this.value);"/> Signe de multiplication "."
  <br />
  <input type="radio" name="choice_aff" value="2" onChange="choice_affiche(this.value);"/> Affichage en chaîne mathématique utilisable dans une calculatrice informatique (pour copier-coller)
  <br /><br />
  <input type="text" name="fact"/>
  <br />
  <input type="submit" value="Décomposer"/>
</form>

<br /><p align="center"><font color="#000000"><strong><i id="texte_2"></i></strong></font></p>

</body>
</html>

A voir également

Ajouter un commentaire Commentaires
Messages postés
21
Date d'inscription
dimanche 31 janvier 2010
Statut
Membre
Dernière intervention
10 juin 2011
3
Merci de ta contribution PROFTNJ. J'ai opéré des modifications dans l'option d'affichage en reprenant un peu de ton idée. J'ai divisé l'option en 3:
-Basique
-Symbole "X" ou "."
-Chaîne mathématique insérable dans un système de calcul informatique standard par copier-collé (cela m'a été demandé par JDMCREATOR [cf: premier commentaire], en tout cas j'ai compris ça comme cela)
Messages postés
54
Date d'inscription
lundi 10 juillet 2006
Statut
Membre
Dernière intervention
11 septembre 2011

De très petites modifications pour que l'affichage du résultat soit compréhensible par de jeunes étudiants:

--------------------

<script language="javascript" type="text/javascript">
function affich(a)// je met cette fonction ainsi pour ceux qui désire modifier le mode d'affichage....
{
document.getElementById("texte_2").innerHTML=a;
}
function choixcaract(form)
{
if(form.choice.checked){return " . ";}
else{return " × ";}
}
var JC , JCV;
function JCVD(x)//...Security
{
JC=parseInt(x);
JCV=JC.toString();
if(JCV.length==x.length && JCV!="NaN"){return Math.abs(JC);}
else{return 0;}
}
var textea , nb2 , nb1 , nb , limite , i , j , x , caract;
function process(form)
{
nb=JCVD(form.fact.value);
textea="résultat : "+nb+" = ";
if(nb<=2)
{
if(nb!=2){textea +="Ni premier ni composé.";}
else{textea +="Nombre premier.";}
}
else
{
caract=choixcaract(form);
nb1=nb;
j=0;
i=2;
x=0;
limite=Math.sqrt(nb1)+1;
while(1)
{
if(i>limite)
{
if(nb==nb1){textea +="Nombre premier.";}
else
{
if(nb1>1){textea +=caract+nb1;}
}
break;
}
nb2=nb1/i;
if(nb2-Math.floor(nb2)>0.0000000000001)
{
if(j>0)
{
if(x!=0){textea +=caract;}
else{x=1;}
if(j==1){textea +=i;}
else{textea +=i+""+j+"";}
j=0;
}
i++;
}
else
{
j++;
nb1=nb2;
}
}
}
}
</script>
Messages postés
21
Date d'inscription
dimanche 31 janvier 2010
Statut
Membre
Dernière intervention
10 juin 2011
3
@AMROUNIX,

j'ai testé ton code que je trouvais bien, mais je me suis aperçu qu'il est beaucoup plus gourmand en ressource que le mien lorsque j'ai entré 98765432198998
En effet, à la saisie de ce chiffre avec ton code, le navigateur lance la fenêtre "le script ne répond pas" ce qui est normal avec de si grand chiffre, mais ne semble pas reprendre, ou met énormément de temps à finir ça tâche, une fois que l'on clique sur continuer. Alors que celui de la source fini avant d'en arriver à la fameuse fenêtre.

Ton code aborde une approche plus "technique" que mathématique du javascript qui manifestement semble préjudiciable au niveau des performances.
Messages postés
79
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
12 juillet 2010

voila une version un peu plus détaillé, prêt à être copier-coller dans un fichier

<html>
<script language="javascript">
/*
methode de composition en facteur premier
x : valeur , lst : tableau de la décomposition
*/
function pgc(x,lst)
{
i = 2; /*on test de division de x/i avec i allant de 2 à x/2 ( ca sert à rien d'alleur au dessus) */
fin = parseInt(x/2,10) + 1;
while (i<fin) /*on boucle jusqu'a fin (si ca sort c'est qu'il y'a plus de division possible) */
{
if (x%i==0) /*test du modulo de x par i (modulo : resultat de la division, si ==0 alors le nombre est divisible) */
{
lst.push(i); /*si le nombre est divisible alors on le met dans la liste*/
return pgc(parseInt(x/i,10),lst); /*on rappel la méthode en récursive*/
}
i++; /*on incrément i pour la boucle, ca signifie que le nombre n'est pas divisible par i */
}
if (i==fin||x<2) /*on récupère le dernier élement (+cas extrême) et on le place dans la liste*/
{
lst.push(x);
}
/*on retourne la liste*/
return lst;
}

/*méthode de calcul et d'affichage de la décomposition
val : valeur a décomposer */
function calcul(val)
{
/*test si c'est un chiffre*/
if (!(/^\d+$/).test(val)) {alert("ce n'est pas un nombre !"); return;}
/*récupère la liste a décomposer*/
listDecompose = pgc (parseInt(val,10),new Array());
/*affiche la réponse en séparant les éléments de la liste par "*" */
document.getElementById("resultat").value = listDecompose.join("*");
}

</script>

Entrer un nombre :

Resultat de la décomposition :

</html>
Messages postés
21
Date d'inscription
dimanche 31 janvier 2010
Statut
Membre
Dernière intervention
10 juin 2011
3
C'est bien mais il faudrait expliquer l'algorithme de ton code... histoire qu'on s'y retrouve ^^. Personnellement je ne suis pas arrivé à le faire fonctionner... . Tu devrait y accoler un formulaire et reposter.
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.