Bu karekök bağlı bulma algoritmasında döngü değişmezi nasıl elde edilir?


10

Başlangıçta matematikte.SE ama orada cevaplanmamış.

Aşağıdaki algoritmayı düşünün.

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 

burada u, v ve n tamsayıdır ve bölme işlemi tamsayı bölmedir.

  • Algoritma tarafından neyin hesaplandığını açıklar.
  • Bölüm I'e verdiğiniz cevabı algoritma için son koşul olarak kullanarak, bir döngü değişmezi oluşturun ve algoritmanın sonlandığını ve doğru olduğunu gösterin.

Sınıfta, post-koşul ve Değişmeyen 0 u 2n < v 2 , u + 1 v olarak bulunmuştur . Post-condition ve değişmezlerin nasıl elde edildiğini gerçekten anlamıyorum. Posta koşulunun u + 1 = v olduğunu düşünüyorum0u2n<(u+1)20u2n<v2,u+1vu+1=v... durum böyle değil. Bu yüzden post-condition ve değişmezlerin nasıl elde edildiğini merak ediyorum. Ayrıca, ön koşulu kullanarak ön koşulun nasıl elde edilebileceğini merak ediyorum.


Hoare mantığına aşina mısınız ve buna dokunmak için bir cevap bekliyor musunuz?
Raphael

Yanıtlar:


8

Gilles, genel tekniğin ilginç gözlemler için balığa çıkmak olduğu konusunda haklı.

Bu durumda, programın aşağıdaki şekle sahip olduğu için ikili aramanın bir örneği olduğunu gözlemleyebilirsiniz:

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

Sonra da özellikle fiş sadece f, X... İkili arama için değişmezler içine. Dijkstra ikili arama hakkında güzel bir tartışmaya sahiptir .


7

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

Şimdi, diğer ilginç özellikleri bulmak için genel bir tarif yok. Aslında, döngü değişmezlerini bulmak için genel bir tarifin bulunmadığı bazı resmi duygular vardır. Yapabileceğiniz en iyi şey, sadece bazı durumlarda işe yarayan bazı teknikler uygulamak veya genellikle ilginç gözlemler için balığa çıkmaktır (daha deneyimli hale geldikçe daha iyi ve daha iyi çalışır).

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


"Yani algoritma doğru olduğunu kanıtlamak için u ve v eşit olduğunu kanıtlamak gerekir" Bence bu cümle bir "değil" eksik.
sepp2k

@KenLi Sorunuz Stack Exchange anlamında olduğundan, istediğiniz herhangi bir gelişme var mı?
Gilles 'SO- kötü olmayı bırak'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.