division euclidienne de polynômes

Exemples inclassables dans les sous-forums précédents...
... et des trucs et astuces à connaitre.
Règles du forum
ATTENTION ! Il est demandé de ne déposer dans ce forum que des exemples
  • finalisés
  • que l'on pense intéressants et optimisés
  • et qui se rapportent au thème du forum.
Si certains exemples déposés donnent lieu à de nombreuses modifications, ils seront déplacés et remplacés par un nouveau sujet dans ce forum avec la ou les meilleures propositions.
Pour les demandes d'aide ... il y a un forum spécifique !

division euclidienne de polynômes

Message non lupar ouagatex » Sam 20 Mar 2010, 17:19

Bonjour à tous,

Je produis tous mes dessins (cours, DS...) avec latex+Asymptote depuis quelque temps. J'ai beaucoup profité des contributions de Philippe Ivaldi et de Gaëtan Marris.
Je les en remercie chaleureusement.
Voici une modeste contribution. C'est une extension qui permet d'effectuer et de dessiner une division euclidienne de polynômes.
Ca traine depuis deux ans sur mon disque dur, si ça peut être utile à quelqu'un j'en serais content.
Je ne l'ai moi même qu'assez peu utilisée, elle est peut-être buggée: vérifier avec xcas ne coûte pas cher.

Edition par GM le 22/03 : une version modifiée du code suivant est proposée dans une réponse qui suit.

voici le fichier diveucl_dev.asy à mettre au bon endroit (sous linux dans ~/.asy/)
Code: Tout sélectionner
void diveucli(picture pic=currentpicture,
                real[] dividende,
                real[] diviseur,
                real xunite=12mm,
                real yunite=8mm)
{

unitsize(pic,xunite,yunite);

real[] divid,divis,sous;
divid=dividende;
divis=diviseur;
int l1=divid.length, l2=divis.length;
real a,b,p,q,s;
pair Q,S,D;
string ch;

for(int i=0; i < l1; ++i){
a=l1-i-1;
b=dividende[i];
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
draw(pic,ch,(i,0));
}
draw(pic,(l1,.5)--(l1,-3));
draw(pic,(l1,-.5)--(l1+l2+1,-.5));
for(int i=0; i < l2; ++i){
a=l2-i-1;
b=diviseur[i];
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
draw(pic, ch,(i+l1+1,0));
}

// on initialise les positions des polynomes
Q=(l1+1,-1);
S=(0,-1);
D=(0,-2);

while(divis.length<=divid.length){
//for(int i=0; i < 1; ++i){

p=divid.length-divis.length;
q=divid[0]/divis[0];

// on ecrit un bout de quotient
a=p;
b=q;
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
draw(pic, ch,Q);

sous=q*divis;
s=sous.length;

// on ecrit ce qu'on soustrait au dividende
for(int j=0; j < s; ++j){
a=s-j-1+p;
b=sous[j];
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
draw(pic, ch,S+(j,0));
}

// on cree le nouveau dividende
l1=divid.length;
for(int j=0; j < l1-s; ++j){ sous.push(0);}
draw(pic,S+(-0.5,-0.5)--S+(s-0.5,-0.5));
divid=divid-sous;
l1=divid.length;

// on ecrit le nouveau dividende
for(int j=0; j < l1; ++j){
a=l1-j-1;
b=divid[j];
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
draw(pic, ch,D+(j,0));
}
// on vire les zeros du debut du dividende
a=0;
while(divid[0]==0){
divid.delete(0);
a=a+1;
}
Q=Q+(1,0);
S=S+(a,-2);
D=D+(a,-2);
}
}


et voici le code dessinant une petite division:

Code: Tout sélectionner
import diveucl_dev;
picture dessin;
real[] dividende={1,3,3,7,-34,16},diviseur={1,3,-2};
diveucli(dessin,dividende,diviseur,12mm,8mm);
shipout(dessin);
ouagatex
 
Messages: 4
Inscription: Sam 20 Mar 2010, 15:31

Re: division euclidienne de polynômes

Message non lupar GM » Sam 20 Mar 2010, 21:19

Je n'ai pas encore testé, je le ferai... mais déjà un grand merci pour l'intention. :)
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 627
Inscription: Dim 7 Mar 2010, 14:50

Re: division euclidienne de polynômes

Message non lupar GM » Sam 20 Mar 2010, 23:41

ouagatex a écrit:Je ne l'ai moi même qu'assez peu utilisée, elle est peut-être buggée: vérifier avec xcas ne coûte pas cher.

Il y a une erreur avec l'exemple suggéré car x^2+3x-2 divise x^5+3x^4+3x^3+7x^2-34x+16 mais cela fonctionne en remplaçant par x^5+3x^4+3x^3+7x^2-34x+17.
Donc il y a apparemment une amélioration à apporter ... (pour le cas où le reste est nul ??).
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 627
Inscription: Dim 7 Mar 2010, 14:50

Re: division euclidienne de polynômes

Message non lupar ouagatex » Dim 21 Mar 2010, 14:40

Ok, merci, je me penche sur la question!
ouagatex
 
Messages: 4
Inscription: Sam 20 Mar 2010, 15:31

Re: division euclidienne de polynômes

Message non lupar ouagatex » Dim 21 Mar 2010, 23:14

Mille excuses, je ne voyais pas le bug chez moi tout simplement parce que j'avais posté une vieille version de l'extension! Je me suis emmêlé les pinceaux :oops: .
J'ai en fait l'impression que le copier-coller que j'ai fait d'emacs n'a pas bien fonctionné. C'était une version qui trainait dans mon presse papier.

Voici donc diveucl_dev.asy qui annule et remplace mon code précédent:

Code: Tout sélectionner
void diveucli(picture pic=currentpicture,
                real[] dividende,
                real[] diviseur,
                real xunite=12mm,
                real yunite=8mm)
{

unitsize(pic,xunite,yunite);

real[] divid,divis,sous;
divid=dividende;
divis=diviseur;
int l1=divid.length, l2=divis.length;
real a,b,p,q,s;
pair Q,S,D;
string ch;

for(int i=0; i < l1; ++i){
a=l1-i-1;
b=dividende[i];
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
label(pic,ch,(i,0));
}
draw(pic,(l1,.5)--(l1,-3));
draw(pic,(l1,-.5)--(l1+l2+1,-.5));
for(int i=0; i < l2; ++i){
a=l2-i-1;
b=diviseur[i];
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
label(pic, ch,(i+l1+1,0));
}

// on initialise les positions des polynomes
Q=(l1+1,-1);
S=(0,-1);
D=(0,-2);

while(divis.length<=divid.length){
//for(int i=0; i < 1; ++i){

p=divid.length-divis.length;
q=divid[0]/divis[0];

// on ecrit un bout de quotient
a=p;
b=q;
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
label(pic, ch,Q);

sous=q*divis;
s=sous.length;

// on ecrit ce qu'on soustrait au dividende
for(int j=0; j < s; ++j){
a=s-j-1+p;
b=sous[j];
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
label(pic, ch,S+(j,0));
}

// on cree le nouveau dividende
l1=divid.length;
for(int j=0; j < l1-s; ++j){ sous.push(0);}
draw(pic,S+(-0.5,-0.5)--S+(s-0.5,-0.5));
divid=divid-sous;
l1=divid.length;

// test pour savoir si le dividende est vide
bool bo=false;
for(int j=0; j< divid.length; ++j){bo= (bo | divid[j]!=0);}

// on ecrit le nouveau dividende
if(bo){
for(int j=0; j < l1; ++j){
a=l1-j-1;
b=divid[j];
if(b==0){ch="";} else{
if(a==0){
         if(0<b){ch="$+" + (string) b + "$";}
          else {ch="$" + (string) b + "$";}
        }
else{
     if(a==1){
              if(0<b){ch="$+" + (string) b+"x$";}
              else {ch="$" + (string) b+"x$";}
             }
     else{
          if(0<b){ch="$+" + (string) b+"x^{" + (string) a + "}$";}
          else {ch="$" + (string) b+"x^{" + (string) a + "}$";}
         }
    }
}
label(pic, ch,D+(j,0));
}}
else{label(pic,"$0$",D+(divid.length-1,0));}

// on vire les zeros du debut du dividende
a=0;
while(divid[0]==0 & 1<divid.length){
divid.delete(0);
a=a+1;
}
Q=Q+(1,0);
S=S+(a,-2);
D=D+(a,-2);
}
}


J'attends les prochains bugs :mrgreen:
ouagatex
 
Messages: 4
Inscription: Sam 20 Mar 2010, 15:31

Re: division euclidienne de polynômes

Message non lupar GM » Lun 22 Mar 2010, 13:54

ouagatex a écrit:Mille excuses, je ne voyais pas le bug chez moi tout simplement parce que j'avais posté une vieille version de l'extension !

Je me suis permis d'éditer ton premier message pour indiquer le message comportant la bonne version.

ouagatex a écrit:J'attends les prochains bugs :mrgreen:

Mais non, mais non... ;-)
Je testerai un peu plus tard. Merci.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 627
Inscription: Dim 7 Mar 2010, 14:50

Re: division euclidienne de polynômes

Message non lupar ouagatex » Lun 22 Mar 2010, 17:16

Je me suis permis d'éditer ton premier message pour indiquer le message comportant la bonne version.


pas de souci, merci

Je pense qu'il doit être assez simple "d'étendre" cette extension afin qu'elle effectue également les divisions euclidiennes d'entiers (à ce sujet je crois que Jean-Côme Charpentier a produit une extension latex qui pose les quatre opérations) . Si j'ai le temps un de ces jours, j'essaierai de voir ça.
ouagatex
 
Messages: 4
Inscription: Sam 20 Mar 2010, 15:31

Re: division euclidienne de polynômes

Message non lupar mumblee » Mer 31 Mar 2010, 11:02

ouagatex a écrit:Je pense qu'il doit être assez simple "d'étendre" cette extension afin qu'elle effectue également les divisions euclidiennes d'entiers (à ce sujet je crois que Jean-Côme Charpentier a produit une extension latex qui pose les quatre opérations) . Si j'ai le temps un de ces jours, j'essaierai de voir ça.

C'est xlop
Fabrice Eudes
mumblee
 
Messages: 14
Inscription: Jeu 11 Mar 2010, 10:29
Localisation: Lille


Retourner vers Autres exemples - Trucs et astuces

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité