Page 1 sur 2

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

MessagePosté: Lundi 31 Mai 2010, 00:23
par projetmbc
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 08:58
par rebouxo
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 09:28
par MB
Et pourquoi ne pas passer par Python (puisque tu es utilisateur) ?

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 09:56
par projetmbc
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 11:26
par rebouxo
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

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 11:36
par projetmbc
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 12:48
par GMaths
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 19:40
par pg
Voici une façon de faire avec TeX uniquement :

tableau_jalousie_4735_926.png
tableau_jalousie_4735_926.png (13.42 Kio) Vu 2833 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).

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 20:54
par titi31
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Lundi 31 Mai 2010, 23:42
par projetmbc
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:

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 00:25
par MB
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 08:04
par rebouxo
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

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 09:37
par pg
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}

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 12:31
par GMaths
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 13:40
par projetmbc
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...

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 14:44
par Altermundus
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

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 16:51
par GMaths
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...

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 19:45
par projetmbc
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.

Re: Représenter une multiplication par jalousie

MessagePosté: Mardi 01 Juin 2010, 20:31
par GMaths
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);

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

MessagePosté: Mercredi 02 Juin 2010, 11:45
par projetmbc
Merci pour la précision.