La décomposition en produit de facteurs premiers sous LaTeX avec Python 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.
Décomposition en produit de facteurs premiers sous LaTeX: rappels mathématiques
Avant tout, il faut se souvenir de ce que l’on appelle la décomposition en produit de facteurs premiers (voir Wikipedia).
Étant donné un entier naturel n, sa décomposition en produit de facteurs premiers est de la forme: $$n = p_1^{n_1} \times p_2^{n_2} \times \cdots \times p_k^{n_k}$$où les \(p_i\) sont des nombres premiers distincts, et où les \(n_i\) sont des exposants entiers naturels.
Par exemple, $$6804 = 2^2 \times 3^5 \times 7.$$Ici, les facteurs premiers sont 2, 3 et 7.
Appel à PythonTeX
Il est naturel de penser à Pythontex. 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.
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 ci-dessous :
Une petite question. Quel est l’intérêt d’utiliser ici \begingroup et \endgroup ?
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à.
Pour moi le code ci-dessous a marché :
On peut même écrire :
Une autre option est d’utiliser le package xargs qui permet de créer des macros avec des arguments optionnels :
Ensuite on peut utiliser dans le corps du doc latex la fonction ifactors comme :
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 😉
Bonjour , j’ai testé la commande définie par :
\newcommand{\decomp}[1]{
\py{decompose(#1)}
}
et a tout a fait marché.
Bonjour. Je viens de tester à nouveau, sous windows 10, ça ne fonctionne pas chez moi… Êtes-vous sous W10 aussi ?