Décomposition en produit de facteurs premiers sous \(\LaTeX\) avec Python

Décomposition en produit de facteurs premiers sous \(\LaTeX\) avec Python

Cette tâche semble simple, mais pas tant que ça en définitive… Je voulais en effet créer une commande \(\LaTeX\) acceptant un paramètre (un nombre entier) qui décompose ce dernier en produit de facteurs premiers, et ce à l’aide de Python.

Il est donc naturel de penser à Pythontex. ça, c’est bon… Le problème est que quand on utilise Pythontex, on ne peut pas facilement passer un argument. Je m’explique… avec un code FAUX :

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{pas-math}
\usepackage{pythontex}

\newcommand{\decomp}[1]{
\py{decompose(#1)}
}
\begin{document}
\decomp{120}
\end{document}

Ce script suppose connue la fonction Python decompose (préalablement définie). Le problème ici est que l’argument #1 ne passe pas… Ce code ne donne donc rien d’autre qu’une erreur.

Il faut donc utiliser une astuce… que voici:

\newcommand{\ifactors}[1]{
\begingroup\edef\x{\endgroup
    \noexpand\py{decompose(#1)}}\x}

Ensuite, j’ai voulu enrichir la macro \ifactors de sorte à ce qu’elle puisse afficher en ligne ou en colonne la décomposition comme ceci :

Cette idée m’est venue suite à un échange avec un abonné qui avait des difficultés à faire appel à Xcas pour cette même décomposition (outil inclus dans mon package pas-cours.sty). Il est vrai que faire tourner Xcas dans un document\(\LaTeX\) n’est pas chose simple et mon package pas-cours fait appel à Xcas pour ce genre de calculs. Il fallait donc que je trouve un moyen de contourner ceci.

Pour les abonné.e.s de mathweb.fr, vous trouverez le script \(\LaTeX\) qui inclus bien sûr le script Python de la décomposition. Il y a aussi en en-tête la chaîne de compilation à respecter pour faire tourner Pythontex. Ça se passe sur cette page.

Stéphane Pasquet
Stéphane Pasquet

4 réflexions au sujet de « Décomposition en produit de facteurs premiers sous \(\LaTeX\) avec Python »

Fernando S. Delgado Trujillo

Fernando S. Delgado TrujilloPublié le  5:40 - Juil 11, 2019

Une petite question. Quel est l’intérêt d’utiliser ici \begingroup et \endgroup ?

    Stéphane Pasquet

    Stéphane PasquetPublié le  6:24 - Juil 11, 2019

    Parce que sans, ça ne fonctionne pas. Bon, la réponse n’est pas satisfaisante, mais je ne suis pas assez expert pour comprendre pourquoi (malheureusement). J’ai trouvé ce code sur un forum il y a pas mal de temps déjà.

      Fernando S. Delgado Trujillo

      Fernando S. Delgado TrujilloPublié le  7:21 - Juil 11, 2019

      Pour moi le code ci-dessous a marché :

      \newcommand{\ifactors}[2][]{
      \ifx&#1&
      % \begingroup
      \edef\x{
      % \endgroup
      \noexpand\py{decompose(#2)}}\x
      \else
      % \begingroup
      \edef\x{
      % \endgroup
      \noexpand\py{decompose(#2,True)}}\x
      \fi}

      On peut même écrire :

      \newcommand{\ifactors}[2][]{
      \ifx&#1&
      % \begingroup
      \edef\x{
      % \endgroup
      \noexpand\py{decompose(#2)}}
      \else
      % \begingroup
      \edef\x{
      % \endgroup
      \noexpand\py{decompose(#2,True)}}
      \fi
      \x
      }

Fernando S. Delgado Trujillo

Fernando S. Delgado TrujilloPublié le  7:17 - Juil 11, 2019

Une autre option est d’utiliser le package xargs qui permet de créer des macros avec des arguments optionnels :

\usepackage{xargs}

\newcommandx\ifactors[2][1=False]{
\py{decompose(#2,#1)}
}

Ensuite on peut utiliser dans le corps du doc latex la fonction ifactors comme :
\ifactors[True]{120} (si on veux la table)
\ifactors{120} (si on ne veut pas la table)

Cette solution permet un peu plus de lisibilité dans le code. Mais je dois dire que j’ai appris beaucoup de choses de votre macro 😉

Laissez votre message