Ursprünglich auf math.SE, aber dort unbeantwortet.
Betrachten Sie den folgenden Algorithmus.
u := 0
v := n+1;
while ( (u + 1) is not equal to v) do
x := (u + v) / 2;
if ( x * x <= n)
u := x;
else
v := x;
end_if
end_while
Dabei sind u, v und n ganze Zahlen und die Divisionsoperation ist eine ganzzahlige Division.
- Erklären Sie, was vom Algorithmus berechnet wird.
- Stellen Sie anhand Ihrer Antwort auf Teil I als Nachbedingung für den Algorithmus eine Schleifeninvariante her und zeigen Sie, dass der Algorithmus beendet wird und korrekt ist.
In der Klasse wurde gefunden, dass die Nachbedingung und die Invariante 0 ≤ u 2 ≤ n < v 2 , u + 1 ≤ v ist . Ich verstehe nicht wirklich, wie die Nachbedingung und die Invarianten erhalten wurden. Ich denke, die Post-Bedingung war u + 1 = v... was eindeutig nicht der Fall ist. Ich frage mich also, wie die Nachbedingung und Invariante erhalten wurde. Ich frage mich auch, wie die Vorbedingung unter Verwendung der Nachbedingung erhalten werden kann.