[Lualatex] Développement décimal propre d'une fraction

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 membres 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 : 7898
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

[Lualatex] Développement décimal propre d'une fraction

Message non lu par MB »

Voici un exemple permettant d'obtenir le développement décimal propre d'une fraction, avec la notation soulignée.
  • Fichier decimaldev.lua.

    Code : Tout sélectionner

    function divmod(a,b)
        local q = 0
        local r = a
        while not (r < b) do
            q = q+1
            r = r-b
        end
        return q,r
    end
    
    function contains(list,x)
        for k,v in pairs(list) do
            if v == x then return true end
        end
        return false
    end
    
    function index(list,x)
        for k,v in pairs(list) do
            if v == x then return k end
        end
    end
    
    function display(list,i)
        local a = ''
        local b = ''
        for k,v in pairs(list) do
            if k < i then a = a .. v else b = b .. v end
        end
        if b == '0' then
            return string.format([[\num{%s}]],a)
        else
            return string.format([[\num[retain-explicit-decimal-marker]{%s}\underline{%s}]],a,b)
        end
    end
    
    function decimaldev(a,b)
        local s = a*b < 0 and '-' or ''
        local q,r = divmod(math.abs(a),math.abs(b))
        local qlist = {s,tostring(q),'.'}
        local rlist = {}
        while not contains(rlist,r) do
            table.insert(rlist,r)
            q,r = divmod(r*10,math.abs(b))
            table.insert(qlist,tostring(q))
        end
        return display(qlist,index(rlist,r)+3)
    end
  • Exemple de fichier tex.

    Code : Tout sélectionner

    \documentclass{article}
    \usepackage[output-decimal-marker={,}]{siunitx}
    \directlua{dofile('decimaldev.lua')}
    \newcommand{\decimaldev}[2]{\directlua{tex.sprint(decimaldev(#1,#2))}}
    \begin{document}
    \begin{itemize}
    \item \decimaldev{123}{14}
    \item \decimaldev{5}{2}
    \item \decimaldev{6}{2}
    \item \decimaldev{5}{3}
    \end{itemize}
    \end{document}
  • Résultat obtenu après compilation lualatex.
    decimaldev.png
    decimaldev.png (4.97 Kio) Consulté 613 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 : 2150
Inscription : samedi 29 décembre 2007, 00:58

Re: [lualatex] Exemples d'utilisation

Message non lu par projetmbc »

Merci pour le partage. C'est pillable ?
MB
Administrateur
Administrateur
Messages : 7898
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [lualatex] Exemples d'utilisation

Message non lu par MB »

Pas de problème, chacun en fait ce qu'il en veut.
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.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 990
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [Lualatex] Développement décimal propre d'une fraction

Message non lu par un bon petit »

Je mets l'exacte traduction de cet algorithme simple d'arithmétique en TeX.
Il est cependant un peu corrigé, car il n'a pas le bug que possède celui de lua et est bien plus efficace pour l’algorithme de la division euclidienne :

Code : Tout sélectionner

\documentclass{article}
\catcode`\_11
\newcount\div_cnt
\newcount\divmod_cnt
\def\math_abs#1{\numexpr\ifnum#1<0-\fi#1\relax}
\def\math_sgn#1#2{\numexpr\ifnum#1<0-\fi\ifnum#2<0-\fi1\relax}
\def\math_divmod#1,#2=#3/#4;{%
	\divmod_cnt\numexpr#3\relax \divide\divmod_cnt\numexpr#4\relax
	\edef#1{\number\divmod_cnt}\edef#2{\number\numexpr#3-#1*#4\relax}%
}
\def\add_tomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\xadd_tomacro#1#2{\expandafter\add_tomacro\expandafter#1\expandafter{\expanded{#2}}}
\def\decdiv#1#2{%
	\begingroup
		\edef\div_q{\number\math_abs{#2}}%
		\math_divmod \int_result,\current_r = \math_abs{#1}/\div_q;%
		\edef\int_result{\ifnum\math_sgn{#1}{#2}=-1-\fi\int_result}%
		\ifnum\current_r>0 \add_tomacro\int_result{{,}}\fi
		\div_cnt0 \let\div_qlist\empty \def\div_rlist{,}%
		\loop
			\expandafter\find_index\expanded{{\div_rlist}{\current_r}}\r_index
			\ifnum\r_index=-1
				\advance\div_cnt1
				\xadd_tomacro\div_rlist{\current_r:\number\div_cnt,}%
				\math_divmod \current_q,\current_r=\current_r0/\div_q;%
				\xadd_tomacro\div_qlist{\current_q,}%
		\repeat
		\div_cnt1 \def\sum_decpartb{0}\let\dec_parta\empty \let\dec_partb\empty
		\loop
			\unless\ifx\div_qlist\empty
				\peek_digit\div_qlist\current_digit
				\ifnum\div_cnt<\r_index
					\xadd_tomacro\dec_parta\current_digit
				\else
					\xadd_tomacro\dec_partb\current_digit
					\xadd_tomacro\sum_decpartb{+\current_digit}%
				\fi
				\advance\div_cnt1
		\repeat
		\ensuremath{\int_result\dec_parta\ifnum\numexpr\sum_decpartb>0 \underline{\dec_partb}\fi}%
	\endgroup
}
\def\find_index#1#2#3{%
	\def\find_indexa##1,#2:##2,##3\_nil{\def#3{##2}}%
	\find_indexa#1#2:-1,\_nil
}
\def\peek_digit#1#2{%
	\ifx\empty#1%
		\def#2{-1}%
	\else
		\expandafter\peek_digita#1\_nil#1#2%
	\fi
}
\def\peek_digita#1,#2\_nil#3#4{\def#3{#2}\def#4{#1}}
\catcode`\_8
\begin{document}

\decdiv{123}{14}

\decdiv{5}{2}

\decdiv{6}{2}

\decdiv{47}{29}

\decdiv{2000000000}{3}
\end{document}
Screenshot_20221217_231803.png
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 7898
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Lualatex] Développement décimal propre d'une fraction

Message non lu par MB »

Merci pour cette version TeX.

Sinon, on parle de quel bug concernant la version Lua ?
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 : 2150
Inscription : samedi 29 décembre 2007, 00:58

Re: [Lualatex] Développement décimal propre d'une fraction

Message non lu par projetmbc »

Division avec des entiers ?
MB
Administrateur
Administrateur
Messages : 7898
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Lualatex] Développement décimal propre d'une fraction

Message non lu par MB »

Tu peux préciser ? Car là je ne vois toujours pas ce dont il est question.
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.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 990
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [Lualatex] Développement décimal propre d'une fraction

Message non lu par un bon petit »

Il y a 2 bugs qui sont mis en évidence par les exemples que j'ai rajoutés :
  • celui de la division euclidienne par soustractions. Qui est une folie pour 2000000000/3, même si lua « est rapide ».
  • celui qui plante avec les grands entiers. Essayez 47/29.
Programmer en TeX, TeXpérimental
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2150
Inscription : samedi 29 décembre 2007, 00:58

Re: [Lualatex] Développement décimal propre d'une fraction

Message non lu par projetmbc »

Qu'entends-tu comme souci avec 47/29 ? Pour ma part, j'ai la même période qu'avec https://www.wolframalpha.com/input?i=47%2F29 .
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 990
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [Lualatex] Développement décimal propre d'une fraction

Message non lu par un bon petit »

Ah oui...
Je sais plus ce que j'avais fait du coup. D'ici à ce qu'un de mes scripts lua plante et non celui donné ici, il n'y a qu'un pas.
Comme j'avais constaté le bug il y a plusieurs jours, je me rappelle plus du tout ce que j'avais bien pu bidouiller.
Programmer en TeX, TeXpérimental