décomposition produit facteurs premiers pythontex

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

  • Dernière modification de la publication :26 octobre 2021
  • Temps de lecture :5 min de lecture
  • Commentaires de la publication :6 commentaires

Loading

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.

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 ci-dessous :

decompTélécharger
0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
6 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Fernando S. Delgado Trujillo

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

Fernando S. Delgado Trujillo

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

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 😉

most

Bonjour , j’ai testé la commande définie par :

\newcommand{\decomp}[1]{
\py{decompose(#1)}
}
et a tout a fait marché.