[Résolu] Représenter une multiplication par jalousie

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[Résolu] Représenter une multiplication par jalousie

Messagepar projetmbc » Lundi 31 Mai 2010, 00:23

Bonjour,
je souhaiterais obtenir le tableau donné dans ce mini-article. Je pense que LaTeX doit pouvoir effecteur les calculs mais là cela dépasse mes compétences. Heureusement j'ai compris le mini-article... :D

L'idéal serait une méthode qui permettent d'aller par exemple jusqu'à une vingtaine de décimales pour chacun des facteurs.

Toute info. est la bienvenue.
Dernière édition par projetmbc le Mardi 01 Juin 2010, 19:45, édité 1 fois.
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Représenter une multiplication par jalousie

Messagepar rebouxo » Lundi 31 Mai 2010, 08:58

Il n'y a rien de tout fait. La seule extension qui s'attaque à ce genre de chose est xlop, mais Jean-Côme n'a pas voulu (eu le temps ?) mettre ce type de présentation dans xlop.

Olivier.
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6920
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar MB » Lundi 31 Mai 2010, 09:28

Et pourquoi ne pas passer par Python (puisque tu es utilisateur) ?
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar projetmbc » Lundi 31 Mai 2010, 09:56

MB a écrit:Et pourquoi ne pas passer par Python (puisque tu es utilisateur) ?

C'est vrai mais dans ce cas, il me faudrait un canevas LaTeX avec par exemple la multiplication par jalousie de 123 par 456.
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar rebouxo » Lundi 31 Mai 2010, 11:26

Cela dit en codant dans un macro les tables de multiplications sous la forme de deux compteurs un pour les dizaines, un pour les unités (cela éviterait de bidouiller le compteur pour récupérer les dizaines et les unités). En suite il faut stocker tout cela dans un tableau ou une liste une macro bien ordonnée. Avec l'extension de Christian (aka unbonpetit) on doit pour voir récupérer nos nombre. Après pour les faire afficher dans un tableau cela ne doit pas être trop compliqué (je pense).

Bon la marge n'est pas assez grande pour écrire...

En écrivant, je me dis qu'il faudra de toute façon décomposer les nombres du départ en u, d, c etc. donc...

Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6920
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar projetmbc » Lundi 31 Mai 2010, 11:36

rebouxo a écrit:Après pour les faire afficher dans un tableau cela ne doit pas être trop compliqué (je pense).

Rien que ça me ferait plaisir, ensuite il est vrai que je pourrais passer par Python pour les cas plus "monstrueux", ce dont j'aurais besoin de toute façon.

Au passage, tout ceci est pour un mini-doc que je ferais sur les algorithmes naïfs sur les opérations avec des décimaux, seule petite distraction que je m'offre en parallèle de mon programme.
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar GMaths » Lundi 31 Mai 2010, 12:48

Je ne sais pas si c'était une des possibilités envisagées ...
... donc j'ai commencé quelque chose avec asymptote ici et ne terminerai l'exemple (amélioration de la syntaxe des arguments passés à la fonction et ajout des derniers calculs) à mon retour de conseil de classe... que si cela intéresse quelqu'un.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar pg » Lundi 31 Mai 2010, 19:40

Voici une façon de faire avec TeX uniquement :

tableau_jalousie_4735_926.png
tableau_jalousie_4735_926.png (13.42 Kio) Vu 2707 fois

(Noter que ce ne sont pas tout à fait les mêmes chiffres que dans le lien donné au début du sujet car le tableau en question est faux.)

