もともとmath.SEにありましたが、そこには答えがありませんでした。
次のアルゴリズムを考えてみましょう。
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
ここで、u、v、およびnは整数であり、除算演算は整数除算です。
- アルゴリズムによって計算されるものを説明します。
- パートIに対する回答をアルゴリズムの事後条件として使用して、ループ不変式を確立し、アルゴリズムが終了して正しいことを示します。
クラスでは、事後条件があることが判明した及び不変である0 ≤ U 2 ≤ N < V 2、U + 1 ≤ V。事後条件と不変条件がどのようにして得られたのか、私にはよくわかりません。私はポスト条件がu + 1 = vであったと思います...明らかにそうではありません。ですから、事後条件と不変条件がどのようにして得られたのか疑問に思っています。また、事後条件を使用して、事前条件を取得する方法についても疑問に思っています。