50

I don't want to display the modulo symbol, I want to programmatically calculate n modulo 3 and display the result.

Gonzalo Medina
  • 505,128
mcandre
  • 911

8 Answers8

44

There are several nice answers using different packages. I'd like to note that TeX uses integer arithmetics, so it is easy to program the standard formula a-(a/b)*b, where / means integer division.

Plain TeX solution:

\newcount\tmpcnta
\def\modulo#1#2{\tmpcnta=#1
        \divide\tmpcnta by #2
        \multiply\tmpcnta by #2
        \multiply\tmpcnta by -1
        \advance\tmpcnta by #1\relax
        \the\tmpcnta}
\modulo{17}{3}
\modulo{19}{3}
\bye

LaTeX solution:

\documentclass{article} 
\makeatletter
\newcommand\modulo[2]{\@tempcnta=#1
        \divide\@tempcnta by #2
        \multiply\@tempcnta by #2
        \multiply\@tempcnta by -1
        \advance\@tempcnta by #1\relax
        \the\@tempcnta}
\makeatother
\begin{document} 
\modulo{17}{3}
\modulo{19}{3}
\end{document}
Werner
  • 603,163
Boris
  • 38,129
38

You can also use \intcalcMod from the intcalc package:

\documentclass{article}
\usepackage{amsmath}
\usepackage{ifthen}
\usepackage{intcalc}

