この平方根境界検出アルゴリズムでループ不変量はどのように取得されますか?


10

もともと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 2N < V 2U + 1 V。事後条件と不変条件がどのようにして得られたのか、私にはよくわかりません。私はポスト条件がu + 1 = vであったと思います0u2n<(u+1)20u2n<v2,u+1vu+1=v...明らかにそうではありません。ですから、事後条件と不変条件がどのようにして得られたのか疑問に思っています。また、事後条件を使用して、事前条件を取得する方法についても疑問に思っています。


Hoareロジックに精通していますか?それに触れるための答えを期待していますか?
ラファエル

回答:


8

Gilles氏は、一般的な手法は興味深い観察のために釣りに行くことです。

この場合、プログラムは次のような形をしているため、バイナリ検索のインスタンスであることがわかります。

while i + 1 != k
  j := strictly_between(i, k)
  if f(j) <= X then i := j
  if f(j) > X then k := j

次に、あなただけのあなたの特定のプラグインfX、...バイナリ検索のための一般的な不変に。Dijkstraがバイナリ検索について素晴らしい議論をしています


7

u+1=vbreaku+1vu=[this interesting thing]v=[this interesting thing]

現在、他の興味深いプロパティを見つけるために、一般的なレシピはありません。実際、ループ不変式を見つけるための一般的なレシピはないという正式な意味があります。あなたができる最善のことは、いくつかのケースでのみ機能するいくつかのテクニックを適用するか、一般的に興味深い観察のために釣りに行くことです(経験を積むにつれてますますうまくいく)

n

  • u(u+v)/2
  • v(u+v)/2

uvuvn+10uvn+1

uvuvx=u=vuvu<vuvu+1v

v=u+1u2n<v20u2nnn

  • uxv
  • x2nuxu2nv
  • x2>nvxn<v2u

u2n<v2

u2n(u+1)2>nun


「そのため、アルゴリズムが正しいことを証明するには、uとvが等しくなることを証明する必要がある」この文には「否定」がないと思います。
sepp2k 2012年

@KenLiこれはStack Exchangeの観点からの質問ですので、特に改善したい点はありますか?
Gilles「SO-邪悪なことをやめ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.