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 '18, 14:42

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%


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 10 Jan '18, 04:35

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 10 Jan '18, 07:03

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

(11 Jan '18, 05: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 '18, 11:03

NMarkgraf's gravatar image

NMarkgraf
2113
Akzeptiert-Rate: 0%

Klar, da hast Du natürlich recht.

(16 Jan '18, 20:39) cis
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×730
×5
×3

gestellte Frage: 09 Jan '18, 14:42

Frage wurde gesehen: 6,969 Mal

zuletzt geändert: 16 Jan '18, 20:39