# How to draw a Cayley table

I'm trying to make a Cayley table like the one in the following question, but I don't want the labels, for example, on top (Capacity) and on the left side (the w's and v's). I just would like to reproduce the exact same table without the 'extra' bits on the side.

I forgot to mention I want a 5x5 table (25 entries inside the table), but still with the "outer" headings.

I managed to do this. However, this is long-winded I think:

$\begin{tabular}{>{}l<{}|*{6}{>{}l<{}}} ~ & 1 & a & a^2 & a^3 & a^4 \\ \hline\vrule height 12pt width 0pt 1 & 1 & a & a^2 & a^3 & a^4 \\ a & a & a^2 & a^3 & a^4 & a^5 \\ a^2 & a^2 & a^3 & a^4 & a^5 & a^6 \\ a^3 & a^3 & a^4 & a^5 & a^6 & a^7 \\ a^4 & a^4 & a^5 & a^6 & a^7 & a^8 \\ \end{tabular}$


EDIT:

\setlength\extrarowheight{3pt}
\noindent\begin{tabular}{c | c c c c c}

& 1 & a & a^2 & a^3 & a^4  \\
\cline{1-6}
1   & 1   & a   & a^2 & a^3 & a^4 \\
a   & a   & a^2 & a^3 & a^4 & a^5 \\
a^2 & a^2 & a^3 & a^4 & a^5 & a^6 \\
a^3 & a^3 & a^4 & a^5 & a^6 & a^7 \\
a^4 & a^4 & a^5 & a^6 & a^7 & a^8 \\
\end{tabular}

• the answer provided was excellent in the above link, I would appreciate if I can get a similar answer. – Maths Nov 12 '18 at 15:36
• Just take Gonzalo's answer and delete first line (the one which contains Capacity) and two left columns and two right ones. – Ignasi Nov 12 '18 at 15:47
• array, not tabular. – egreg Nov 12 '18 at 16:03
• You Need to put $a^2$ when you want to use math! – GiuTeX Nov 12 '18 at 16:19
• @A.E As it is, the added code produces tons of errors. – egreg Nov 12 '18 at 16:19

Here's the code, followed by the output you will get and a brief explanation of what's going on.

The code below produces 2 tables, in one there's written ANYTHING in the top left corner, in the second one there's a white space (just don't put anything in the column "argument".

\documentclass[10pt]{article}
\usepackage{array}

\begin{document}

\setlength\extrarowheight{3pt}
\noindent\begin{tabular}{c | c c c c c}
ANYTHING & 0 & 1 & 2 & 3 & 4  \\
\cline{1-6}
0 & 0 & 0 & 0 & 0 & 0 \\
1 & 0 & 0 & $a^2$ & 25 & 25 \\
2 & $a^2$ & 0 & 20 & 25 & 25 \\
2 & 0 & $a^2$ & 20 & 25 & 25 \\
2 & 0 & 0 & 20 & 25 & 25 \\
\end{tabular}

\noindent\begin{tabular}{c | c c c c c}
& 0 & 1 & 2 & 3 & 4  \\
\cline{1-6}
0 & 0 & 0 & 0 & 0 & 0 \\
1 & 0 & 0 & $a^2$ & 25 & 25 \\
2 & $a^2$ & 0 & 20 & 25 & 25 \\
2 & 0 & $a^2$ & 20 & 25 & 25 \\
2 & 0 & 0 & 20 & 25 & 25 \\
\end{tabular}

\end{document}


How does it work? A table is done with the environment {tabular}, which requires as argument the numer of columns (or rows... just read the documentation to know more) which is specified by the argument {c | c c c c c}: 6 columns divided by a line between the first and the second col. The 'c' stands for centered meaning that the column will be aligned to the center, if you want you can change it to l (left) or r (right).

Then in the tables all the entries are done by spacing them with &, and the \cline takes as argument the number of columns that you want it to span: from column 1 to column 6.

The command \setlength\extrarowheight{3pt} adds some extra row height (how surprising!).

Package {array} is needed for the length \extrarowheight.

• this is good however I wanted a 5x5 table – Maths Nov 12 '18 at 16:00
• Cheers pal, much appreciated. – Maths Nov 12 '18 at 16:02
• if you could briefly explain what you did line by line, It would be more beneficial so I know what you've done – Maths Nov 12 '18 at 16:03
• much appreciated – Maths Nov 12 '18 at 16:11
• I added more on the meaning of the c's in {tabular} environment. – GiuTeX Nov 12 '18 at 16:12

Your input is almost good, but you can do better.

\documentclass{article}
\usepackage{amsmath}
\usepackage{array}

\begin{document}

This is a Cayley table
$\begin{array}{l|*{5}{l}} & 1 & a & a^2 & a^3 & a^4 \\ \hline 1 & 1 & a & a^2 & a^3 & a^4 \\ a & a & a^2 & a^3 & a^4 & a^5 \\ a^2 & a^2 & a^3 & a^4 & a^5 & a^6 \\ a^3 & a^3 & a^4 & a^5 & a^6 & a^7 \\ a^4 & a^4 & a^5 & a^6 & a^7 & a^8 \\ \end{array}$

This is the same, but with some more spacing,
$\setlength{\extrarowheight}{3pt}% local setting \begin{array}{l|*{5}{l}} & 1 & a & a^2 & a^3 & a^4 \\ \hline 1 & 1 & a & a^2 & a^3 & a^4 \\ a & a & a^2 & a^3 & a^4 & a^5 \\ a^2 & a^2 & a^3 & a^4 & a^5 & a^6 \\ a^3 & a^3 & a^4 & a^5 & a^6 & a^7 \\ a^4 & a^4 & a^5 & a^6 & a^7 & a^8 \\ \end{array}$

\end{document}


With array, each cell is assumed to be in math mode. The setting of \extrarowheight will not propagate to other instances of array, because $...$ forms a group.

• I prefer the method above as it is easier to follow(in my eyes anyway) but thanks for your answer – Maths Nov 12 '18 at 16:16
• What does * in l|* mean? – manooooh Nov 12 '18 at 16:17
• @manooooh *{6}{l} is short for llllll – samcarter is at topanswers.xyz Nov 12 '18 at 16:18
• @manooooh The * refers to the following: *{6}{l} means “repeat l six times”. – egreg Nov 12 '18 at 16:18
• @jfbu Right, fixed – egreg Nov 12 '18 at 16:47

Some automatizing is in order here

\documentclass{article}
\usepackage{amsmath, amssymb}
\usepackage{array}

\usepackage{xinttools}
\usepackage{bnumexpr}
\begin{document}

This is a Cayley table
$\begin{array}{l|*{5}{l}} & 1 & a & a^2 & a^3 & a^4 \\ \hline 1 & 1 & a & a^2 & a^3 & a^4 \\ a & a & a^2 & a^3 & a^4 & a^5 \\ a^2 & a^2 & a^3 & a^4 & a^5 & a^6 \\ a^3 & a^3 & a^4 & a^5 & a^6 & a^7 \\ a^4 & a^4 & a^5 & a^6 & a^7 & a^8 \\ \end{array}$

This is the same, but with some more spacing,
$\setlength{\extrarowheight}{3pt}% local setting \begin{array}{l|*{5}{l}} & 1 & a & a^2 & a^3 & a^4 \\ \hline 1 & 1 & a & a^2 & a^3 & a^4 \\ a & a & a^2 & a^3 & a^4 & a^5 \\ a^2 & a^2 & a^3 & a^4 & a^5 & a^6 \\ a^3 & a^3 & a^4 & a^5 & a^6 & a^7 \\ a^4 & a^4 & a^5 & a^6 & a^7 & a^8 \\ \end{array}$

Again, but illustrating that $a=4$ generates a cyclic sub-group of order
$5$ of $(\mathbb{Z}/11\mathbb{Z})^*$:
$\setlength{\extrarowheight}{3pt}% local setting \begin{array}{c|*{5}{c}} & 1 & a & a^2 & a^3 & a^4 \\ \hline \xintFor #1 in {0, 1, 2, 3, 4}: {\ifnum #1=0 1\else a^{#1}\fi \xintFor #2 in {0, 1, 2, 3, 4}: {% &\thebnumexpr 4^(#1+#2) /: 11\relax }% \\ }% \end{array}$
and $a=2$ generates the full group:
$\setlength{\extrarowheight}{3pt}% local setting \begin{array}{c|*{10}{c}} & 1 & a \xintFor*#1 in {23456789}:{&a^{#1}}\\ \hline \xintFor* #1 in {0123456789}: {\ifnum #1=0 1\else a^{#1}\fi \xintFor* #2 in {0123456789}: {% &\thebnumexpr 2^(#1+#2) /: 11\relax }% \\ }% \end{array}$
\end{document}


• +1 I'm always amazed at how efficient xinttools is! – Andrew Nov 13 '18 at 7:06
• @Andrew your expl3 answer does look efficient too :) – user4686 Nov 13 '18 at 8:05

Perhaps I over automate, but I'd want to have a macro \CayleyTable that produces the Cayley table of the corresponding cyclic group, so that the commands:

  \CayleyTable{3}
\CayleyTable{4}
\CayleyTable[x]{9}


would produce:

(An optional argument gives the name of the generator, which defaults to a). Arguably, \CyclicGroupCayleyTable would be a better name. In any case, here's the code:

\documentclass{article}
\usepackage{array}
\setlength{\extrarowheight}{3pt}% local setting

\usepackage{xparse}

\ExplSyntaxOn
\int_new:N \l_n_int
\tl_new:N  \l_gen_tl
\cs_new_protected:Npn \print_exponent #1 {%  {\l_gen_tl}^{#1}
\int_compare:nTF {#1=0}{1}{\l_gen_tl \int_compare:nT{#1>1}{^{#1}}}
}
& \print_exponent {\int_eval:n{#1-1}}
}
\cs_new_protected:Npn \print_Cayley_cell:nn #1 #2 {
& \print_exponent {\int_eval:n { \int_mod:nn {#1+#2-2}{\l_n_int}} }
}
\cs_new_protected:Npn \print_Cayley_row:n #1 {
\print_exponent {\int_eval:n {#1-1}}
\int_step_inline:nn {\l_n_int} {\print_Cayley_cell:nn {##1}{#1}} \\
}
\NewDocumentCommand\CayleyTable{ O{a} m}{
\tl_set:Nn \l_gen_tl {#1}
\int_set:Nn \l_n_int {#2}
$\begin{array}{c|*{\int_eval:n{\l_n_int+1}}{c}} \int_step_function:nN {\l_n_int} \print_Cayley_header:n \\\hline \int_step_function:nN {\l_n_int} \print_Cayley_row:n \end{array}$
}
\ExplSyntaxOff

\begin{document}

\CayleyTable{3}

\CayleyTable{4}

\CayleyTable[x]{9}

\end{document}


With \foreach:

\documentclass{article}
\usepackage{etoolbox}
\usepackage{tikz}
\tikzset{mynode/.style={anchor=base,
inner sep=0pt,
text height=12pt, text depth=6pt, text width=18pt, text centered}}
\newcommand{\CayleyTable}[2][a]{%
\vcenter{\hbox{\begin{tikzpicture}
\pgfmathsetmacro\tot{int(#2-1)}
\foreach \i in {0,1,...,\tot}
{
\node[mynode] (hh-\i) at (\i *24pt,24pt) {\ifnumequal{\i}{0}{$1$}{\ifnumequal{\i}{1}{$#1$}{${#1}^{\i}$}}};
\node[mynode] (vv-\i) at (-24pt-\pgflinewidth,-\i *24pt) {\ifnumequal{\i}{0}{$1$}{\ifnumequal{\i}{1}{$#1$}{${#1}^{\i}$}}};
}
\foreach \myrow in {0,1,...,\tot}
{\foreach \mycol in {0,1,...,\tot}
{\pgfmathsetmacro\myplus{\myrow+\mycol}\pgfmathsetmacro\myexp{int(mod(\myplus,#2))}
\node[mynode] at (\myrow*24pt,-\mycol*24pt) {\ifnumequal{\myexp}{0}{$1$}{\ifnumequal{\myexp}{1}{$#1$}{${#1}^{\myexp}$}}};}}
\draw ([yshift=-2pt]hh-\tot.south east) -- ([yshift=-2pt]hh-0.south west) -- ++(-24pt, 0);
\draw ([xshift=2pt]vv-\tot.south east) -- ([xshift=2pt]vv-0.north east) -- ++(0,24pt);
\end{tikzpicture}}}%
}
\begin{document}
$\CayleyTable{3}$
$\CayleyTable[x]{4}$
$\CayleyTable[y]{5}$
\end{document}