DÉCOMPOSITION EN FACTEURS PREMIERS

jdmcreator Messages postés 647 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 20 juillet 2012 - 5 avril 2010 à 15:16
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 - 23 août 2010 à 15:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51516-decomposition-en-facteurs-premiers

Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
23 août 2010 à 15:07
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)
proftnj Messages postés 54 Date d'inscription lundi 10 juillet 2006 Statut Membre Dernière intervention 11 septembre 2011
23 août 2010 à 03:18
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>
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
11 août 2010 à 14:09
@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.
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
13 juil. 2010 à 16:00
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>
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
13 juil. 2010 à 15:19
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.
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
12 juil. 2010 à 17:16
j'ai ecrit un petit bout de code qui te retourne la même chose :

<script language="javascript">
function pgc(x,lst)
{
i = 2;
fin = parseInt(x/2,10) + 1;
while (i<fin)
{
if (x%i==0)
{
lst.push(i);
return pgc(parseInt(x/i,10),lst);
}
i++;
}
if (i==fin)
{
lst.push(x);
}
return lst;
}

lstDiviz = pgc(11*11*13*17*5*11,new Array());
alert(lstDiviz.join(","));
</script>
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
6 avril 2010 à 02:25
Si j'essaie de comprendre, tu voudrait que la fonction process utilise un return au lieu du "document.getElementById('...').innerHTML" (qu'elle n'utilise qu'une seule fois par processus). Et que je fasse une fonction d'affichage qui utiliserai ce return en "document.getElementById('...').innerHTML" ... Si c'est le cas c'est franchement inutile ici (sur un plan fonctionnel en tout cas). Mais bon, ça ne pose pas de problème à modifier.
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
6 avril 2010 à 02:05
J'avoue que j'ai du mal à comprendre ce que tu demandes, ou plutôt je ne saisi pas l'intérêt. Le mieux serait que tu reprennes un bout de ma source en appliquant tes modifications et que tu la poste ensuite en commentaire. Je pourrait voir par la suite ce que j'ai peut-être oublié dans ma programmation où si c'est tout simplement pertinent.
jdmcreator Messages postés 647 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 20 juillet 2012 7
6 avril 2010 à 01:15
Non, ce n'est pas ce que je voulais dire

C'est plutôt de retourner la valeur de ta fonction process plutôt que de modifier la valeur de ton DIV.... J'ai du mal à m'expliquer...
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
6 avril 2010 à 00:16
Merci de ton commentaire JDMCREATOR.

En ce qui concerne la fonction test que tu as écrit, je pense que la fonction JCVD qui est déjà implémenté fait ce fameux test.

function JCVD(x)//...Security
{
JC=parseInt(x);// transforme une chaîne de caractère en valeur numérique (tout ce qui n'est pas numérique est effacé, ainsi que ce qu'il y a après...)
JCV=JC.toString();// transforme une valeur numérique en chaîne de caractère
if(JCV.length==x.length){return Math.abs(JC);}// si la chaîne de caractère dans JCV est de taille identique à celle dans x (c'est à dire qu'il n'y a avait aucun caractère alpha lors du passage par parseInt()), renvoyer la valeur absolue de de JC (qui est égal à x dans ce cas).
else{return 0;}// autrement renvoyer la valeur 0...(ce qui affichera ni premier ni composé, bref pas bon ^^)
}

function process(form)

{
nb=JCVD(form.fact.value);// ici je fait passer le contenu du textarea dans JCVD qui me renverra dans la variable nb la valeur si il n'y a aucuns caractères autres que numérique ou un 0 dans le cas contraire...
//.......
}

Si ce n'est pas ce à quoi je suis sensé penser lorsque tu me parle de fonction test fait le moi savoir ^^.

Pour ce qui est des 2*3*17 au lieu des 2 x 3 x 17 je peut bien évidement modifier/rajouter pour que cela soit possible.
jdmcreator Messages postés 647 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 20 juillet 2012 7
5 avril 2010 à 15:23
Quelque chose du genre :

function test(tn){
/*On modifie la chaîne tn*/

return tn;
}

document.getElementById('...').innerHTML=test(form.fact.value);

Si tu vois ce que je veux dire ;)
jdmcreator Messages postés 647 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 20 juillet 2012 7
5 avril 2010 à 15:17
Zut, on ne peut pas changer les commentaires

Si j'aurais remarqué, j'aurais un peu baissé ta note car ta fonction est en brute : elle utilise la valeur d'un textarea. Passe plutôt la chaîne à décomposer dans un argument.
jdmcreator Messages postés 647 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 20 juillet 2012 7
5 avril 2010 à 15:16
Bonjour =)

Cette fonction est pas mal mieux optimisé que celle que j'avais faite il y a 1 an et qui m'avait valu un 1 ^^ (Je n'étais pas très bon)

De plus, j'aime beaucoup la fonctionnalité de mettre les exposants à la place de plusieurs nombre indiques =)

Par contre, peut-être pourrais-tu penser à mettre une option qui permet de retourner le code en une chaîne mathématique utilisable ;)

Ex : 2 x 3 x 17 serait 2*3*17

Du bon travail ;)