IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation (La)TeX avancée Discussion :

décomposition en facteurs premiers


Sujet :

Programmation (La)TeX avancée

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut décomposition en facteurs premiers
    Bonjour à tous.

    Je souhaiter créer une macro qui prendrait comme argument un nombre entier positif et afficherait sa décomposition en facteurs premiers.

    Voici ce que j'ai créé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    \documentclass{article}
    \usepackage[frenchb]{babel}
    \usepackage{Fp}
    \usepackage{xstring}
    \usepackage{multido}
    \usepackage{ifthen}
    \usepackage{amsmath}
    \usepackage[load-configurations = abbreviations]{siunitx}% utiliser commande \num pour écriture correcte des nombres
    \sisetup{locale = FR,detect-all,}
    %
    %
    \newcommand*\eaddto[2]{%
    \edef\tmp{#2}%
    \expandafter\addto
    \expandafter#1%
    \expandafter{\tmp}
    }
    %
    %
    \begin{document}
    \FPeval{\a}{clip(1547)}
    \FPeval{\b}{clip(\a)}
    %
    \FPeval{\compteur}{clip(2)}
    %
    \whiledo{\b>1}{%
    \FPeval{\q}{round(\b/\compteur,5)}
    \IfInteger{\q}{%
    			\eaddto\listdiv{{\compteur}}%
    			\FPeval{\b}{clip(\q)}%
    			\eaddto\listquo{{\q}}%
    			}{%
    			\FPeval{\compteur}{clip(1+\compteur)}%
    			}
    			}
    %
    %
    % Affichage
    \StrLen{\listdiv}[\c] % longueur chaine
    \FPeval{\cbis}{clip(\c-1)}
    %
    %
    \begin{align*}
    	\num{\a} & =\multido{\n=1+1}{\cbis}{\StrChar{\listdiv}{\n}\times}\StrChar{\listdiv}{\c}\\
    \end{align*}
    \end{document}
    Ce programme fonctionne mais il ne me satisfait pas entièrement parce que j'aurai voulu ne pas afficher uniquement la décomposition, mais également les différentes étapes de calcul.
    Quand je remplace la commande dans les balises align* par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    \multido{\n=1+1}{\c}{%
    \num{\a} & = \multido{\m=1+1}{\n}{\StrChar{\listdiv}{\m}\times} \StrChar{\listquo}{\n}\\
    }
    j'ai un message d'erreur. J'en ai déduis qu'on ne pouvait pas cumuler les multido. Mais je n'ai pas trouvé d'autres solutions.
    Quelqu'un aurait une piste ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    En utilisant l’algorithme suivant…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    a = nombre
    b = 2
    liste = []
    Tant que a différent de 1
        q = a / b
        Si q est entier Alors
            a = q
            Ajouter b à liste
            Afficher nombre = liste[0] fois liste[1] ... fois a
        Sinon
            b = b + 1
        Fin Si
    Fin tant que
    On peut faire un code de ce genre (exemple fait rapidement).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    \documentclass{scrartcl}
    \usepackage{fp}
    \usepackage{xstring}
    \usepackage{multido}
    \usepackage{ifthen}
    \usepackage{etoolbox, amsmath}
     
    \def\liste{}
    \def\nombre{1547}
    \FPeval{\a}{clip(1547)}
    \FPeval{\b}{clip(2)}
     
    \newcommand*\eaddto[2]{%
       \edef\tmp{#2}%
       \expandafter\listadd\expandafter#1\expandafter{\tmp}
    }
     
    \begin{document}
       \whiledo{\a > 1}{%
          \FPeval{\q}{round(\a / \b, 5)}
          \IfInteger{\q}{\FPeval{\a}{clip(\q)} \FPeval{\g}{round(\b, 0)} \renewcommand*{\do}[1]{#1 \times} \eaddto{\liste}{\g} 
                         $\nombre = \dolistloop{\liste} \a$ \\}
                        {\FPadd{\b}{\b}{1}}                
       }
    \end{document}
    Dernière modification par Invité ; 22/06/2017 à 16h07.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    merci beaucoup le code fonctionne très bien.
    Seul inconvénient la première ligne n'est pas alignée avec les autres.

    J'ai donc essayé de mettre la boucle dans un environnement {align*} mais j'ai l'impression que l'utilisation d'une boucle dans un tel environnement ne fonctionne pas.

    Je voudrais comprendre votre programme.

    J'avais trouvé la commande \eaddto toute faite sur internet (déjà sans la comprendre) et je voudrais savoir pourquoi vous l'avez modifiée et à quoi servent vos modifications ?

    Je ne connais pas le package {etoolbox} et sa doc en anglais ne m'a pas beaucoup aidée.

    J'ai supposé que la commande \dolistloop était fournie par ce package mais je ne l'ai pas trouvée dans la doc. Pourriez-vous m'expliquer à quoi elle sert ?

    Merci beaucoup pour l'aide apportée

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 60
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    Aujourd’hui il existe une version de TeX qui embarque un vrai langage de programmation prévu pour ça, cela s'appelle Lua(La)TeX, pourquoi s'en priver ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    \documentclass{article}
    \usepackage{luaotfload}
    \usepackage{luatextra}
    \usepackage{amsmath,amssymb,marvosym,stmaryrd,calrsfs}%
    \usepackage{lualatex-math}%patch pour lualatex
     
    \usepackage[math-style=french]{unicode-math}
    \usepackage[frenchb]{babel}
     
    \begin{document}
     
    \begin{luacode}
        decomp = function(n)
            a = n
            div = ""
            q = 2
            while a ~=1 do
                r = math.mod(a,q)
                if r==0 then
                    a = a/q
                    if div ~="" then div = div.."\\times" end
                    div = div..q
                    if a~=1 then
                        tex.sprint("$"..n.."="..div.."\\times"..a.."$\\par")
                    end
                else
                    q = q+1
                end
            end
        end
    \end{luacode}
    \newcommand*{\decomp}[1]{\directlua{decomp(#1)}}%
     
    Le résultat : \par \decomp{1547}
     
    \end{document}

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mittag Voir le message
    Bonjour,

    Aujourd’hui il existe une version de TeX qui embarque un vrai langage de programmation prévu pour ça, cela s'appelle Lua(La)TeX, pourquoi s'en priver ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    \documentclass{article}
    \usepackage{luaotfload}
    \usepackage{luatextra}
    \usepackage{amsmath,amssymb,marvosym,stmaryrd,calrsfs}%
    \usepackage{lualatex-math}%patch pour lualatex
     
    \usepackage[math-style=french]{unicode-math}
    \usepackage[frenchb]{babel}
     
    \begin{document}
     
    \begin{luacode}
        decomp = function(n)
            a = n
            div = ""
            q = 2
            while a ~=1 do
                r = math.mod(a,q)
                if r==0 then
                    a = a/q
                    if div ~="" then div = div.."\\times" end
                    div = div..q
                    if a~=1 then
                        tex.sprint("$"..n.."="..div.."\\times"..a.."$\\par")
                    end
                else
                    q = q+1
                end
            end
        end
    \end{luacode}
    \newcommand*{\decomp}[1]{\directlua{decomp(#1)}}%
     
    Le résultat : \par \decomp{1547}
     
    \end{document}
    Solution cool et simple si le PO veut bien utiliser LuaTeX. Et on utilise facilement align avec elle.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Ai-je bien compris ?

    Lualatex est un moyen de programmer dans latex en utilisant un langage appelé Lua ?

    Comme je en connais pas ce langage, j'ai regardé le tutoriel Lua de Claude URBAN.

    Et si j'ai bien compris le code : le programme Lua apparait entre les balises luacode et est interprété ensuite par latex. En l’occurrence le code ici permet de définir la nouvelle commande decomp.

    La question que je me pose est : y a-t-il une traduction entre le langage Lua et celui entre les balises luacode ou est-ce vraiment du lua tel que je vais l'apprendre dans le tutoriel ?

Discussions similaires

  1. [Python 3.X] Programmation décomposition en produits de facteurs premiers d'un seul nombre
    Par Intrepid13 dans le forum Général Python
    Réponses: 16
    Dernier message: 22/09/2015, 18h47
  2. Décomposition en facteurs premiers
    Par Invité dans le forum Mathématiques
    Réponses: 7
    Dernier message: 23/04/2012, 23h39
  3. Décomposition en facteurs premiers
    Par Girl24 dans le forum Fortran
    Réponses: 6
    Dernier message: 18/11/2008, 13h08
  4. Décomposition en nombres premiers
    Par WhiteTigerZ dans le forum Pascal
    Réponses: 20
    Dernier message: 13/01/2007, 19h07
  5. Décomposition en facteurs premiers
    Par méphistopheles dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 07/11/2005, 20h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo