% The luamodulartables package.
% version 1.1
% Authors: Chetan Shirore and Ajit Kumar
% Licensed under LaTeX Project Public License v1.3c or later. The complete license text is available at http://www.latex-project.org/lppl.txt.

\ProvidesPackage{luamodulartables}[1.0]
\RequirePackage{xkeyval}
\RequirePackage{luacode}
\begin{luacode*}
-- Defining function for modular multiplication.
function modulomult(n,label, headline, midline)
  label = label or '$\\times$'
  headline = headline or ''
  midline = midline or ''
  local str2 = label
    for i = 0, n - 1 do
        str2 = str2 .. " & " .. "$" .. tostring(i) .."$"
    end
    str2 = str2 .. "\\\\ " .. headline
    local tbl = {}
    for i = 0, n - 1 do
        k = 1
        tbl[k] = "$" ..  tostring(i) .."$"
        k = k + 1
        for j = 0, n - 1 do
            tbl[k] = "$" ..  tostring((i * j) % n) .."$"
            k = k + 1
        end
        if i ~= n - 1  then
            str2 = str2 .. table.concat(tbl, " & ") .. "\\\\ " .. midline
        else
          str2 = str2 .. table.concat(tbl, " & ")
        end
    end
    return (str2)
end
-- Defining function for modular addition.
function moduloadd(n,label, headline, midline)
  label = label or '$+$'
  headline = headline or ''
  midline = midline or ''
  local str3 =label
    for i = 0, n - 1 do
        str3 = str3 .. " & " .. "$" .. tostring(i) .."$"
    end
    str3 = str3 .. "\\\\ " .. headline
    local tbl = {}
    for i = 0, n - 1 do
        k = 1
        tbl[k] = "$" ..  tostring(i) .."$"
        k = k + 1
        for j = 0, n - 1 do
            tbl[k] = "$" ..  tostring((i + j) % n) .."$"
            k = k + 1
        end
        if i ~= n - 1  then
            str3 = str3 .. table.concat(tbl, " & ") .. "\\\\ " .. midline
        else
          str3 = str3 .. table.concat(tbl, " & ")
        end
    end
    return (str3)
end

\end{luacode*}

% ========= KEY DEFINITIONS =========
\define@key{luamodular}{multlabel}
{\edef\luamod@multlabel{\luastringN{#1}}}
\define@key{luamodular}{addlabel}
{\edef\luamod@addlabel{\luastringN{#1}}}
\define@key{luamodular}{headline}
{\edef\luamod@headline{\luastringN{#1}}}
\define@key{luamodular}{midline}
{\edef\luamod@midline{\luastringN{#1}}}
% ========= KEY DEFAULTS =========
\setkeys{luamodular}{multlabel=$\times$}%
\setkeys{luamodular}{addlabel=$+$}%
\setkeys{luamodular}{headline = }%
\setkeys{luamodular}{midline = }%
% ========= Defining Command =========
\newcommand{\luaModularMult}[2][]{%
  \setkeys{luamodular}{#1}
  \directlua{tex.sprint(modulomult(#2,\luamod@multlabel,
\luamod@headline,\luamod@midline))}}%

\newcommand{\luaModularAdd}[2][]{%
  \setkeys{luamodular}{#1}
  \directlua{tex.sprint(moduloadd(#2,\luamod@addlabel,
\luamod@headline,\luamod@midline))}}%
%
\endinput
