diff options
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCDecomposerNombrePremier.tex')
-rw-r--r-- | macros/latex/contrib/profcollege/latex/PfCDecomposerNombrePremier.tex | 763 |
1 files changed, 763 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCDecomposerNombrePremier.tex b/macros/latex/contrib/profcollege/latex/PfCDecomposerNombrePremier.tex new file mode 100644 index 0000000000..6fab8783f9 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDecomposerNombrePremier.tex @@ -0,0 +1,763 @@ +%%% +% Nombre Premier +%%% +\setKVdefault[ClesNombrePremier]{Tableau=false,TableauVide=false,TableauVertical=false,TableauVerticalVide=false,Exposant=false,Longue=false,All=false,Arbre=false,ArbreVide=false,ArbreComplet=false,ArbreDessine=false,ArbreDessineVide=false,Entoure=false,Entourefin=false,Diviseurs=false,DiviseursT=false,Dot=\dotfill,Impose=false,ImposeAll=false,Potence=false,Decalage=10,Vide=false,CouleurFeuillage=ForestGreen,CouleurTronc=BurlyWood,CouleurFruits=Red,CouleurTexte=white}% +\defKV[ClesNombrePremier]{Nombre=\ifboolKV[ClesNombrePremier]{ArbreDessine}{}{\ifboolKV[ClesNombrePremier]{ArbreDessineVide}{}{\setKV[ClesNombrePremier]{Impose}}}}% +\defKV[ClesNombrePremier]{AllNombre=\setKV[ClesNombrePremier]{ImposeAll}}% +\defKV[ClesNombrePremier]{Impression=\setKV[ClesNombrePremier]{CouleurFeuillage=white,CouleurTronc=white,CouleurFruits=gris,CouleurTexte=black}} + +\newcommand\Decomposition[2][]{% + \useKVdefault[ClesNombrePremier]% + \setKV[ClesNombrePremier]{#1}% + \ifboolKV[ClesNombrePremier]{Impose}{\NombrePremierImpose{#2}{\useKV[ClesNombrePremier]{Nombre}}{\fpeval{#2/\useKV[ClesNombrePremier]{Nombre}}}}{}% + \ifboolKV[ClesNombrePremier]{ImposeAll}{\NombrePremierImpose{#2}{\useKV[ClesNombrePremier]{AllNombre}}{\fpeval{#2/\useKV[ClesNombrePremier]{AllNombre}}}}{}% + \ifboolKV[ClesNombrePremier]{Tableau}{\NombrePremier{#2}}{}% + \ifboolKV[ClesNombrePremier]{TableauVide}{\NombrePremier{#2}}{}% + \ifboolKV[ClesNombrePremier]{Potence}{\NombrePremierPotence{#2}}{}% + \ifboolKV[ClesNombrePremier]{TableauVertical}{\NombrePremierVertical{#2}}{}% + \ifboolKV[ClesNombrePremier]{TableauVerticalVide}{\NombrePremierVerticalVide{#2}}{}% + \ifboolKV[ClesNombrePremier]{Exposant}{\PremierExposant{#2}}{}% + \ifboolKV[ClesNombrePremier]{Longue}{\PremierLong{#2}}{}% + \ifboolKV[ClesNombrePremier]{All}{\NombrePremierExposant{#2}}{}% + \ifboolKV[ClesNombrePremier]{Arbre}{\MPArbre{#2}}{}% + \ifboolKV[ClesNombrePremier]{ArbreComplet}{\MPArbreComplet{#2}}{}% + \ifboolKV[ClesNombrePremier]{ArbreVide}{\MPArbreVide{#2}}{}% + \ifboolKV[ClesNombrePremier]{ArbreDessine}{\MPArbreDessine{#2}{\useKV[ClesNombrePremier]{Nombre}}}{}% + \ifboolKV[ClesNombrePremier]{ArbreDessineVide}{\setKV[ClesNombrePremier]{Vide=true}\MPArbreDessine{#2}{\useKV[ClesNombrePremier]{Nombre}}}{}% + \ifboolKV[ClesNombrePremier]{Diviseurs}{\ListeDiviseur{#2}}{}% + \ifboolKV[ClesNombrePremier]{DiviseursT}{\ListeDiviseurT{#2}}{}% +}% + +\def\MPArbre#1{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCArithmetique; + numeric depart; + pair Ancre[]; + numeric decalage; + decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; + + k:=0; + Ancre0:=(0,0); + racine:=#1; + + label(btex \num{#1} etex,(0,0)); + forever: + PremierSimple(racine); + exitif racine=1; + endfor; + + if \useKV[ClesNombrePremier]{Entoure}: + for l=1 upto k: + if Estcepremier(retenirnb[l]): + draw cercles(Ancre[l],0.25*decalage); + fi; + endfor; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; boolean Entoure; Entoure=\useKV[ClesNombrePremier]{Entoure};}] + input PfCArithmetique; + numeric depart; + pair Ancre[]; + + k:=0; + Ancre0:=(0,0); + racine:=#1; + label(LATEX("\num{"&decimal(racine)&"}"),(0,0)); + forever: + PremierSimplePdf(racine); + exitif racine=1; + endfor; + + if \useKV[ClesNombrePremier]{Entoure}: + for l=1 upto k: + if Estcepremier(retenirnb[l]): + draw cercles(Ancre[l],0.25*decalage); + fi; + endfor; + fi; +\end{mpost} +\fi +} + +\def\MPArbreComplet#1{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCArithmetique; + numeric depart; + pair Ancre[]; + numeric decalage; + decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; + + dx:=1cm; + dy:=1cm; + + pair N[][]; + nbe:=NbEtape(#1); + Positions(nbe); + if \useKV[ClesNombrePremier]{Entoure}: + draw polygone(N[nbe-1][0]+(-0.25*dx,0.25*decalage),N[nbe-1][nbe-1]+(0.25*dx,0.25*decalage),N[nbe-1][nbe-1]+(0.25*dx,-0.25*decalage),N[nbe-1][0]+(-0.25*dx,-0.25*decalage)) dashed evenly; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;}] + input PfCArithmetique; + numeric depart; + pair Ancre[]; + + dx:=1cm; + dy:=1cm; + + pair N[][]; + + PositionsPdf(NbEtape(#1)); + \end{mpost} + \fi +} + +\def\MPArbreVide#1{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCArithmetique; + numeric depart; + pair Ancre[]; + numeric decalage; + decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; + + dx:=1cm; + dy:=1cm; + + pair N[][]; + + PositionsVide(NbEtape(#1)); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric decalage; decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;}] + input PfCArithmetique; + numeric depart; + pair Ancre[]; + + dx:=1cm; + dy:=1cm; + + pair N[][]; + + PositionsVidePdf(NbEtape(#1)); + \end{mpost} + \fi +} + +\def\MPArbreDessine#1#2{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode} + input PfCArithmetique; + numeric depart; + pair Ancre[]; + numeric decalage; + decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; + rayonfruits:=3mm; + + color CouleurTronc,CouleurFeuillage,CouleurFruits,CouleurTexte; + CouleurTronc=\useKV[ClesNombrePremier]{CouleurTronc}; + CouleurFeuillage=\useKV[ClesNombrePremier]{CouleurFeuillage}; + CouleurFruits=\useKV[ClesNombrePremier]{CouleurFruits}; + CouleurTexte=\useKV[ClesNombrePremier]{CouleurTexte}; + + k:=0; + Ancre0:=(0,0); + racine:=#1; + k:=1; + Ancre1:=(-decalage,-decalage); + draw Branche(Ancre0,Ancre1); + retenirnb[1]:=#2; + racine:=#2; + forever: + PremierSimpleArbre(racine); + exitif racine=1; + endfor; + k:=k+1; + Ancre[k]:=(decalage,-decalage); + draw Branche(Ancre0,Ancre[k]); + retenirnb[k]:=#1 div #2; + racine:=retenirnb[k]; + forever: + PremierSimpleArbre(racine); + exitif racine=1; + endfor; + + fill cercles(Ancre[0],rayonfruits) withcolor white; + label(btex \num{#1} etex,(0,0)); + for l=1 upto k: + if \useKV[ClesNombrePremier]{Vide}: + fill cercles(Ancre[l],rayonfruits) withcolor white; + else: + if Estcepremier(retenirnb[l]): + fill cercles(Ancre[l],rayonfruits) withcolor CouleurFruits; + drawoptions(withcolor CouleurTexte); + label(TEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); + drawoptions(); + else: + fill cercles(Ancre[l],rayonfruits) withcolor white; + label(TEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); + fi; + fi; + endfor; + for l=0 upto k: + draw cercles(Ancre[l],rayonfruits); + endfor; + picture Bilan; + Bilan=currentpicture; + currentpicture:=nullpicture; + % Habillage + % On récupère le min des ordonnées des Ancre pour le feuillage + minord=1000; + nbancrearetenir=0; + for l=0 upto k: + if ypart(Ancre[l])<minord: + minord:=ypart(Ancre[l]); + nbancrearetenir:=l; + fi; + endfor; + pair D[]; + D0=0.5[Ancre0,(0,ypart(Ancre[nbancrearetenir]))]; + dotlabel("",D0); + % Herbe du sol + pair A[]; + A0=(xpart(Ancre0)-1cm,ypart(Ancre[nbancrearetenir])-2cm); + A10=(xpart(Ancre0)+1cm,ypart(Ancre[nbancrearetenir])-2cm); + for l=1 upto 9: + A[l]=(l/10)[A0,A10]+uniformdeviate(5)*(unitvector(A10-A0) rotated 90); + endfor; + %Pour le tronc + pair B[]; + B1=D0+(10+uniformdeviate(10))*(unitvector(D0-A0) rotated 90); + B2=symetrie(B1,Ancre0,1/2[A0,A10]);%=(-2mm,0); + B3=1/2[Ancre0,(xpart(1/2[A0,A10]),ypart(Ancre[k]))]; + path tronc; + tronc=A0{dir angle(A1-A0)}..{dir90}B1--B2{dir-90}..{dir angle(A10-A9)}A10--reverse(A0 for l=1 upto 10:--A[l] endfor)--cycle;% + fill tronc withcolor CouleurTronc; + trace tronc; + % Pour le feuillage + path feuillage; + feuillage=cercles((0,0),abs(Ancre[nbancrearetenir]-D0));% + pair C[]; + for l=0 upto 7: + C[l]=(pointarc(feuillage,l*45+(-5+uniformdeviate(10))) xscaled 1.25 yscaled 1) shifted D0; + endfor; + feuillage:=C[0] for l=1 upto 7:..(C[l] if (l mod 2)=0:+(0,2mm) else: +(0,-2mm) fi) endfor ..cycle; + fill feuillage withcolor CouleurFeuillage; + trace feuillage; + draw Bilan; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;color CouleurTronc,CouleurFeuillage,CouleurFruits,CouleurTexte;CouleurTronc=\useKV[ClesNombrePremier]{CouleurTronc};CouleurFeuillage=\useKV[ClesNombrePremier]{CouleurFeuillage};CouleurFruits=\useKV[ClesNombrePremier]{CouleurFruits}; CouleurTexte=\useKV[ClesNombrePremier]{CouleurTexte}; boolean Vide; Vide=\useKV[ClesNombrePremier]{Vide};}] + input PfCArithmetiquePDF; + numeric depart; + pair Ancre[]; + rayonfruits:=3mm; + + k:=0; + Ancre0:=(0,0); + racine:=#1; + k:=1; + Ancre1:=(-decalage,-decalage); + draw Branche(Ancre0,Ancre1); + retenirnb[1]:=#2; + racine:=#2; + forever: + PremierSimpleArbre(racine); + exitif racine=1; + endfor; + k:=k+1; + Ancre[k]:=(decalage,-decalage); + draw Branche(Ancre0,Ancre[k]); + retenirnb[k]:=#1 div #2; + racine:=retenirnb[k]; + forever: + PremierSimpleArbre(racine); + exitif racine=1; + endfor; + + fill cercles(Ancre[0],rayonfruits) withcolor white; + label(btex \num{#1} etex,(0,0)); + for l=1 upto k: + if Vide: + fill cercles(Ancre[l],rayonfruits) withcolor white; + else: + if Estcepremier(retenirnb[l]): + fill cercles(Ancre[l],rayonfruits) withcolor CouleurFruits; + drawoptions(withcolor CouleurTexte); + label(LATEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); + drawoptions(); + else: + fill cercles(Ancre[l],rayonfruits) withcolor white; + label(LATEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); + fi; + fi; + endfor; + for l=0 upto k: + draw cercles(Ancre[l],rayonfruits); + endfor; + picture Bilan; + Bilan=currentpicture; + currentpicture:=nullpicture; + % Habillage + minord=1000; + nbancrearetenir=0; + for l=0 upto k: + if ypart(Ancre[l])<minord: + minord:=ypart(Ancre[l]); + nbancrearetenir:=l; + fi; + endfor; + pair D[]; + D0=0.5[Ancre0,(0,ypart(Ancre[nbancrearetenir]))]; + pair A[]; + A0=(xpart(Ancre0)-1cm,ypart(Ancre[nbancrearetenir])-2cm); + A10=(xpart(Ancre0)+1cm,ypart(Ancre[nbancrearetenir])-2cm); + for l=1 upto 9: + A[l]=(l/10)[A0,A10]+uniformdeviate(5)*(unitvector(A10-A0) rotated 90); + endfor; + pair B[]; + B1=D0+(10+uniformdeviate(10))*(unitvector(D0-A0) rotated 90); + B2=symetrie(B1,Ancre0,1/2[A0,A10]);% + B3=1/2[Ancre0,(xpart(1/2[A0,A10]),ypart(Ancre[k]))]; + path tronc; + tronc=A0{dir angle(A1-A0)}..{dir90}B1--B2{dir-90}..{dir angle(A10-A9)}A10--reverse(A0 for l=1 upto 10:--A[l] endfor)--cycle;% + fill tronc withcolor CouleurTronc; + trace tronc; + path feuillage; + feuillage=cercles((0,0),abs(Ancre[nbancrearetenir]-D0));% + pair C[]; + for l=0 upto 7: + C[l]=(pointarc(feuillage,l*45+(-5+uniformdeviate(10))) xscaled 1.25 yscaled 1) shifted D0; + endfor; + feuillage:=C[0] for l=1 upto 7:..(C[l] if (l mod 2)=0:+(0,2mm) else: +(0,-2mm) fi) endfor ..cycle; + fill feuillage withcolor CouleurFeuillage; + trace feuillage; + draw Bilan; + \end{mpost} +\fi +} + +\newcount\premier% + +\newcommand\NombrePremier[1]{%\'ecrire la d\'ecomposition compl\`ete + % #1 le nombre premier \`a tester + \newcount\anp\newcount\bnp\newcount\cnp% + \anp=#1\relax + \bnp=2\relax + \premier=-1\relax + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + } + \ifnum\premier=0 + Le nombre \num{#1} est un nombre premier. + \else + \begin{align*} + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\ifboolKV[ClesNombrePremier]{TableauVide}{\phantom{\PremierEtape{#1}{##1}}}{\PremierEtape{#1}{##1}}\xintifboolexpr{##1<\premier}{\\}{}}% + \end{align*} + \fi +} + +\newcount\premierun +\newcount\premierdeux + +\newcommand\NombrePremierImpose[3]{% + % #1 le nombre premier \`a tester + % #2 est le premier facteur imposé + % #3 est le deuxième facteur imposé + \newcount\anp\newcount\bnp\newcount\cnp% + % Pour d\'eterminer le nombre d'\'etapes pour #1 + \anp=#1\relax + \bnp=2\relax + \premier=-1\relax + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% + % Pour d\'eterminer le nombre d'\'etapes pour #2 + \anp=#2\relax + \bnp=2\relax + \premierun=-1\relax + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \global\premierun=\numexpr\premierun+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% + % Pour d\'eterminer le nombre d'\'etapes pour #3 + \anp=#3\relax + \bnp=2\relax + \premierdeux=-1\relax + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \global\premierdeux=\numexpr\premierdeux+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% + \ifboolKV[ClesNombrePremier]{ImposeAll}{\xdef\PfCRappelImposeAll{1}}{\xdef\PfCRappelImposeAll{0}}% + \ifnum\premier=0 + Le nombre \num{#1} est un nombre premier. + \else + \xintifboolexpr{\premierun>\premierdeux}{\premier=\premierun}{\premier=\premierdeux} + \begin{align*} + \num{#1}&=\num{#2}\times\num{#3}%\\ + \xintifboolexpr{\premier>0}{\\% + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\xintifboolexpr{##1<\premierun}{\PremierEtape{#2}{##1}}{\Decomposition[Longue]{#2}}\mathrel{\times}\xintifboolexpr{##1<\premierdeux}{\PremierEtape{#3}{##1}}{\Decomposition[Longue]{#3}}\xintifboolexpr{##1<\premier}{\\}{}}% + }{}% + \xintifboolexpr{\PfCRappelImposeAll==1}{\\\num{#1}&=\PremierExposant{#1}}{}% + \end{align*} + \fi +}% + +\newcommand\NombrePremierVertical[1]{%\'ecrire la d\'ecomposition compl\`ete + % #1 le nombre premier \`a tester + \newcount\anpv\newcount\bnpv\newcount\cnpv% + \anpv=#1\relax + \bnpv=2\relax + \premier=-1\relax + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anpv > 1}{% + \modulo{\the\anpv}{\the\bnpv} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnpv=\numexpr\anpv/\bnpv\relax + \anpv=\cnpv\relax + \else% + \bnpv=\numexpr\bnpv+1\relax% + \fi% + } + \ifnum\premier=0 + Le nombre \num{#1} est un nombre premier. + \else + \begin{tabular}{c|c} + \xintFor* ##1 in {\xintSeq {0}{\premier}}\do + {\PremierMultipleVide{#1}{##1}&\xdef\Etape{\fpeval{##1+1}}\PremierDiviseurVide{#1}{\Etape} + \xintifboolexpr{##1<\premier}{\\}{\\1\\}}% + \end{tabular} + \fi +} + +\newcommand\NombrePremierPotence[1]{% + % #1 le nombre premier \`a tester + \newcount\anpv\newcount\bnpv\newcount\cnpv% + \anpv=#1\relax + \bnpv=2\relax + \premier=-1\relax + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anpv > 1}{% + \modulo{\the\anpv}{\the\bnpv} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnpv=\numexpr\anpv/\bnpv\relax + \anpv=\cnpv\relax + \else% + \bnpv=\numexpr\bnpv+1\relax% + \fi% + } + \ifnum\premier=0% + Le nombre \num{#1} est un nombre premier.% + \else% + \xdef\PotenceCases{\fpeval{\premier+2}}% + \begin{NiceTabular}{*{\PotenceCases}{c}} + %\Body + \PremierMultipleVide{#1}{0}&\multicolumn{1}{|c}{\PremierDiviseurVide{#1}{1}}\\ + \hhline{~-} + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do{% + \xintifboolexpr{##1 == 0}{}{\xintFor* ##2 in {\xintSeq {1}{##1}}\do{% + &}% + }% + \multicolumn{1}{|c}{\PremierMultipleVide{#1}{##1}}&\multicolumn{1}{|c}{\xdef\Etape{\fpeval{##1+1}}\PremierDiviseurVide{#1}{\Etape}}\\ + \hhline{*{\fpeval{##1+1}}{~}-} + }% + \xintFor* ##1 in {\xintSeq {1}{\fpeval{\PotenceCases-2}}}\do{% + &}&\multicolumn{1}{|c}{1}\\ + \CodeAfter + \tikz \draw [white,fill=white] (1 -|2) circle (0.5mm); + \xintFor* ##1 in {\xintseq{2}{\PotenceCases}}\do{% + \tikz \draw [white,fill=white,transform canvas={xshift=0mm}] (\fpeval{##1-1} -|##1) circle (0.5mm); + }% + \end{NiceTabular}% + \fi% +} + +\newcommand\PremierDiviseurVide[2]{% + %#1 : le nombre entier \`a tester + %#2 : le nombre d'\'etapes \`a effectuer + \newcount\anpvv\newcount\bnpvv\newcount\cnpvv\newcount\dnpvv% + \ensuremath{% + \anpvv=#1\relax + \bnpvv=2\relax + \dnpvv=0\relax% + \whiledo{\anpvv > 1}{% + \whiledo{\dnpvv < \number#2}{% + \modulo{\the\anpvv}{\the\bnpvv} + \ifnum\remainder=0\relax + \dnpvv=\numexpr\dnpvv+1\relax + \cnpvv=\numexpr\anpvv/\bnpvv\relax + \anpvv=\cnpvv\relax + \else% + \bnpvv=\numexpr\bnpvv+1\relax% + \fi% + } + \num{\the\bnpvv}% + \anpvv=1% + } + } +} + +\newcommand\PremierMultipleVide[2]{% + %#1 : le nombre entier \`a tester + %#2 : le nombre d'\'etapes \`a effectuer + \newcount\anpmv\newcount\bnpmv\newcount\cnpmv\newcount\dnpmv% + \ensuremath{% + \anpmv=#1\relax + \bnpmv=2\relax + \dnpmv=0\relax% + \whiledo{\anpmv > 1}{% + \whiledo{\dnpmv < \number#2}{% + \modulo{\the\anpmv}{\the\bnpmv} + \ifnum\remainder=0\relax + \dnpmv=\numexpr\dnpmv+1\relax + \cnpmv=\numexpr\anpmv/\bnpmv\relax + \anpmv=\cnpmv\relax + \else% + \bnpmv=\numexpr\bnpmv+1\relax% + \fi% + } + \num{\the\anpmv}% + \anpmv=1% + } + } +} + +\newcommand\NombrePremierVerticalVide[1]{% + % #1 le nombre premier \`a tester + \newcount\anpv\newcount\bnpv\newcount\cnpv% + \anpv=#1\relax + \bnpv=2\relax + \premier=-1\relax + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anpv > 1}{% + \modulo{\the\anpv}{\the\bnpv} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnpv=\numexpr\anpv/\bnpv\relax + \anpv=\cnpv\relax + \else% + \bnpv=\numexpr\bnpv+1\relax% + \fi% + } + \ifnum\premier=0 + Le nombre \num{#1} est un nombre premier.% + \else + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{c|c} + \PremierMultipleVide{#1}{0}&\hbox to1cm{\useKV[ClesNombrePremier]{Dot}}\\ + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do + {\hbox to1cm{\useKV[ClesNombrePremier]{Dot}}&\hbox + to1cm{\useKV[ClesNombrePremier]{Dot}}\xintifboolexpr{##1<\premier}{\\}{\\\hbox + to1cm{\useKV[ClesNombrePremier]{Dot}}\\}}% + \end{tabular} + \renewcommand{\arraystretch}{1} + \fi +} + +\newcommand\NombrePremierExposant[1]{% + \newcount\anp\newcount\bnp\newcount\cnp% + % #1 le nombre premier \`a tester + \anp=#1\relax% + \bnp=2\relax% + \premier=-1\relax% + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax% + \global\premier=\numexpr\premier+1\relax% + \cnp=\numexpr\anp/\bnp\relax% + \anp=\cnp\relax% + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% + \ifnum\premier=0% + Le nombre \num{#1} est un nombre premier.% + \else% + \begin{align*} + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\PremierEtape{#1}{##1}\\}% + \num{#1}&=\PremierExposant{#1}% + \end{align*}% + \fi% +}% + +\newcommand\PremierEtape[2]{% + %#1 : le nombre entier \`a tester + %#2 : le nombre d'\'etapes \`a effectuer + \newcount\anp\newcount\bnp\newcount\cnp\newcount\dnp% + \ensuremath{% + \anp=#1\relax + \bnp=2\relax + \dnp=0\relax% + \whiledo{\anp > 1}{% + \whiledo{\dnp < \number#2}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \dnp=\numexpr\dnp+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \num{\the\bnp}\times% + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + } + \num{\the\anp}% + \anp=1% + } + } +} + +\newcommand\PremierExposant[1]{% + %#1 : le nombre entier \`a tester + \ensuremath{% + \newcount\anp\newcount\bnp\newcount\cnp% + \newcount\pileb\newcount\exposant% + \exposant=0\relax% + \anp=#1\relax% + \bnp=2\relax% + \pileb=2\relax% + \whiledo{\the\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \cnp=\numexpr\anp/\bnp\relax + \ifnum\pileb=\bnp + \exposant=\numexpr\exposant+1\relax + \fi + \anp=\cnp\relax + \else% + \ifnum\exposant>0\relax + \num{\the\pileb}\ifnum\exposant>1 ^{\num{\the\exposant}}\fi\times% + \fi + \bnp=\numexpr\bnp+1\relax% + \pileb=\bnp\relax% + \exposant=0\relax% + \fi% + }% + \num{\the\pileb}\ifnum\exposant>1^{\num{\the\exposant}}\fi% + }% +}% + +\newcommand\PremierLong[1]{% + %#1 : le nombre entier \`a tester + \ensuremath{% + \newcount\anpl\newcount\bnpl\newcount\cnpl% + \newcount\pilebl% + \anpl=#1\relax% + \bnpl=2\relax% + \pilebl=2\relax% + \whiledo{\the\anpl > 1}{% + \modulo{\the\anpl}{\the\bnpl} + \ifnum\remainder=0\relax + \cnpl=\numexpr\anpl/\bnpl\relax + \num{\the\bnpl}\ifnum\anpl>\bnpl\times\fi% + \anpl=\cnpl\relax + \else% + \bnpl=\numexpr\bnpl+1\relax% + \pilebl=\bnpl\relax% + \fi% + } + } +} + +\newcommand\ListeDiviseur[1]{%#1 : le nombre entier \`a tester + \newcount\anp\newcount\bnp% + \anp=#1% + \bnp=2\relax% + 1 % + \whiledo{\bnp<\anp}{% + \modulo{\the\anp}{\the\bnp}{}% + \ifnum\remainder=0% + ; $\num{\the\bnp}$ % + \fi% + \bnp=\numexpr\bnp+1% + }% + et \num{\the\anp}% +} + +\newcount\anpT\newcount\bnpT\newcount\cnpT\newcount\dnpT% + +\newcommand\ListeDiviseurT[1]{%#1 : le nombre entier \`a tester + \anpT=#1% + \bnpT=2\relax% + %On compte les diviseurs propres. + \cnpT=0\relax% + \whiledo{\bnpT<\anpT}{% + \modulo{\the\anpT}{\the\bnpT}{}% + \ifnum\remainder=0% + \cnpT=\numexpr\cnpT+1% + \fi% + \bnpT=\numexpr\bnpT+1% + }% + \ifodd\cnpT% + \begin{tabular}{c|c}% + 1&\num{#1}\\ + \xintFor* ##1 in {\xintSeq {1}{\fpeval{(\cnpT+1)/2}}}\do{% + \DiviseurNumero{#1}{##1}\num{\fpeval{\dnpT}}\uppercase{&}\DiviseurNumero{#1}{##1}\xintifboolexpr{\dnpT=\fpeval{#1/\dnpT}}{}{\num{\fpeval{#1/\dnpT}}}\\ + } + \end{tabular}% + \else% + \begin{tabular}{c|c} + 1&\num{#1}\\ + \xintFor* ##1 in {\xintSeq {1}{\fpeval{\cnpT/2}}}\do{% + \DiviseurNumero{#1}{##1}\num{\fpeval{\dnpT}}\uppercase{&}\DiviseurNumero{#1}{##1}\num{\fpeval{#1/\dnpT}}\\ + } + \end{tabular}% + \fi% +}% + +\newcommand\DiviseurNumero[2]{% + % #1 nb entier \`a tester + % #2 no du diviseur (\`a part 1 et #1) + \anpT=#1% + \bnpT=2\relax% + %On compte les diviseurs propres. + \cnpT=0\relax% + \whiledo{\bnpT<\anpT}{% + \modulo{\the\anpT}{\the\bnpT}{}% + \ifnum\remainder=0% + \cnpT=\numexpr\cnpT+1% + \ifnum\cnpT=\numexpr#2-1% + \dnpT=\bnpT% + \bnpT=\anpT% + \fi% + \fi% + \bnpT=\numexpr\bnpT+1% + }% +}%
\ No newline at end of file |