+2 Daumen
823 Aufrufe

Gegeben sei eine Zahl \(1\le x<10\) mit endlicher Dezimalbruchdarstellung. Im folgenden Algorithmus sind alle Rechnungen im Dezimalsystem durchzuführen.

$$\begin{aligned}&\text{LOOP}\\ &\qquad x\leftarrow x^{10};\\ &\qquad\text{$x$ habe $n+1$ Vorkommastellen: Gib $n$ aus;}\\ &\qquad\text{Verschiebe das Komma in $x$ um $n$ Stellen nach links;}\\ &\text{END}\end{aligned}$$

Was wird da ausgerechnet?

Avatar von

Ein kleiner Scherz meinerseits :

Das Wetter von morgen.

2 Antworten

+6 Daumen

Nun - auf jeden Fall wird eine unendliche Folge ganzer Zahlen ausgegeben, da es kein Abbruchkriterium gibt.

Ich postuliere, dass jede Zahl \(0 \le x \lt 10\) genau eine Vorkommastelle hat. Somit gilt immer dass \(n \ge 0\) ist. Folglich ist die Anzahl der Vorkommastellen \(\text{nk}(x^{10})\)
$$\text{nk}(x^{10}) = \max(\lfloor \log_{10}(x^{10})\rfloor ; 0 ) + 1= \max(\lfloor 10 \log_{10}(x)\rfloor ; 0 ) + 1 = n+1$$Und da \(x \ge 1\) und damit \(\log_{10}(x) \ge 0 \) und da die Gaußklammer für positive Werte nicht \(\lt0\) werden kann, ist
$$n=\lfloor 10 \log_{10}(x)\rfloor$$Es sei \(a = \log_{10}(x)\) und da
$$x_{i+1} = \frac{{x_i}^{10}}{10^{n_i}}$$ist, folgt dass $$a_{i+1}=10 a_i - n_i = 10 a_i - \lfloor 10 a_i\rfloor$$ Aus \(1 \le x \lt 10\) folgt, dass \( 0 \le a \lt 1 \) ist. D.h. jedes \(a_i\) folgt aus dem vorherigem indem das Komma um eine Stelle nach rechts verschoben wurde und die Ziffer vor dem Komma zu \(0\) gesetzt wird. Und das \(n_i\) ist jeweils diese erste Ziffer. Also besteht die Ausgabe aus allen Nachkommastellen von \(a_0\) - dem ersten \(a\).

Und da \(a_0=\log_{10}(x_0)\) ist, berechnet der Algorithmus den Logarithmus von \(x=x_0\) zur Basis \(10\).

Avatar von 48 k
0 Daumen

Und hier die online-Version des Codes per LINK:

http://www.gerdlamprecht.de/Roemisch_JAVA.htm##@N@B0]=6;@C0]='0.';@N@Bi+1]=(@P@Bi],10));a=floor(log(@Bi+1])/log(10));@C0]+=a.toString();@Bi+1]/=@P10,a);@Ni%3E40@N0@N1@N@C1]=bigc(3,bigc(12,@B0].toString(),40),GetKoDezi(2392,0,40));

Da JavaScript mit double (etwa 15 richtige Stellen ) arbeitet, ist das Ergebnis auch nur um die 15 Stellen genau:

Bild Mathematik

Einer der umständlichsten Wege, log(x)/log(10) zu berechnen...

Avatar von 5,7 k

Umstaendlich hast es vor allem Du gemacht. Da steht ja ganz deutlich bei: Im folgenden Algorithmus sind alle Rechnungen im Dezimalsystem durchzuführen.

Ich weiß nicht, was an 1 Iterations-Zeile "umständlich" sein soll und wo Du etwas anderes als das Dezimalsystem siehst...

das aC[0]+=a.toString... ist nur für die Ausgabe beliebig langer Zeichenketten

das aC[1]=bigc(... am Ende ist nur Zusatz, um das Ergebnis aC[0] mit dem exakteren Ergebnis aC[1] zu vergleichen. (ich hätte da auch einen festen String einbauen können, aber dann wäre die Eingabe mit aB[0] nicht mehr universell.)

Was ich mit "umständlichsten Weg" meine:

für log(x) gibt es schnellere Reihen oder hypergeometrische Funktionen als diesen Verschleierungs-Algorithmus (nur 1 Nachkommastelle pro kompliziertem STEP).

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community