summaryrefslogtreecommitdiff
path: root/graphics/pgf/base/tex/generic/math/pgfmathfunctions.integerarithmetics.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/base/tex/generic/math/pgfmathfunctions.integerarithmetics.code.tex')
-rw-r--r--graphics/pgf/base/tex/generic/math/pgfmathfunctions.integerarithmetics.code.tex124
1 files changed, 124 insertions, 0 deletions
diff --git a/graphics/pgf/base/tex/generic/math/pgfmathfunctions.integerarithmetics.code.tex b/graphics/pgf/base/tex/generic/math/pgfmathfunctions.integerarithmetics.code.tex
new file mode 100644
index 0000000000..ab8f4e6d3c
--- /dev/null
+++ b/graphics/pgf/base/tex/generic/math/pgfmathfunctions.integerarithmetics.code.tex
@@ -0,0 +1,124 @@
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Public License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+% Macros contributed by Alain Matthes and adapted by CJ
+\pgfmathdeclarefunction{gcd}{2}{%
+ \begingroup
+ \pgfmathcontinuelooptrue
+ \pgfmath@xa=#1pt
+ \pgfmath@xb=#2pt
+ \ifdim\pgfmath@xa=0pt\relax
+ \pgfmathcontinueloopfalse
+ \pgfmath@xa=\pgfmath@xb
+ \fi
+ \ifdim\pgfmath@xb=0pt\relax
+ \pgfmathcontinueloopfalse
+ \pgfmath@xb=\pgfmath@xa
+ \fi
+ \ifdim\pgfmath@xa<0pt\relax
+ \pgfmath@xa=-\pgfmath@xa
+ \fi
+ \ifdim\pgfmath@xb<0pt\relax
+ \pgfmath@xb=-\pgfmath@xb
+ \fi
+ \loop
+ \ifpgfmathcontinueloop
+ \ifdim\pgfmath@xa=\pgfmath@xb
+ \pgfmathcontinueloopfalse
+ \else
+ \ifdim\pgfmath@xa>\pgfmath@xb
+ \advance\pgfmath@xa by-\pgfmath@xb
+ \else
+ \advance\pgfmath@xb by-\pgfmath@xa
+ \fi
+ \fi
+ \repeat
+ \pgfmathparse{int(\pgfmath@xa)}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup}
+
+\newif\ifpgfmath@isprime@unknown
+\newif\ifpgfmath@isprime
+
+\pgfmathdeclarefunction{isprime}{1}{%
+ \begingroup
+ \pgfmath@isprime@unknowntrue
+ \pgfmathsetcount\c@pgfmath@counta{abs(int(#1))}%
+ \ifcase\c@pgfmath@counta\relax
+ % |#1| = 0
+ \pgfmath@isprimefalse
+ \pgfmath@isprime@unknownfalse
+ \or
+ % |#1| = 1
+ \pgfmath@isprimefalse
+ \pgfmath@isprime@unknownfalse
+ \or
+ % |#1| = 2
+ \pgfmath@isprimetrue
+ \pgfmath@isprime@unknownfalse
+ \or
+ % |#1| = 3
+ \pgfmath@isprimetrue
+ \pgfmath@isprime@unknownfalse
+ \else
+ % |#1| > 3
+ \ifodd\c@pgfmath@counta\relax
+ \else
+ \pgfmath@isprimefalse
+ \pgfmath@isprime@unknownfalse
+ \fi
+ \fi
+ \ifpgfmath@isprime@unknown
+ \c@pgfmath@countd=3
+ \pgfmath@isprimetrue
+ \pgfmathloop
+ \c@pgfmath@countb=\c@pgfmath@counta
+ \divide\c@pgfmath@countb by\c@pgfmath@countd
+ \ifnum\c@pgfmath@countb>\c@pgfmath@countd
+ \pgfmath@isprime@unknowntrue
+ \else
+ \pgfmath@isprime@unknownfalse
+ \fi
+ \multiply\c@pgfmath@countb by\c@pgfmath@countd
+ \ifnum\c@pgfmath@countb=\c@pgfmath@counta
+ \global\pgfmath@isprimefalse
+ \pgfmath@isprime@unknownfalse
+ \fi
+ \ifpgfmath@isprime@unknown\advance\c@pgfmath@countd by 2
+ \repeatpgfmathloop
+ \fi
+ \ifpgfmath@isprime
+ \def\pgfmathresult{1}%
+ \else
+ \def\pgfmathresult{0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup}
+
+\pgfmathdeclarefunction{isodd}{1}{%
+ \begingroup
+ \pgfmathsetcount\c@pgfmath@counta{abs(int(#1))}%
+ \ifodd\c@pgfmath@counta
+ \def\pgfmathresult{1}%
+ \else
+ \def\pgfmathresult{0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup}
+
+\pgfmathdeclarefunction{iseven}{1}{%
+ \begingroup
+ \pgfmathsetcount\c@pgfmath@counta{abs(int(#1))}%
+ \ifodd\c@pgfmath@counta
+ \def\pgfmathresult{0}%
+ \else
+ \def\pgfmathresult{1}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup}
+
+\endinput