Code: Tout sélectionner
\documentclass{article}
\usepackage[frenchb]{babel}% pour \addto
\newcommand*\eaddto[2]{% version développée de \addto
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}
\usepackage{ifthen}% pour \whiledo
\usepackage{slashbox}% pour le tableau
\makeatletter
\def\@nameedef#1{\expandafter\edef\csname #1\endcsname}
\newcounter{tableaujalousie@somme@chiffres}
\newcommand{\tableaujalousie}[2]{%
%Calcul du nombre de colonnes et de lignes
\tableaujalousie@process@number{cols}{#1}%
\tableaujalousie@process@number{rows}{#2}%
% Calcul des éléments du tableau (sauf retenues et sommes partielles)
\def\tableaujalousie@i{1}%
\def\tableaujalousie@j{1}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbrows+1\relax}{%
  \def\tableaujalousie@j{1}%
  \whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
    \tableaujalousie@compute@product
      {\tableaujalousie@i}
      {\tableaujalousie@j}%
    \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
  }%
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
\par
% Création de la liste des indices correspondant au k-ième chiffre du total
\def\tableaujalousie@i{0}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows\relax}{%
  \tableaujalousie@calcule@liste@indices{\tableaujalousie@i}%
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
\par
% Boucle pour calculer les sommes de chiffres et les retenues
\@namedef{tableaujalousie@retenue@0}{0}%
\def\tableaujalousie@i{0}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows\relax}{%
   \setcounter{tableaujalousie@somme@chiffres}{0}%
  \expandafter\@for\expandafter\temp
  \expandafter:\expandafter=\expandafter{\csname
     tableaujalousie@liste@indices@\tableaujalousie@i\endcsname}%
   \do{\ifx\temp\empty
       \else\edef\result{\noexpand\tjnb\temp}%
            \addtocounter{tableaujalousie@somme@chiffres}{\result}%
       \fi}%
  \@nameedef{tableaujalousie@somme@chiffre@\tableaujalousie@i}%
      {\number\value{tableaujalousie@somme@chiffres}}%
   \tableaujalousie@process@retenue{\tableaujalousie@i}%
   \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}
}
% Création du contenu du tableau \tableaujalousie@contenutableau
\def\tableaujalousie@contenutableau{}%
\addto\tableaujalousie@contenutableau{\multicolumn{1}{c}{}}
\def\tableaujalousie@i{1}
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+1\relax}{%
  \eaddto\tableaujalousie@contenutableau{%
     &\noexpand\multicolumn{1}{c}{\@nameuse{tableaujalousie@cols@\tableaujalousie@i}}
  }
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}
\eaddto\tableaujalousie@contenutableau{&\noexpand\\\noexpand\cline{2-\number\numexpr\tableaujalousie@nbcols+1\relax}}

\def\tableaujalousie@i{1}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbrows+1\relax}{%
  \def\tableaujalousie@j{1}%
  \eaddto\tableaujalousie@contenutableau{\@nameuse{tableaujalousie@somme@chiffre@\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows-\tableaujalousie@i\relax}}
  \whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
    \eaddto\tableaujalousie@contenutableau{%
       & \noexpand\tableaujalousie@case
       {\@nameuse{tableaujalousie@\tableaujalousie@i @\tableaujalousie@j @0}}
       {\@nameuse{tableaujalousie@\tableaujalousie@i @\tableaujalousie@j @1}}
       {\ifnum\tableaujalousie@i=1
        \ifnum\@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbcols+\tableaujalousie@nbrows
            -\tableaujalousie@j\relax}=0\else
          \@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbcols+\tableaujalousie@nbrows
            -\tableaujalousie@j\relax}\fi\fi}
       {\ifnum\tableaujalousie@j=\tableaujalousie@nbcols\space
        \ifnum\@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbrows
            -\tableaujalousie@i\relax}=0\else
          \@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbrows
            -\tableaujalousie@i\relax}\fi\fi}%
    }%
    \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
  }%
  \eaddto\tableaujalousie@contenutableau{&\@nameuse{tableaujalousie@rows@\tableaujalousie@i}\noexpand\\\noexpand\cline{2-\number\numexpr\tableaujalousie@nbcols+1\relax}}
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
\eaddto\tableaujalousie@contenutableau{\noexpand\multicolumn{1}{c}{}}
\def\tableaujalousie@j{1}%
\whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
  \eaddto\tableaujalousie@contenutableau{&\noexpand\multicolumn{1}{c}{\@nameuse{tableaujalousie@somme@chiffre@\number\numexpr\tableaujalousie@nbcols-\tableaujalousie@j\relax}}}
  \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
}%
% Affichage du tableau
\begin{center}
\begin{tabular}{c|*{\tableaujalousie@nbcols}{c|}c}
\tableaujalousie@contenutableau
\end{tabular}\par
\smallbreak
$#1 \times #2 = \number\numexpr#1*#2\relax$% a commenter pour éviter tout risque d'arithmetic overflow
\end{center}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% macros pour afficher les cases du tableau
\def\tableaujalousie@strut{\vrule width 0pt height 1.5em depth 0.5em}
\def\tableaujalousie@case#1#2#3#4{%
% #1 = chiffre 2
% #2 = chiffre 1
% #3 = retenue position 1
% #4 = retenue position 2
  \slashbox{\tableaujalousie@strut#1$^{#3}$}{\tableaujalousie@strut#2\rlap{$^{#4}$}}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@process@number{#1}{#2}
%  #1 = suffixe (ici, cols ou rows)
%  #2 = nombre (4735, par exemple)
%  --> lit le nombre #2 et définit
%      * #1 = nombre de chiffres de #2
%      * \tableaujalousie@#1@i = chiffre i de #2 (gauche->droite)
%  exemple : \tableaujalousie@process@number{cols}{4735} définit
%  * cols égal à 4 (nb de chiffres de 4735)
%  * \tableaujalousie@cols@1 égal à 4
%  * \tableaujalousie@cols@2 égal à 7
%  * \tableaujalousie@cols@3 égal à 3
%  * \tableaujalousie@cols@4 égal à 5
\def\tableaujalousie@process@number#1#2{%
% #1 = suffice (cols ou rows)
% #2 = nombre
  \tableaujalousie@process@number@aux{#1}{1}#2\@nil
}
\def\tableaujalousie@process@number@aux#1#2#3#4\@nil{%
% #1 = suffixe (cols ou rows)
% #2 = nombre de chiffres lus
% #3 = chiffre courant
% #4 = chiffres restant
  \ifx\\#4\\
    \@namedef{tableaujalousie@#1@#2}{#3}%
    \@namedef{tableaujalousie@nb#1}{#2}%
  \else
    \@namedef{tableaujalousie@#1@#2}{#3}%
    \tableaujalousie@process@number@aux{#1}{\number\numexpr#2+1\relax}#4\@nil
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@compute@product{#1}{#2}
% #1 = indice de ligne i
% #2 = indice de colonne j
% --> définit des commandes contenant les chiffres du produit \tableaujalousie@cols@j * \tableaujalousie@cols@i :
%     * tableaujalousie@i@j@0 = premier chiffre
%     * tableaujalousie@i@j@1 = second chiffre
% exemples :
%     * si \tableaujalousie@cols@j = 4 et \tableaujalousie@cols@i = 2, alors tableaujalousie@i@j@0 = 0 et tableaujalousie@i@j@1 = 8
%     * si \tableaujalousie@cols@j = 4 et \tableaujalousie@cols@i = 6, alors tableaujalousie@i@j@0 = 3 et tableaujalousie@i@j@1 = 4
\def\tableaujalousie@compute@product#1#2{%
% #1 = indice de ligne i
% #2 = indice de colonne j
  \expandafter\tableaujalousie@parse@twodigit@number\expandafter{\expandafter#1\expandafter}\expandafter{\expandafter#2\expandafter}\expandafter{%
    \number\numexpr
      \@nameuse{tableaujalousie@cols@#2}
      *
      \@nameuse{tableaujalousie@rows@#1}
    \relax
  }%
}
\def\tableaujalousie@parse@twodigit@number#1#2#3{%
% #1 = indice de ligne i
% #2 = indice de colonne j
% #3 = nombre à analyser
  \tableaujalousie@parse@twodigit@number@aux{#1}{#2}#3\@nil
}
\def\tableaujalousie@parse@twodigit@number@aux#1#2#3#4\@nil{%
% #1 = indice de ligne i
% #2 = indice de colonne j
% #3 = premier chiffre à gauche du nombre à analyser
% #4 = reste du nombre à analyser
  \ifx\\#4\\%
    \@namedef{tableaujalousie@#1@#2@0}{0}%
    \@namedef{tableaujalousie@#1@#2@1}{#3}%
  \else
    \@namedef{tableaujalousie@#1@#2@0}{#3}%
    \@namedef{tableaujalousie@#1@#2@1}{#4}%
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@calcule@liste@indices
% #1 = chiffre k
% --> liste des (i,j,e) avec i+j+e=k, i=1,...,nbrows,
%     j=1,...,nbcols et e=0,1
\def\tableaujalousie@calcule@liste@indices#1{%
\@nameedef{tableaujalousie@liste@indices@#1}{%
  \ifnum\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows+1-#1\relax>\tableaujalousie@nbrows\space
    \ifnum\number\numexpr\tableaujalousie@nbcols-#1\relax>0
      \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\tableaujalousie@nbrows\number\numexpr\tableaujalousie@nbcols-#1\relax1\relax
    \else
      \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\tableaujalousie@nbrows\number\numexpr\tableaujalousie@nbcols-#1+1\relax0\relax
    \fi
  \else
    \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\number\numexpr(\tableaujalousie@nbcols+\tableaujalousie@nbrows-#1)\relax10\relax
  \fi}%
}
\def\tableaujalousie@calcule@liste@indices@aux#1#2#3{%
  \ifx\\#1\\%
    %
  \else
    \number\numexpr#1#2#3\relax,%
    \ifnum#3=0
      \ifnum#1>1
            \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\number\numexpr#1-1\relax#2\number\numexpr#3+1\relax\relax
      \fi
    \else
      \ifnum#2<\tableaujalousie@nbcols\space
        \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr#1\number\numexpr#2+1\relax\number\numexpr#3-1\relax\relax
      \fi
    \fi
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tableaujalousie@process@retenue#1{%
% #1 = chiffre k
   \expandafter\tableaujalousie@process@retenue@aux
   \expandafter{\expandafter#1\expandafter}%
   \number\numexpr\@nameuse{tableaujalousie@somme@chiffre@#1}+\@nameuse{tableaujalousie@retenue@#1}\relax\@nil
}
\def\tableaujalousie@process@retenue@aux#1#2#3\@nil{%
  \ifx\\#3\\%
    \@nameedef{tableaujalousie@retenue@\number\numexpr#1+1\relax}{0}%
    \@nameedef{tableaujalousie@somme@chiffre@#1}{#2}%
  \else
    \@nameedef{tableaujalousie@retenue@\number\numexpr#1+1\relax}{#2}%
    \@nameedef{tableaujalousie@somme@chiffre@#1}{#3}%
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tjnb#1#2#3{\@nameuse{tableaujalousie@#1@#2@#3}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatother
\begin{document}
\tableaujalousie{4735}{926}
\newpage
%\tableaujalousie{132798}{567948}% arithmetic overflow car on affiche le résultat ; le tableau fonctionne parfaitement
\tableaujalousie{13278}{56748}
\tableaujalousie{456}{67}
\tableaujalousie{99}{111}
\tableaujalousie{1}{2}
\end{document}

Le code est limité à neuf chiffres par nombre (pour aller jusque là, commenter la dernière ligne de \tableaujalousie car sinon comme la macro fait aussi calculer le produit par TeX, il y aura un dépassement).
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Représenter une multiplication par jalousie

Messagepar titi31 » Lundi 31 Mai 2010, 20:54

C'est magnifique, je ne suis pas l'auteur du post mais ça fait un moment que je présente cette façon de faire à mes élèves et je cherchais comment le faire en $\LaTeX$.

Merci encore.
titi31
Méga-utilisateur
 
Messages: 264
Inscription: Samedi 27 Octobre 2007, 07:44
Localisation: La ville rose
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar projetmbc » Lundi 31 Mai 2010, 23:42

titi31 a écrit:C'est magnifique

Je dirais même que c'est merveilleux car le code me dépasse un peu. Ceci étant dit, je vais devoir faire de petits exemples "monstrueux" avec disons 8 chiffres. Du coup, serait-il possible de lire quelque part le code LaTeX du tableau pour faire faire les calculs à Python ? Ceci permettrait aussi d'ajouter de petites fioritures.

pg a écrit:Noter que ce ne sont pas tout à fait les mêmes chiffres que dans le lien donné au début du sujet car le tableau en question est faux.

Moi qui croyais avoir compris... Pourtant j'avais bien lu le mini-doc en diagonale. :mrgreen:
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar MB » Mardi 01 Juin 2010, 00:25

Encore un très beau code de pg ! :o
Par contre, on voit quand même que faire du calcul avec tex reste une affaire assez complexe. L'idée proposée par GM de passer par Asymptote est bonne car on peut soigner un peu plus la présentation du tableau et le logiciel se débrouille très bien en calcul.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6885
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar rebouxo » Mardi 01 Juin 2010, 08:04

Bon, ben yapuka en faire une extension.
Une question faut-il absolument faire le produit des deux nombres ? Le but étant de présenter la multiplication par jalousie, est-ce utile ? Sinon, il me semble que xlop propose tout ce qu'il faut pour calculer sur des nombres grands.

Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6920
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar pg » Mardi 01 Juin 2010, 09:37

projetmbc a écrit:je vais devoir faire de petits exemples "monstrueux" avec disons 8 chiffres.

Le code fonctionne jusqu'à 9 chiffres, donc il n'y aura pas de problème. Si on veut quand même afficher le produit, puisqu'on le calcule produit de toutes façons, il suffit de mettre les chiffres les uns à la suite des autres au lieu de les faire calculer par TeX. Ça évite les arithmetic overflow, mais ne permet plus de vérifier le calcul.

projetmbc a écrit:Du coup, serait-il possible de lire quelque part le code LaTeX du tableau pour faire faire les calculs à Python ? Ceci permettrait aussi d'ajouter de petites fioritures.

Les calculs faits étant très simples, laisser faire Python améliorera peut-être (si on connaît Python) la lisibilité du code, mais c'est tout et il restera le problème de créer le tableau à partir de ces données (ce qui est peut-être la moitié de la difficulté du code précédent, qui est divisé en deux : d'abord le calcul des données puis son affichage sous forme de tableau).

Le contenu du tableau est stocké dans \tableaujalousie@contenutableau donc on peut l'afficher par \meaning\tableaujalousie@contenutableau, ce que j'ai fait pour les deux derniers cas :

Code: Tout sélectionner
\documentclass{article}
\usepackage[frenchb]{babel}% pour \addto
\newcommand*\eaddto[2]{% version développée de \addto
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}
\usepackage{ifthen}% pour \whiledo
\usepackage{slashbox}% pour le tableau
\makeatletter
\def\@nameedef#1{\expandafter\edef\csname #1\endcsname}
\newcounter{tableaujalousie@somme@chiffres}
\newcommand{\tableaujalousie}[2]{%
%Calcul du nombre de colonnes et de lignes
\tableaujalousie@process@number{cols}{#1}%
\tableaujalousie@process@number{rows}{#2}%
% Calcul des éléments du tableau (sauf retenues et sommes partielles)
\def\tableaujalousie@i{1}%
\def\tableaujalousie@j{1}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbrows+1\relax}{%
  \def\tableaujalousie@j{1}%
  \whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
    \tableaujalousie@compute@product
      {\tableaujalousie@i}
      {\tableaujalousie@j}%
    \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
  }%
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
% Création de la liste des indices correspondant au k-ième chiffre du total
\def\tableaujalousie@i{0}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows\relax}{%
  \tableaujalousie@calcule@liste@indices{\tableaujalousie@i}%
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
% Boucle pour calculer les sommes de chiffres et les retenues
\@namedef{tableaujalousie@retenue@0}{0}%
\def\tableaujalousie@i{0}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows\relax}{%
   \setcounter{tableaujalousie@somme@chiffres}{0}%
  \expandafter\@for\expandafter\temp
  \expandafter:\expandafter=\expandafter{\csname
     tableaujalousie@liste@indices@\tableaujalousie@i\endcsname}%
   \do{\ifx\temp\empty
       \else\edef\result{\noexpand\tjnb\temp}%
            \addtocounter{tableaujalousie@somme@chiffres}{\result}%
       \fi}%
  \@nameedef{tableaujalousie@somme@chiffre@\tableaujalousie@i}%
      {\number\value{tableaujalousie@somme@chiffres}}%
   \tableaujalousie@process@retenue{\tableaujalousie@i}%
   \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}
}
% Création du contenu du tableau \tableaujalousie@contenutableau
\def\tableaujalousie@contenutableau{}%
\addto\tableaujalousie@contenutableau{\multicolumn{1}{c}{}}
\def\tableaujalousie@i{1}
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+1\relax}{%
  \eaddto\tableaujalousie@contenutableau{%
     &\noexpand\multicolumn{1}{c}{\@nameuse{tableaujalousie@cols@\tableaujalousie@i}}
  }
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}
\eaddto\tableaujalousie@contenutableau{&\noexpand\\\noexpand\cline{2-\number\numexpr\tableaujalousie@nbcols+1\relax}}

\def\tableaujalousie@i{1}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbrows+1\relax}{%
  \def\tableaujalousie@j{1}%
  \eaddto\tableaujalousie@contenutableau{\@nameuse{tableaujalousie@somme@chiffre@\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows-\tableaujalousie@i\relax}}
  \whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
    \eaddto\tableaujalousie@contenutableau{%
       & \noexpand\tableaujalousie@case
       {\@nameuse{tableaujalousie@\tableaujalousie@i @\tableaujalousie@j @0}}
       {\@nameuse{tableaujalousie@\tableaujalousie@i @\tableaujalousie@j @1}}
       {\ifnum\tableaujalousie@i=1
        \ifnum\@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbcols+\tableaujalousie@nbrows
            -\tableaujalousie@j\relax}=0\else
          \@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbcols+\tableaujalousie@nbrows
            -\tableaujalousie@j\relax}\fi\fi}
       {\ifnum\tableaujalousie@j=\tableaujalousie@nbcols\space
        \ifnum\@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbrows
            -\tableaujalousie@i\relax}=0\else
          \@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbrows
            -\tableaujalousie@i\relax}\fi\fi}%
    }%
    \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
  }%
  \eaddto\tableaujalousie@contenutableau{&\@nameuse{tableaujalousie@rows@\tableaujalousie@i}\noexpand\\\noexpand\cline{2-\number\numexpr\tableaujalousie@nbcols+1\relax}}
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
\eaddto\tableaujalousie@contenutableau{\noexpand\multicolumn{1}{c}{}}
\def\tableaujalousie@j{1}%
\whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
  \eaddto\tableaujalousie@contenutableau{&\noexpand\multicolumn{1}{c}{\@nameuse{tableaujalousie@somme@chiffre@\number\numexpr\tableaujalousie@nbcols-\tableaujalousie@j\relax}}}
  \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
}%
% Affichage du tableau
\begin{center}
\begin{tabular}{c|*{\tableaujalousie@nbcols}{c|}c}
\tableaujalousie@contenutableau
\end{tabular}
%\smallbreak
%$#1 \times #2 = \number\numexpr#1*#2\relax$% a commenter pour éviter tout risque d'arithmetic overflow
\smallbreak
\def\tableaujalousie@result{}
\def\tableaujalousie@i{1}
\whiledo{\tableaujalousie@i<\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows+1\relax}
{\edef\tableaujalousie@result{\tableaujalousie@result\@nameuse{tableaujalousie@somme@chiffre@\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows-\tableaujalousie@i\relax}}
\edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}}
$#1 \times #2 = \expandafter\tableaujalousie@enleve@zero\expandafter{\tableaujalousie@result}$
\end{center}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% macros pour afficher les cases du tableau
\def\tableaujalousie@strut{\vrule width 0pt height 1.5em depth 0.5em}
\def\tableaujalousie@case#1#2#3#4{%
% #1 = chiffre 2
% #2 = chiffre 1
% #3 = retenue position 1
% #4 = retenue position 2
  \slashbox{\tableaujalousie@strut#1$^{#3}$}{\tableaujalousie@strut#2\rlap{$^{#4}$}}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@process@number{#1}{#2}
%  #1 = suffixe (ici, cols ou rows)
%  #2 = nombre (4735, par exemple)
%  --> lit le nombre #2 et définit
%      * #1 = nombre de chiffres de #2
%      * \tableaujalousie@#1@i = chiffre i de #2 (gauche->droite)
%  exemple : \tableaujalousie@process@number{cols}{4735} définit
%  * cols égal à 4 (nb de chiffres de 4735)
%  * \tableaujalousie@cols@1 égal à 4
%  * \tableaujalousie@cols@2 égal à 7
%  * \tableaujalousie@cols@3 égal à 3
%  * \tableaujalousie@cols@4 égal à 5
\def\tableaujalousie@process@number#1#2{%
% #1 = suffice (cols ou rows)
% #2 = nombre
  \tableaujalousie@process@number@aux{#1}{1}#2\@nil
}
\def\tableaujalousie@process@number@aux#1#2#3#4\@nil{%
% #1 = suffixe (cols ou rows)
% #2 = nombre de chiffres lus
% #3 = chiffre courant
% #4 = chiffres restant
  \ifx\\#4\\
    \@namedef{tableaujalousie@#1@#2}{#3}%
    \@namedef{tableaujalousie@nb#1}{#2}%
  \else
    \@namedef{tableaujalousie@#1@#2}{#3}%
    \tableaujalousie@process@number@aux{#1}{\number\numexpr#2+1\relax}#4\@nil
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@compute@product{#1}{#2}
% #1 = indice de ligne i
% #2 = indice de colonne j
% --> définit des commandes contenant les chiffres du produit \tableaujalousie@cols@j * \tableaujalousie@cols@i :
%     * tableaujalousie@i@j@0 = premier chiffre
%     * tableaujalousie@i@j@1 = second chiffre
% exemples :
%     * si \tableaujalousie@cols@j = 4 et \tableaujalousie@cols@i = 2, alors tableaujalousie@i@j@0 = 0 et tableaujalousie@i@j@1 = 8
%     * si \tableaujalousie@cols@j = 4 et \tableaujalousie@cols@i = 6, alors tableaujalousie@i@j@0 = 3 et tableaujalousie@i@j@1 = 4
\def\tableaujalousie@compute@product#1#2{%
% #1 = indice de ligne i
% #2 = indice de colonne j
  \expandafter\tableaujalousie@parse@twodigit@number\expandafter{\expandafter#1\expandafter}\expandafter{\expandafter#2\expandafter}\expandafter{%
    \number\numexpr
      \@nameuse{tableaujalousie@cols@#2}
      *
      \@nameuse{tableaujalousie@rows@#1}
    \relax
  }%
}
\def\tableaujalousie@parse@twodigit@number#1#2#3{%
% #1 = indice de ligne i
% #2 = indice de colonne j
% #3 = nombre à analyser
  \tableaujalousie@parse@twodigit@number@aux{#1}{#2}#3\@nil
}
\def\tableaujalousie@parse@twodigit@number@aux#1#2#3#4\@nil{%
% #1 = indice de ligne i
% #2 = indice de colonne j
% #3 = premier chiffre à gauche du nombre à analyser
% #4 = reste du nombre à analyser
  \ifx\\#4\\%
    \@namedef{tableaujalousie@#1@#2@0}{0}%
    \@namedef{tableaujalousie@#1@#2@1}{#3}%
  \else
    \@namedef{tableaujalousie@#1@#2@0}{#3}%
    \@namedef{tableaujalousie@#1@#2@1}{#4}%
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@calcule@liste@indices
% #1 = chiffre k
% --> liste des (i,j,e) avec i+j+e=k, i=1,...,nbrows,
%     j=1,...,nbcols et e=0,1
\def\tableaujalousie@calcule@liste@indices#1{%
\@nameedef{tableaujalousie@liste@indices@#1}{%
  \ifnum\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows+1-#1\relax>\tableaujalousie@nbrows\space
    \ifnum\number\numexpr\tableaujalousie@nbcols-#1\relax>0
      \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\tableaujalousie@nbrows\number\numexpr\tableaujalousie@nbcols-#1\relax1\relax
    \else
      \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\tableaujalousie@nbrows\number\numexpr\tableaujalousie@nbcols-#1+1\relax0\relax
    \fi
  \else
    \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\number\numexpr(\tableaujalousie@nbcols+\tableaujalousie@nbrows-#1)\relax10\relax
  \fi}%
}
\def\tableaujalousie@calcule@liste@indices@aux#1#2#3{%
  \ifx\\#1\\%
    %
  \else
    \number\numexpr#1#2#3\relax,%
    \ifnum#3=0
      \ifnum#1>1
            \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\number\numexpr#1-1\relax#2\number\numexpr#3+1\relax\relax
      \fi
    \else
      \ifnum#2<\tableaujalousie@nbcols\space
        \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr#1\number\numexpr#2+1\relax\number\numexpr#3-1\relax\relax
      \fi
    \fi
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tableaujalousie@process@retenue#1{%
% #1 = chiffre k
   \expandafter\tableaujalousie@process@retenue@aux
   \expandafter{\expandafter#1\expandafter}%
   \number\numexpr\@nameuse{tableaujalousie@somme@chiffre@#1}+\@nameuse{tableaujalousie@retenue@#1}\relax\@nil
}
\def\tableaujalousie@process@retenue@aux#1#2#3\@nil{%
  \ifx\\#3\\%
    \@nameedef{tableaujalousie@retenue@\number\numexpr#1+1\relax}{0}%
    \@nameedef{tableaujalousie@somme@chiffre@#1}{#2}%
  \else
    \@nameedef{tableaujalousie@retenue@\number\numexpr#1+1\relax}{#2}%
    \@nameedef{tableaujalousie@somme@chiffre@#1}{#3}%
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% macro auxilliaire
\def\tjnb#1#2#3{\@nameuse{tableaujalousie@#1@#2@#3}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% macro pour enlever l'éventuel zéro au début d'un nombre
\def\tableaujalousie@enleve@zero#1{%
  \tableaujalousie@enleve@zero@aux#1\@nil
}
\def\tableaujalousie@enleve@zero@aux#1#2#3\@nil{%
  \number\numexpr#1#2\relax#3%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatother
\begin{document}
\tableaujalousie{4735}{926}
\newpage
\tableaujalousie{13278}{56748}
\tableaujalousie{456}{67}
\tableaujalousie{99}{111}
\tableaujalousie{1}{2}
\newpage
\tableaujalousie{123456789}{123456789}

Code du tableau~: \begingroup\makeatletter\ttfamily\expandafter\strip@prefix\meaning\tableaujalousie@contenutableau\endgroup

\tableaujalousie{999999999}{999999999}

Code du tableau~: \begingroup\makeatletter\ttfamily\expandafter\strip@prefix\meaning\tableaujalousie@contenutableau\endgroup

\end{document}
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Représenter une multiplication par jalousie

Messagepar GMaths » Mardi 01 Juin 2010, 12:31

GMaths a écrit:... donc j'ai commencé quelque chose avec asymptote ici

Je viens de faire progresser un peu la chose... et la finaliserai dans quelques temps.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar projetmbc » Mardi 01 Juin 2010, 13:40

Les deux méthodes ont un bon rendu mais il fait reconnaître la relative simplicité du code Asymptote. Cela me gêne un peu d'écrire ceci vis à vis de pg qui a tapé plein de lignes de code... :oops:

Dans le cadre de l'étude du comportement de la multiplication en jalousie, j'aurais voulu mettre en valeur certaines cases en changeant par exemple la couleur de fond, ou bien en épaississant le bord de la cellule. Que faudrait-il faire comme modifications dans le fichier ASY pour obtenir cela ?

Autre chose, une flèche incurvée du nombre de droite vers celui en haut avec un signe ×, et une autre du nombre de gauche vers le début du résultat à gauche avec le signe = seraient aussi pas mal en option.

Sur ce, le vélo m'appelle...
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar Altermundus » Mardi 01 Juin 2010, 14:44

projetmbc a écrit:Les deux méthodes ont un bon rendu mais il fait reconnaître la relative simplicité du code Asymptote. Cela me gêne un peu d'écrire ceci vis à vis de pg qui a tapé plein de lignes de code... :oops:


Je ne ne peux donner mon avis sur le code d'Asymptote que je ne connais pas ni d'ailleurs sur la complexité des calculs car je ne connais pas cette méthode "par jalousie", ce que je peux dire c'est que la difficulté du code de PG vient du tableau et là le remède c'est TikZ. En gros une case du tableau est un node voire un node de nodes ...

Alain
Altermundus
Giga-utilisateur
 
Messages: 557
Inscription: Lundi 28 Mai 2007, 09:31
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar GMaths » Mardi 01 Juin 2010, 16:51

projetmbc a écrit:j'aurais voulu mettre en valeur certaines cases en changeant par exemple la couleur de fond, ou bien en épaississant le bord de la cellule. Que faudrait-il faire comme modifications dans le fichier ASY pour obtenir cela ?

Ce n'est pas intégré à la fonction (car pas le temps... et pas convaincu que cela en vaille le coup) mais voilà pour dépannage : lien mort

projetmbc a écrit:Sur ce, le vélo m'appelle...

Sur ce, des copies et des bulletins... m'appellent...
Dernière édition par GMaths le Jeudi 26 Août 2010, 08:20, édité 1 fois.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar projetmbc » Mardi 01 Juin 2010, 19:45

Altermundus a écrit:... je ne connais pas cette méthode "par jalousie"...

C'est pas très loin de la méthode scolaire vue colonne par colonne : ceci se voit en redressant les diagonales.

GMaths a écrit:
projetmbc a écrit:j'aurais voulu mettre en valeur certaines cases en changeant par exemple la couleur de fond, ou bien en épaississant le bord de la cellule. Que faudrait-il faire comme modifications dans le fichier ASY pour obtenir cela ?

Ce n'est pas intégré à la fonction (car pas le temps... et pas convaincu que cela en vaille le coup) mais voilà pour dépannage : http://www.marris.org/asymptote/Hors_Categorie/figure-index.html

Merci.

GMaths a écrit:
projetmbc a écrit:Sur ce, le vélo m'appelle...

Sur ce, des copies et des bulletins... m'appellent...

Tout aussi éprouvant mais moins plaisant.

pg a écrit:Le code fonctionne jusqu'à 9 chiffres, donc il n'y aura pas de problème... Le contenu du tableau est stocké dans \tableaujalousie@contenutableau donc on peut l'afficher par \meaning\tableaujalousie@contenutableau, ce que j'ai fait pour les deux derniers cas...

Résultat nickel.

Au passage le code Asymptote ne marche pas bien avec 9 chiffres MAIS ce n'est vraiment pas grave.

Merci beaucoup pour les deux propositions.
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Représenter une multiplication par jalousie

Messagepar GMaths » Mardi 01 Juin 2010, 20:31

projetmbc a écrit:Au passage le code Asymptote ne marche pas bien avec 9 chiffres MAIS ce n'est vraiment pas grave.

Qu'est ce qui ne va pas ??
Je viens d'essayer : lors de mes essais avec des nombres de 9, 13 et 15 chiffres... il n'y a pas de problème.

Si ce que tu appelles "problème", c'est la taille de l'écriture... je rappelle que la plupart du temps, j'utilise size plutôt que unitsize pour mes exemples en ligne pour maitriser sans surprise la taille des images produites. Mais le fait d'utiliser size pose problème pour la taille des labels : problème d'interaction entre asymptote et latex.
Pour avoir une taille contante des labels en faisant varier le nombre des chiffres, il va falloir remplacer :
Code: Tout sélectionner
defaultpen(fontsize(20pt));
size(10cm,0);
par
Code: Tout sélectionner
defaultpen(fontsize(14pt));
unitsize(1cm);
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Représenter une multiplication par jalousie

Messagepar projetmbc » Mercredi 02 Juin 2010, 11:45

Merci pour la précision.
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Suivante

Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot], Grapeshot [Crawler], Magpie [Crawler] et 19 invités