[Lualatex] Arrangements et combinaisons

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
MB
Administrateur
Administrateur
Messages : 8025
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

[Lualatex] Arrangements et combinaisons

Message non lu par MB »

Autre petit exemple avec des fonctions permettant de dénombrer des arrangements et des combinaisons.

Voici le contenu du fichier combinatorics.lua dans lequel la fonction cnp donne le coefficient binomial $C_n^p$ et la fonction anp donne le nombre d'arrangements $A_n^p$.

Code : Tout sélectionner

function cnp(n,p)
    if (p == 0 or p == n) then
        return 1
    else
        return n*cnp(n-1,p-1)/p
    end
end

function anp(n,p)
    if p == 0 then
        return 1
    else
        return (n-p+1)*anp(n,p-1)
    end
end

function fwrite(z)
    tex.sprint(string.format("%.0f",z))
end
On peut alors utiliser le fichier tex suivant.

Code : Tout sélectionner

\documentclass{article}
\directlua{dofile('combinatorics.lua')}
\newcommand{\cnp}[2]{\directlua{fwrite(cnp(#1,#2))}}
\newcommand{\anp}[2]{\directlua{fwrite(anp(#1,#2))}}
\begin{document}
\begin{itemize}
\item $A_7^5 = \anp{7}{5}$
\item $C_7^5 = \cnp{7}{5}$
\end{itemize}
\end{document}
Qui va donner le résultat suivant après une compilation lualatex.
combinatorics.png
combinatorics.png (5.68 Kio) Consulté 2836 fois
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
MB
Administrateur
Administrateur
Messages : 8025
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [lualatex] Exemples d'utilisation

Message non lu par MB »

On peut également combiner avec Tikz pour construire un triangle de Pascal.

Code : Tout sélectionner

\documentclass{article}
\usepackage{tikz}
\directlua{dofile('combinatorics.lua')}
\newcommand{\cnp}[2]{\directlua{fwrite(cnp(#1,#2))}}
\newcommand{\anp}[2]{\directlua{fwrite(anp(#1,#2))}}
\begin{document}
\begin{tikzpicture}[scale=0.8,cnp/.style={rectangle,draw,fill=gray!20,minimum size=2em}]
\foreach \n in {0,...,6} {
    \foreach \p in {0,...,\n} {
        \draw (\p,6-\n) node[cnp] {\cnp{\n}{\p}};}}
\end{tikzpicture}
\end{document}
triangle_pascal.png
triangle_pascal.png (13.67 Kio) Consulté 2836 fois
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2228
Inscription : samedi 29 décembre 2007, 00:58

Re: [lualatex] Exemples d'utilisation

Message non lu par projetmbc »

Cela va se finir en un package ... :-)

Tant qu'à faire j'aurais tout fait faire à Lua.
MB
Administrateur
Administrateur
Messages : 8025
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [lualatex] Exemples d'utilisation

Message non lu par MB »

projetmbc a écrit : dimanche 30 janvier 2022, 17:43 Tant qu'à faire j'aurais tout fait faire à Lua.
Il aurait effectivement été tout à fait possible de construire le triangle de Pascal à l'aide de Metapost, via luamplib.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2228
Inscription : samedi 29 décembre 2007, 00:58

Re: [Lualatex] Arrangements et combinaisons

Message non lu par projetmbc »

Une question au passage.

Comment Lua gère-t-il les entiers ?
MB
Administrateur
Administrateur
Messages : 8025
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Lualatex] Arrangements et combinaisons

Message non lu par MB »

Comme on peut le lire ici, les entiers sont gérés comme des décimaux et il n'existe pas de type spécifique.

Pas forcément en rapport direct, puisque ça doit plutôt venir de la fonction dont les puissances sont calculées, mais j'ai déjà constaté une différence avec Python pour le calcul des puissances entières d'entiers.

Code : Tout sélectionner

> 2^4
16.0
> 2*2*2*2
16
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2228
Inscription : samedi 29 décembre 2007, 00:58

Re: [Lualatex] Arrangements et combinaisons

Message non lu par projetmbc »

Effectivement, j'avais déjà constaté le cas de l'exposant.

Merci pour le lien.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [Lualatex] Arrangements et combinaisons

Message non lu par un bon petit »

projetmbc a écrit : dimanche 27 novembre 2022, 15:53 Effectivement, j'avais déjà constaté le cas de l'exposant.
C'est extrêmement bizarre d'ailleurs et je trouve ça plutôt gênant. Ceci dit, je ne pratique presque pas le lua donc je dis peut être des bêtises.

Comme depuis lua 5.3 (de mémoire, j'ai la flemme de vérifier), le sous type entier (64 bits) a été créé pour cohabiter avec le sous type float (64 bits aussi, je crois), il me semble que le langage lua devrait en tenir compte pour l'élévation à la puissance. Si a et b sont entiers, a^b devrait être évalué comme un entier via l'algo classique, plutôt que de passer par l'exponentielle et le log et retourner un float. On peut d'ailleurs s'en assurer dans le code source de lmathlib.c : le test if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) n'est pas fait, ce qui fait qu'un float est renvoyé dans tous les cas de figure...
Dernière modification par MB le dimanche 27 novembre 2022, 18:05, modifié 1 fois.
Raison : Lien vers lmathlib.c.
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 8025
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Lualatex] Arrangements et combinaisons

Message non lu par MB »

Je trouve ça également un peu gênant.
On trouve peut-être ici un début d'explication de ce fonctionnement, même si ça reste encore assez obscure.
Lua also offers partial support for `^´ (exponentiation). One of the design goals of Lua is to have a tiny core. An exponentiation operation (implemented through the pow function in C) would mean that we should always need to link Lua with the C mathematical library. To avoid this need, the core of Lua offers only the syntax for the `^´ binary operator, which has the higher precedence among all operations. The mathematical library (which is standard, but not part of the Lua core) gives to this operator its expected meaning.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
gigiair
Utilisateur chevronné
Utilisateur chevronné
Messages : 2793
Inscription : samedi 08 juillet 2006, 20:56
Localisation : Saint Bonnet Elvert

Re: [Lualatex] Arrangements et combinaisons

Message non lu par gigiair »

MB a écrit : dimanche 30 janvier 2022, 15:48 Autre petit exemple avec des fonctions permettant de dénombrer des arrangements et des combinaisons.

<snip>
On peut alors utiliser le fichier tex suivant.

Code : Tout sélectionner

\documentclass{article}
\directlua{dofile('combinatorics.lua')}
\newcommand{\cnp}[2]{\directlua{fwrite(cnp(#1,#2))}}
\newcommand{\anp}[2]{\directlua{fwrite(anp(#1,#2))}}
\begin{document}
\begin{itemize}
\item $A_7^5 = \anp{7}{5}$
\item $C_7^5 = \cnp{7}{5}$
\end{itemize}
\end{document}
J'avoue ne pas comprendre trop l'intérêt de se fatiguer à produire du code lua pour exécuter un calcul qu'on peut exécuter de manière externe par une foule d'applications.

Pour ma part j'édite mes fichiers avec l'éditeur de texte d'Emacs et je fais effectuer les calculs par le calculateur d'Emacs qu'on peut activer en mode « embedded ». Je saisis :

Code : Tout sélectionner

\documentclass{article}

\begin{document}
\begin{itemize}

\item \item $A_7^5 = perm(7,5)$
\item $C_7^5 = choose(7, 5)$

\end{itemize}
\end{document}
Puis je place le curseur sur l'expression à calculer perm(7,5) (perm est la fonction Calc pour calculer un arrangement)
J'active le mode Calc embedded (C-x * e) et aussitôt le résultat 2520 s'affiche. Je sors du mode Calc embedded par la même commande et je recommence avec choose.
Les éventuels lecteurs ne verront pas la différence avec un calcul effectué en interne...
JJR.
LaTeXien migrateur.
MB
Administrateur
Administrateur
Messages : 8025
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Lualatex] Arrangements et combinaisons

Message non lu par MB »

gigiair a écrit : lundi 28 novembre 2022, 09:27 J'avoue ne pas comprendre trop l'intérêt de se fatiguer à produire du code lua pour exécuter un calcul qu'on peut exécuter de manière externe par une foule d'applications.
Produire du code Lua n'est pas très fatiguant et l'un des avantages est justement de ne pas avoir à utiliser un outil externe pour effectuer les calculs.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2228
Inscription : samedi 29 décembre 2007, 00:58

Re: [Lualatex] Arrangements et combinaisons

Message non lu par projetmbc »

gigiair a écrit : lundi 28 novembre 2022, 09:27 J'avoue ne pas comprendre trop l'intérêt de se fatiguer à produire du code lua pour exécuter un calcul qu'on peut exécuter de manière externe par une foule d'applications.
En terme de cycle de développement, c'est un peu pénible de devoir à chaque fois effectuer les calculs. Je préfère me concentrer sur le contenu, et laisser le soin à la compilation de faire tous les calculs.

De plus, avoir accès à des fonctionnalités de calcul facilement, c'est pratique. Par exemple, j'ai un package tnsproba qui permet de mettre en forme une loi finie de probabilités ; grâce à LuaTeX, je vais pouvoir proposer des résultats exacts, et même symbolique pour l'espérance, et la variance, et ceci grâce au package luacas .

Quand on aime coder, Lua est facile à apprendre, tout comme l'est Python. Dire que ce type de langage est dur à prendre en main, c'est mentir. Par contre, comme avec tout langage, les maitriser, c'est une histoire de pratique.
MB
Administrateur
Administrateur
Messages : 8025
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Lualatex] Arrangements et combinaisons

Message non lu par MB »

Je viens de tester et de jeter un oeil à la documentation de luacas. Ca fonctionne très bien, mais je n'ai rien vu concernant le calcul matriciel. Ça n'est pas pris en charge ? Je sais que sagetex le propose, mais ce paquet n'est pas dans la distribution Texlive.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
gigiair
Utilisateur chevronné
Utilisateur chevronné
Messages : 2793
Inscription : samedi 08 juillet 2006, 20:56
Localisation : Saint Bonnet Elvert

Re: [Lualatex] Arrangements et combinaisons

Message non lu par gigiair »

Emacs fournit une grande aide pour le calcul matriciel et en particulier pour la saisie des matrices.
Par exemple, pour afficher le produit des matrices

$$\begin{pmatrix} a & b & c \\ d & e & f \end{pmatrix}$$ et $$\begin{pmatrix} x \\ y \\ z \end{pmatrix}$$

et son résultat, Il suffit de taper

Code : Tout sélectionner

\documentclass{article}
\usepackage{amsmath}
\newcommand*{\evalto}{}
\renewcommand*{\to}{=}
\begin{document}
\begin{math}
  [a b c; d e f][x;y;z]=>
\end{math}
\end{document}
Après un passage par calc-embedded-mode et retour, on obtient

Code : Tout sélectionner

\documentclass{article}
\usepackage{amsmath}
\newcommand*{\evalto}{}
\renewcommand*{\to}{=}
\begin{document}

% [calc-mode: symbolic: t] (sinon e est la constante d'Euler et évaluée numériquement)
\begin{math}
\evalto \begin{pmatrix} a & b & c \\ d & e & f \end{pmatrix} 
  \begin{pmatrix} x \\ y \\ z \end{pmatrix} \to \begin{pmatrix} a x + b y + c z \\ d x + e y + f z \end{pmatrix}
\end{math}

\end{document}
Ce qui s'affiche $$\begin{pmatrix} a & b & c \\ d & e & f \end{pmatrix}
\begin{pmatrix} x \\ y \\ z \end{pmatrix} = \begin{pmatrix} a x + b y + c z \\ d x + e y + f z \end{pmatrix}$$

Malheureusement, le choix de pmatrix est en dur dans Calc. Pour changer d'environnement (bmatrix ou autre) il faut le faire « à la main ».

La syntaxe de la saisie est très tolérante, le séparateur de colonne est la virgule mais est facultative. Le séparateur de ligne est le point virgule et peut être remplacé par la mise entre cochets droits de chaque ligne.
JJR.
LaTeXien migrateur.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2228
Inscription : samedi 29 décembre 2007, 00:58

Re: [Lualatex] Arrangements et combinaisons

Message non lu par projetmbc »

MB a écrit : lundi 28 novembre 2022, 10:07 Je viens de tester et de jeter un oeil à la documentation de luacas. Ca fonctionne très bien, mais je n'ai rien vu concernant le calcul matriciel. Ça n'est pas pris en charge ?
Va falloir participer au développement. :mrgreen: