Skip to content

Ulam spiral


[PDF] [TEX]
% !TEX TS-program = pdflatex
\documentclass[border=2mm]{standalone}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{ifthen}
\usepackage{tikz}


\newcounter{cmpt}
\newcounter{next}
\newcounter{end}

\newcommand*\ballcolor{%
    \stepcounter{cmpt}
    \pgfmathisprime{\value{cmpt}}
    \ifthenelse{\equal{\pgfmathresult}{0}}%
        { \colorlet{colornb}{blue!40}}%
        { \colorlet{colornb}{red!40}}%
}

\newcommand*{\ulam}[2]{%
    \setcounter{cmpt}{#1}
    \addtocounter{cmpt}{-1}
    \setcounter{next}{0}
    \setcounter{end}{#2}

    \ballcolor
    \node(place) at (0,0)  {$\mathbf\thecmpt$};

    \whiledo{\value{cmpt}<\value{end}}%
    {
            \foreach \i in {0,...,\thenext}
            {\ballcolor
            \node[above of=place] (place) {$\mathbf\thecmpt$};
        }

        \foreach \i in {0,...,\thenext}
        {
            \ballcolor
            \node[right of=place] (place) {$\mathbf\thecmpt$};
        }
        \stepcounter{next}

        \foreach \i in {0,...,\thenext}
        {
            \ballcolor
            \node[below of=place] (place) {$\mathbf\thecmpt$};
        }

        \foreach \i in {0,...,\thenext}
        {
            \ballcolor
            \node[left of=place] (place) {$\mathbf\thecmpt$};
        }
        \stepcounter{next}
    }
    \addtocounter{next}{-1}
    \foreach \i in {0,...,\thenext}
    {
        \ballcolor
        \node[above of=place] (place) {$\mathbf\thecmpt$};}
}
\begin{document}

  \begin{tikzpicture}
  \tikzstyle{every node}=[draw,%
                          rectangle,%
                          shade,%
                          minimum size  = 1.6cm,%
                          ball color    = colornb,%
                          node distance = 1.6cm]

  \ulam{41}{113}

  \end{tikzpicture}

\end{document}