Anschlussfrage zu http://texwelt.de/wissen/fragen/21219/folge-fur-groere-argumente-ausgeben


Mir ist aufgefallen, dass ich Sorry, the operation 'gcd' has not yet been implement ed in the floating point unit erhalte, sobald ich die Funktion gcd verwende bei Laden von

\usetikzlibrary{fpu}

\pgfkeys{/pgf/fpu=true}

Gibt es da eine Möglichkeit?

Öffne in Overleaf
%\documentclass[]{article}
\documentclass[border=5mm, varwidth]{standalone}
\usepackage[german]{babel}

\usepackage{tikz}
\usetikzlibrary{math}

\usetikzlibrary{fpu}
\pgfkeys{/pgf/fpu=true}

\begin{document}
\tikzmath{
% Tut
function mersenne(\N) {return int(2^\N-1);};
% Tut nicht
%function mersenne(\N) {return int(gcd((2^\N-1),17);};
}
\texttt{Sorry, the operation 'gcd' has not yet been implement
ed in the floating point unit}

\foreach \n in {1,...,20}{
  \pgfmathparse{mersenne(\n)}
  \pgfmathprintnumber\pgfmathresult, 
}
\end{document}

gefragt 09 Jan, 08:42

cis's gravatar image

cis
6.4k11141230
Akzeptiert: 71%


Das Problem lässt sich leicht beheben indem man tut was die Meldung sagt

Sorry, the operation 'gcd' has not yet been implemented in the floating point unit :-(

Da ich leider keine Ahnung habe, wie die internen Routinen der FPU das anstellen, dass da nicht immer Dimension too large rauskommt musste ich das in Lua implementieren. Ich habe allerdings die zu ersetzende Zeile markiert, sodass du dort deine reine TeX-Implementierung einfügen kannst. Der Algorithmus aus dieser Publikation könnte funktionieren:

Stehlé, Damien; Zimmermann, Paul (2004), "A binary recursive gcd algorithm", Algorithmic number theory, Lecture Notes in Comput. Sci., 3076, Springer, Berlin, pp. 411–425, doi:10.1007/978-3-540-24847-7_31, MR 2138011.

Öffne in Overleaf
\documentclass{article}

\usepackage{luacode}
\begin{luacode*}
-- https://de.wikipedia.org/wiki/Euklidischer_Algorithmus
function gcd(a,b)
   return (b ~= 0) and gcd(b,a%b) or a
end
\end{luacode*}

\usepackage{tikz}
\usetikzlibrary{math}
\usetikzlibrary{fpu}

\makeatletter

\let\pgfmath@basic@gcd@=\pgfmathgcd@

\def\pgfmathfloatgcd#1#2{%
  \pgfmathfloattoint{#1}\let\pgfmath@tempa\pgfmathresult
  \pgfmathfloattoint{#2}\let\pgfmath@tempb\pgfmathresult
  %%% PUT PROPER TEX IMPLEMENTATION BELOW
  \edef\pgfmathresult{\directlua{tex.sprint(gcd(\pgfmath@tempa,\pgfmath@tempb))}}%
  %%% PUT PROPER TEX IMPLEMENTATION ABOVE
  \pgfmathfloatparsenumber{\pgfmathresult}%
}
\let\pgfmathfloatgcd@=\pgfmathfloatgcd

\g@addto@macro\pgfmathfloat@parser@install@functions{%
  \pgfmathfloat@install\pgfmathgcd@=\pgfmathfloatgcd@
}

\makeatother

\pgfkeys{/pgf/fpu=true}

\begin{document}

\tikzmath{
function mersenne(\N) {return int(gcd((2^\N-1),17);};
}

\foreach \n in {1,...,15}{
  \pgfmathparse{mersenne(\n)}
  \pgfmathprintnumber\pgfmathresult, 
}

\end{document}

alt text


Das oben gezeigte ist übrigens bereits in TikZ verfügbar mit der luamath-Bibliothek. Allerdings verträgt sich das wiederum nicht mit der FPU.

Öffne in Overleaf
\documentclass{article}

\usepackage{tikz}
\usepgflibrary{luamath}
\pgfkeys{/pgf/luamath=parser}
\usetikzlibrary{math}

\begin{document}

\tikzmath{
function mersenne(\N) {return int(gcd((2^\N-1),17));};
}

\foreach \n in {1,...,15}{
  \pgfmathparse{mersenne(\n)}
  \pgfmathprintnumber\pgfmathresult, 
}

\end{document}
Permanenter link

beantwortet 09 Jan, 22:35

Henri's gravatar image

Henri
12.2k42235

bearbeitet 10 Jan, 01:03

Ein TeX-Implementierung von gcd ist im Paket xintgcd vorhanden. Ersetzte also die makrierte Zeile mit \edef\pgfmathresult{\xintGCD{\pgfmath@tempa}{\pgfmath@tempb}}

(10 Jan, 23:06) Henri

Flotingpointnumbers, also Gleitkommazahlen im deutschen, sind die (versuchte) Implementierungen von reellen Zahlen. Und bei reellen Zahlen macht ein größter gemeinsamer Teiler (ggT im englischen gcd), im Gegesatz zu Integer als versuchte Implementierung von ganzen Zahlen, einfach keinen Sinn. Darum hat das auch niemand implementiert, denke ich mal.

Auch bekommt man mit Gleitkommazahlen keine bessere Genauigkeit hin als mit einer guten Ganzzahlarithmetik. - Ich denke also, der Ansatz ist schon falsch, die Mittel sind falsch und externe Progamme wie Mathematica oder ähnliches wären hier sinnvoller.

Permanenter link

beantwortet 16 Jan, 05:03

NMarkgraf's gravatar image

NMarkgraf
212

Klar, da hast Du natürlich recht.

(16 Jan, 14:39) cis
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×561
×4
×2

Frage gestellt: 09 Jan, 08:42

Frage wurde angeschaut: 593 Mal

Zuletzt aktualisiert: 16 Jan, 14:39