%%%
% Simplification
%%%
\def\filedateSimpFraction{2025/05/26}%
\def\fileversionSimpFraction{0.1b}%
\message{-- \filedateSimpFraction\space v\fileversionSimpFraction}%
%
\makeatletter%by christian Tellechea
% Calcul du PGCD de #1 et #2
\newcount\cnt@a\newcount\cnt@b\newcount\pgcd
\def\PGCD#1#2{%
  \ifnum#1>#2\cnt@a#1\cnt@b#2\else\cnt@a#2\cnt@b#1\relax\fi
  \PGCD@i
}
\def\PGCD@i{\edef\PGCD@ii##1{##1{\number\cnt@a}{\number\cnt@b}}\PGCD@ii\PGCD@iii}
\def\PGCD@iii#1#2{%
  \cnt@b#1\relax\global\divide\cnt@b#2%
  \global\cnt@b\numexpr#1-#2*\cnt@b%
  \global\cnt@a#2\global\pgcd\cnt@a%
  \ifnum\cnt@b>\z@\expandafter\PGCD@i%
  \fi}%
\makeatother

\def\PfCSimplifiable#1#2{%
  \ensuremath{%
    \PGCD{#1}{#2}%
    \ifnum\pgcd>1\relax
      \text{ ou }\Simplification{#1}{#2}%
    \fi
  }%
}%

\newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno
\def\SSimplifie#1#2{%
  % Simplification d'une \'ecriture #1/#2
  \ensuremath{
    \numerateur=\number#1
    \denominateur=\number#2
    \ifnum\number#1<0\relax
      \valabsnum=\numexpr0-\number#1
    \else
      \valabsnum=\number#1
    \fi
    \ifnum\number#2<0\relax
      \valabsdeno=\numexpr0-\number#2
    \else
      \valabsdeno=\number#2
    \fi
    \ifnum\the\numerateur<0\relax
      \ifnum\the\denominateur<0\relax
        \numerateur=\valabsnum
        \denominateur=\valabsdeno
      \fi
    \else
      \ifnum\the\denominateur<0\relax
        \numerateur=-\valabsnum
        \denominateur=\valabsdeno
      \fi
    \fi
    \ifnum\number#2=0\relax
      \text{\bfseries(???)}
    \else
      \ifnum\number#1=0\relax
        0
      \else
        \PGCD{\the\valabsnum}{\the\valabsdeno}%
        \ifnum\pgcd>1\relax
          \ifthenelse{\pgcd=\number#2 \OR \pgcd=\the\valabsdeno}{%
            \divide\numerateur by \denominateur\num{\the\numerateur}
            \denominateur=1
          }{\divide\numerateur by\pgcd%
            \divide\denominateur by\pgcd%
            \frac{\num{\the\numerateur}}{\num{\the\denominateur}}
          }
        \else%%%comme on est avec les n\'egatifs, on doit regarder si la valeur absolue est \'egale \`a 1
          \ifnum\valabsdeno=1\relax
            \divide\numerateur by \denominateur\num{\the\numerateur}
            \denominateur=1
          \else
            \frac{\num{\the\numerateur}}{\num{\the\denominateur}}
          \fi
        \fi%
      \fi%
    \fi%
  }%
}


\newcommand\SSimpli[2]{%
  % D\'ecomposition d'une simplification de #1/#2
  \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno%
  \numerateur=\number#1
  \denominateur=\number#2
  \ifnum\number#1<0
  \valabsnum=\numexpr0-\number#1
  \else
  \valabsnum=\number#1
  \fi
  \ifnum\number#2<0
  \valabsdeno=\numexpr0-\number#2
  \else
  \valabsdeno=\number#2
  \fi
  \ifnum\the\numerateur<0\relax
    \ifnum\the\denominateur<0\relax
      \numerateur=\valabsnum
      \denominateur=\valabsdeno
    \fi
  \else
    \ifnum\the\denominateur<0\relax
      \numerateur=-\valabsnum
      \denominateur=\valabsdeno
    \fi
  \fi
  \ifnum\number#2=0\relax
    \ensuremath{\text{\bfseries(???)}}
  \else
      \ifnum\number#1=0\relax
        0
      \else
        \PGCD{\the\valabsnum}{\the\valabsdeno}%
        \ifnum\pgcd>1\relax
          \ifthenelse{\pgcd=\number#2 \OR \pgcd=\the\valabsdeno}{%
            \divide\numerateur by \denominateur\num{\the\numerateur}
          }{%\divide\numerateur by\pgcd%
            % \divide\denominateur by\pgcd%
            \ensuremath{\frac{\num{\the\numerateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}{\num{\the\denominateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}}%
          }
        \else
          \ifnum\denominateur=1\relax
            \ensuremath{\frac{\num{\the\numerateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}{\num{\the\denominateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}}
          \else
            \ensuremath{\frac{\num{\the\numerateur}}{\num{\the\denominateur}}}
          \fi
        \fi
      \fi
    \fi
}

\newcount\anpdc\newcount\bnpdc\newcount\cnpdc\newcount\dnpdc%
\newcount\PfCDivCom%
\newcommand\DiviseurCommun[2]{%
  % #1 : le premier nombre entier
  % #2 : le deuxi\`eme nombre entier
  \anpdc=#1%
  \cnpdc=#2%
  \bnpdc=2\relax%
  \dnpdc=\numexpr#1+1\relax%
  \PfCDivCom=1\relax%
  \whiledo{\bnpdc<\dnpdc}{%
    \modulo{\the\anpdc}{\the\bnpdc}\relax
    \ifnum\remainder=0%
    \modulo{\the\cnpdc}{\the\bnpdc}
    \ifnum\remainder=0%
    \PfCDivCom=\bnpdc%
    \bnpdc=\anpdc%
    \else%
    \PfCDivCom=1%
    \fi
    \else%
    \PfCDivCom=1%
    \fi
    \bnpdc=\numexpr\bnpdc+1\relax%
  }%
}

\NewDocumentCommand\LongueSimplification{mm}{%
  \xdef\PfCNumerateurDiv{#1}%
  \xdef\PfCDenominateurDiv{#2}%
  \ifemptyKV[ClesSimplification]{Nombre}{%
    \DiviseurCommun{#1}{#2}%
  }{%
    \PfCDivCom=\useKV[ClesSimplification]{Nombre}%
  }%
  \ifboolKV[ClesSimplification]{Debut}{%
    \ensuremath{%
      \whiledo{\PfCDivCom>1}{%
        \frac{\mathcolor{PfCSimpliCol}{\num{\the\PfCDivCom}}\times\ifboolKV[ClesSimplification]{ACompleter}{\pointilles[20pt]}{\num{\fpeval{\PfCNumerateurDiv/\the\PfCDivCom}}}}{\mathcolor{PfCSimpliCol}{\num{\the\PfCDivCom}}\times\ifboolKV[ClesSimplification]{ACompleter}{\pointilles[20pt]}{\num{\fpeval{\PfCDenominateurDiv/\the\PfCDivCom}}}}=\frac{\ifboolKV[ClesSimplification]{ACompleter}{\pointilles[20pt]}{\num{\fpeval{\PfCNumerateurDiv/\PfCDivCom}}}}{\ifboolKV[ClesSimplification]{ACompleter}{\pointilles[20pt]}{\num{\fpeval{\PfCDenominateurDiv/\PfCDivCom}}}}%
        \xdef\PfCNumerateurDiv{\fpeval{\PfCNumerateurDiv/\PfCDivCom}}%
        \xdef\PfCDenominateurDiv{\fpeval{\PfCDenominateurDiv/\PfCDivCom}}%
        \DiviseurCommun{\PfCNumerateurDiv}{\PfCDenominateurDiv}%
        \xintifboolexpr{\PfCDivCom>1}{=}{}%
      }%
    }%
  }{%
    \ensuremath{%
      \whiledo{\PfCDivCom>1}{%
        \frac{\ifboolKV[ClesSimplification]{ACompleter}{\pointilles[20pt]}{\num{\fpeval{\PfCNumerateurDiv/\the\PfCDivCom}}}\times\mathcolor{PfCSimpliCol}{\num{\the\PfCDivCom}}}{\ifboolKV[ClesSimplification]{ACompleter}{\pointilles[20pt]}{\num{\fpeval{\PfCDenominateurDiv/\the\PfCDivCom}}}\times\mathcolor{PfCSimpliCol}{\num{\the\PfCDivCom}}}=\frac{\ifboolKV[ClesSimplification]{ACompleter}{\pointilles[20pt]}{\num{\fpeval{\PfCNumerateurDiv/\PfCDivCom}}}}{\ifboolKV[ClesSimplification]{ACompleter}{\pointilles[20pt]}{\num{\fpeval{\PfCDenominateurDiv/\PfCDivCom}}}}%
        \xdef\PfCNumerateurDiv{\fpeval{\PfCNumerateurDiv/\PfCDivCom}}%
        \xdef\PfCDenominateurDiv{\fpeval{\PfCDenominateurDiv/\PfCDivCom}}%
        \DiviseurCommun{\PfCNumerateurDiv}{\PfCDenominateurDiv}%
        \xintifboolexpr{\PfCDivCom>1}{=}{}%
      }%
    }%
  }%
}%

\setKVdefault[ClesSimplification]{Details=false,All=false,Longue=false,Fleches=false,Contraire=0,Couleur=black,Debut=false,Decomposition=false,DecompositionSeule=false,ACompleter=false,Nombre={}}%

\newcounter{NbFrac}%
\setcounter{NbFrac}{0}%

\NewDocumentCommand\Simplification{somm}{%
  \stepcounter{NbFrac}%
  \useKVdefault[ClesSimplification]%
  \setKV[ClesSimplification]{#2}%
  \IfBooleanTF{#1}{%
    \PGCD{\fpeval{abs(#3)}}{\fpeval{abs(#4)}}%
    \ifnum\fpeval{#3*#4}>0\relax%
      \edef\faa{\fpeval{abs(#3/\the\pgcd)}/\fpeval{abs(#4/\the\pgcd)}}%
    \else%
      \edef\faa{-\fpeval{abs(#3/\the\pgcd)}/\fpeval{abs(#4/\the\pgcd)}}%
    \fi%
    }{\ifboolKV[ClesSimplification]{Fleches}{%
    \setsepchar[*]{,*/}%\ignoreemptyitems
    \readlist*\Listea{#3}%
    \readlist*\Listeb{#4}%
    \ensuremath{%
      \frac{\tikzmarknode[anchor=north]{A-\theNbFrac}{\num{\Listea[1,1]}}{}}{\tikzmarknode[anchor=south]{B-\theNbFrac}{\num{\Listeb[1,1]}}{}}=\frac{\tikzmarknode[anchor=north]{C-\theNbFrac}{\Listea[1,3]}{}}{\tikzmarknode[anchor=south]{D-\theNbFrac}{\Listeb[1,3]}{}}%
    }%
    \begin{tikzpicture}[remember picture,overlay]%
      \draw[out=45,in=135,-stealth,transform canvas={yshift=0.25em}]
      let
      \p1=(pic cs:A-\theNbFrac),
      \p2=(pic cs:C-\theNbFrac)
      in (pic cs:A-\theNbFrac) to node[midway,above]{\Listea[1,2]}(\x2,\y1);
      \draw[out=-45,in=-135,-stealth,transform canvas={yshift=-0.25em}] (pic cs:B-\theNbFrac) to node[midway,below]{\Listeb[1,2]}(pic cs:D-\theNbFrac);%
    \end{tikzpicture}%
  }{%
    \xintifboolexpr{\useKV[ClesSimplification]{Contraire}>1}{%
      \ensuremath{%
        \frac{\num{#3}}{\num{#4}}=\frac{\num{#3}\times\num{\useKV[ClesSimplification]{Contraire}}}{\num{#4}\times\num{\useKV[ClesSimplification]{Contraire}}}=\frac{\num{\fpeval{\useKV[ClesSimplification]{Contraire}*#3}}}{\num{\fpeval{\useKV[ClesSimplification]{Contraire}*#4}}}%
      }%
    }{%
      \ifboolKV[ClesSimplification]{DecompositionSeule}{%
        \DecompositionSimplificationSeule{#3}{#4}%
      }{%
        \ifboolKV[ClesSimplification]{Decomposition}{%
          \DecompositionSimplification{#3}{#4}%
        }{%
          \ifboolKV[ClesSimplification]{Longue}{%
            \colorlet{PfCSimpliCol}{\useKV[ClesSimplification]{Couleur}}%
            \LongueSimplification{#3}{#4}%
          }{%
            \ifboolKV[ClesSimplification]{Details}{\SSimpli{#3}{#4}}{\ifboolKV[ClesSimplification]{All}{\ensuremath{\SSimpli{#3}{#4}=\SSimplifie{#3}{#4}}}{\SSimplifie{#3}{#4}}}%
          }%
        }%
      }%
    }%
  }%
  }%
}%

\NewDocumentCommand\DecompositionSimplificationold{smm}{%
  \setsepchar{,}\ignoreemptyitems%
  \RecupListeTousFacteursPremier{#2}%
  \readlist*\DiviseurHaut{\PfCPileFacteurs}%
  \RecupListeTousFacteursPremier{#3}%
  \readlist*\DiviseurBas{\PfCPileFacteurs}%
  \xdef\LongueurH{\DiviseurHautlen}%
  \xdef\LongueurB{\DiviseurBaslen}%
  \xdef\PfCPremierFacteur{#2}%
  \xdef\PfCDeuxiemeFacteur{#3}%
  \DiviseurCommun{#2}{#3}%
  \ensuremath{%
    \ifnum\PfCDivCom>1%
      \frac{%
        \xintFor* ##2 in{\xintSeq{1}{\LongueurH}}\do{%
          \DiviseurCommun{\DiviseurHaut[##2]}{\PfCDeuxiemeFacteur}
          \ifnum\PfCDivCom>1%
            \mathcolor{\useKV[ClesSimplification]{Couleur}}{\num{\DiviseurHaut[##2]}}
            \xdef\PfCDeuxiemeFacteur{\fpeval{\PfCDeuxiemeFacteur/\DiviseurHaut[##2]}}
          \else
            \num{\DiviseurHaut[##2]}
          \fi
          \xintifForLast{}{\times}
        }
      }{%
        \xintFor* ##2 in{\xintSeq{1}{\LongueurB}}\do{%
          \DiviseurCommun{\DiviseurBas[##2]}{\PfCPremierFacteur}
          \ifnum\PfCDivCom>1%
            \mathcolor{\useKV[ClesSimplification]{Couleur}}{\num{\DiviseurBas[##2]}}
            \xdef\PfCPremierFacteur{\fpeval{\PfCPremierFacteur/\DiviseurBas[##2]}}
          \else
            \num{\DiviseurBas[##2]}
          \fi
          \xintifForLast{}{\times}
        }
      }\IfBooleanTF{#1}{}{=\frac{\num{\PfCPremierFacteur}}{\num{\PfCDeuxiemeFacteur}}}
    \else
      \tofrac{#2/#3}
    \fi
  }%
}%

\NewDocumentCommand\DecompositionSimplification{smm}{%
  \setsepchar{,}\ignoreemptyitems%
  \RecupListeTousFacteursPremier{\fpeval{abs(#2)}}%
  \readlist*\DiviseurHaut{\PfCPileFacteurs}%
  \RecupListeTousFacteursPremier{\fpeval{abs(#3)}}%
  \readlist*\DiviseurBas{\PfCPileFacteurs}%
  \xdef\LongueurH{\DiviseurHautlen}%
  \xdef\LongueurB{\DiviseurBaslen}%
  \xdef\PfCPremierFacteur{\fpeval{abs(#2)}}%
  \xdef\PfCDeuxiemeFacteur{\fpeval{abs(#3)}}%
  \DiviseurCommun{\fpeval{abs(#2)}}{\fpeval{abs(#3)}}%
  \ensuremath{%
    \ifnum\PfCDivCom>1%
      \frac{%
        \ifnum#2<0\relax-\fi
        \xintFor* ##2 in{\xintSeq{1}{\LongueurH}}\do{%
          \DiviseurCommun{\DiviseurHaut[##2]}{\PfCDeuxiemeFacteur}
          \ifnum\PfCDivCom>1%
            \mathcolor{\useKV[ClesSimplification]{Couleur}}{\num{\DiviseurHaut[##2]}}
            \xdef\PfCDeuxiemeFacteur{\fpeval{\PfCDeuxiemeFacteur/\DiviseurHaut[##2]}}
          \else
            \num{\DiviseurHaut[##2]}
          \fi
          \xintifForLast{}{\times}
        }
      }{%
        \ifnum#3<0\relax-\fi
        \xintFor* ##2 in{\xintSeq{1}{\LongueurB}}\do{%
          \DiviseurCommun{\DiviseurBas[##2]}{\PfCPremierFacteur}
          \ifnum\PfCDivCom>1%
            \mathcolor{\useKV[ClesSimplification]{Couleur}}{\num{\DiviseurBas[##2]}}
            \xdef\PfCPremierFacteur{\fpeval{\PfCPremierFacteur/\DiviseurBas[##2]}}
          \else
            \num{\DiviseurBas[##2]}
          \fi
          \xintifForLast{}{\times}
        }
      }\IfBooleanTF{#1}{}{=\frac{\ifnum\fpeval{#2*#3}<0\relax-\fi\num{\PfCPremierFacteur}}{\num{\PfCDeuxiemeFacteur}}}
    \else
      \tofrac{#2/#3}
    \fi
  }%
}%

\NewDocumentCommand\DecompositionSimplificationSeule{mm}{%
  \DecompositionSimplification*{#1}{#2}%
}%

\NewDocumentCommand\LesDiviseursCommuns{mm}{%
  \xdef\PfCListeDivComAvant{1}%
  \xdef\PfCListeDivComAvantPoint{1}%
  \xintFor* ##2 in {\xintSeq{2}{#1}}\do{%
    \modulo{#1}{##2}\relax
    \ifnum\remainder=0\relax%
      \modulo{#2}{##2}\relax
      \ifnum\remainder=0\relax%
        \xdef\PfCListeDivComAvant{\PfCListeDivComAvant,##2}%
        \xdef\PfCListeDivComAvantPoint{\PfCListeDivComAvantPoint;##2}%
      \fi%
    \fi%
  }%
}%