\newcounter{mycount}
\newcommand\Nmodiii[1]{%
\setcounter{mycount}{0}\whiledo{\value{mycount}<#1}
  {$\themycount\pmod 3=\intcalcMod{\value{mycount}}{3}$\\\stepcounter{mycount}}
}
\begin{document}

\noindent A little example: $8\pmod 3=\intcalcMod{8}{3}$

\noindent And a little loop:\\
\Nmodiii{20}

\end{document}

enter image description here

The code that appears in the link posted in a comment, there are some spurious blank spaces producing an undesired indentation of the first line; here's a corrected version:

\documentclass{article}
\usepackage{ifthen}
\usepackage{forloop}
\usepackage{fmtcount}
\usepackage{intcalc}
\usepackage{multicol}

\begin{document}
\begin{multicols}{2}
\newcounter{i}
\noindent\forloop{i}{1}{\value{i} < 101}{%
    \ifthenelse{\equal{\intcalcMod{\value{i}}{15}}{0}}{
        FizzBuzz
    }{%
        \ifthenelse{\equal{\intcalcMod{\value{i}}{3}}{0}}{
            Fizz
        }{%
            \ifthenelse{\equal{\intcalcMod{\value{i}}{5}}{0}}{
                Buzz
            }{%
                \thei
            }
        }
    }\\
}
\end{multicols}
\end{document}
Moriambar
  • 11,466
Gonzalo Medina
  • 505,128
  • `! Missing number, treated as zero. v l.32 }` – mcandre Nov 11 '11 at 01:13
  • Thanks, that helps. I'm writing FizzBuzz for LaTeX, so I need to use the mod result in further calculations, not just display it. – mcandre Nov 11 '11 at 01:14
  • @mcandre: nothing prevents you from using the result in your calculations! – Gonzalo Medina Nov 11 '11 at 01:15
  • Hmm. When I do this, I get ! Missing number, treated as zero. https://github.com/mcandre/mcandre/blob/master/latex/fizzy.tex – mcandre Nov 11 '11 at 01:30
  • You are using "value" in your code and you should use \value (with a backslash). Also, you could have included that code in an edit to your original question. – Gonzalo Medina Nov 11 '11 at 01:34
  • Got it. One more thing: I say \noindent, but the first line is still indented. Do you know why? – mcandre Nov 11 '11 at 02:39
  • @mcandre: yes, you have many spurious blank spaces in you code that should be eliminated by using the % character in the appropriate places; however the space in comments doesn't allow me to show you the proper formatting here; in fact, you can delete the \noindent safely, once you have eliminated those spurious spaces. You can always start a new question asking how to suppress those spurious spaces. – Gonzalo Medina Nov 11 '11 at 02:57
  • (Continuation) The \noindent can then go outside the loop. – Gonzalo Medina Nov 11 '11 at 03:20
  • Can you fork my code then? I took out as much space as I could without abutting the LaTeX commands, but the first line is still indented. – mcandre Nov 11 '11 at 10:21
  • @mcandre: I've added the code at the end of my updated answer. – Gonzalo Medina Nov 11 '11 at 12:50
  • On my system, even with the %s, the first line still has extra spaces before it. Thank you for your patience; I hope we can resolve this annoying little issue. – mcandre Nov 11 '11 at 20:00
  • @mcandre: are you talking about the exact same code I posted at the end of my answer? If so, then maybe we could discuss this in a chat session, if you want to. – Gonzalo Medina Nov 11 '11 at 20:07
  • Finally got it working with no extra spaces. For some reason, \decimal{i} prepends spaces while \thei does not. – mcandre Nov 13 '11 at 04:55
24

The "expandable" version, using e-TeX's \numexpr:

\def\truncdiv#1#2{((#1-(#2-1)/2)/#2)}
\def\moduloop#1#2{(#1-\truncdiv{#1}{#2}*#2)}
\def\modulo#1#2{\number\numexpr\moduloop{#1}{#2}\relax}

\truncdiv and \moduloop can be plugged into other expressions. It's necessary to do like this because \numexpr performs rounded integer division.

egreg
  • 1,121,712
  • the same idea was used in the calendarweek TeX package. – ogerard Jun 05 '13 at 09:27
  • 2
    Hmm, from \truncdiv{0}{64} I get -1 and so \modulo{0}{64} gives 64. – ShreevatsaR Nov 02 '17 at 20:26
  • 1
    I'm using the following for now, which works for positive #2: \def\moduloop#1#2{\ifnum \numexpr(#1 - (#1/#2)*(#2))\relax < 0 (#1 - (#1/#2)*(#2) + #2) \else (#1 - (#1/#2)*(#2)) \fi} and \def\truncdiv#1#2{((#1 - \moduloop{#1}{#2})/(#2))} – ShreevatsaR Nov 02 '17 at 20:44
22

The fp package is small and provides the functionality to do quite complex arithmetic. In the minimal example below the macro \modulo{<a>}{<b>} stores the result of <a> mod <b> in the macro \result, which is then directly printed:

enter image description here

\documentclass{article}
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp
\newcommand{\modulo}[2]{%
  \FPeval{\result}{trunc(#1-(#2*trunc(#1/#2,0)),0)}\result%
}
\begin{document}
Some modular arithmetic:
\begin{itemize}
  \item $512 \pmod{7}=\modulo{512}{7}$
  \item $6 \pmod{4}=\modulo{6}{4}$
  \item $15 \pmod{4}=\modulo{15}{4}$
  \item $1234567 \pmod{3}=\modulo{1234567}{3}$
\end{itemize}
\end{document}

Since the result is stored in \result, it can be used later in the text as well, until another execution of \modulo will overwrite \result.

Similar functionality in terms of mathematical functions is provided with pgf as well.

Werner
  • 603,163
17

LaTeX3 (the expl3 package) also has a facility for computing modulus (moduli?), namely \int_mod:nn.

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\newcommand{\mymod}[2]{\int_mod:nn{#1}{#2}}
\ExplSyntaxOff
\begin{document}
  The residue of $45$ modulo $19$ is $\mymod{45}{19}$.
\end{document}
15

Another solution is to use pgfmath

\documentclass{article} 
\input{pgfutil-common.tex}
\usepackage{pgfkeys,pgfmath}
\begin{document}

\pgfmathparse{mod(20,6)} \pgfmathresult %displays 2.0
\pgfmathtruncatemacro{\myint}{ \pgfmathresult}  

\myint %displays 2 
\end{document}  
Alain Matthes
  • 95,075
  • It seems that only the package pgfmath is necessary. \input{pgfutil-common.tex} and \usepackage{pgfkeys} could be removed. – dexteritas May 24 '20 at 20:35
8

You can use the calculator package then, type this code:

\MODULO{14}{3}{\sol}

$14\pmod{3}=\sol$
Joseph Wright
  • 259,911
  • 34
  • 706
  • 1,036
3

You may use calc package as long as the absolute values of the numbers are not exceeding 2^31-1=2147483647. Otherwise you may use bigintcalc package.

\documentclass{article}
\usepackage{amsmath}
\usepackage{calc}
\newcounter{modulo}
\newcommand\modulo[2]{%
  \setcounter{modulo}{#1-(#1/#2)*#2}%
  \arabic{modulo}%
}
\begin{document}
\begin{align*}
131 \equiv \modulo{131}{3} &\pmod{3} \\
131 \equiv \modulo{131}{5} &\pmod{5} \\
131 \equiv \modulo{131}{7} &\pmod{7} \\
131 \equiv \modulo{131}{8} &\pmod{8} \\
-97 \equiv \modulo{-97}{3} &\pmod{3} \\
-97 \equiv \modulo{-97}{5} &\pmod{5} \\
-97 \equiv \modulo{-97}{7} &\pmod{7} \\
-97 \equiv \modulo{-97}{8} &\pmod{8} \\
\end{align*}
\end{document}

result of \modulo commands

Z.H.
  • 3,346
  • 21
  • 39