वास्तव में लूप की पोस्ट-कंडीशन है (आपको ऐसा क्यों लगता है कि यह "स्पष्ट रूप से" नहीं है?)। यह हमेशा एक समय पाश है कि एक शामिल नहीं है के साथ मामला है: जब पाश बाहर निकलता है, यह केवल हो सकता है क्योंकि पाश हालत (यहाँ, यू + 1 ≠ v ) गलत है। यह एकमात्र चीज नहीं है जो तब सच होगी जब लूप यहां से बाहर निकलता है (यह एल्गोरिथम वास्तव में कुछ दिलचस्प गणना करता है, जैसा कि आपने अपनी कक्षा में देखा था, इसलिए यू = [यह दिलचस्प बात है] और v = [यह दिलचस्प बात] भी पोस्ट-स्थितियां हैं ), लेकिन यह सबसे स्पष्ट है।यू+ 1 = vbreak
यू + 1 ≠ vयू = [यह दिलचस्प बात]v = [यह दिलचस्प बात]
अब, अन्य दिलचस्प गुणों को खोजने के लिए, कोई सामान्य नुस्खा नहीं है। वास्तव में, कुछ औपचारिक समझदारी है जिसमें लूप इनवेरिएंट्स को खोजने के लिए कोई सामान्य नुस्खा नहीं है। सबसे अच्छा आप कुछ तकनीकों को लागू कर सकते हैं जो केवल कुछ मामलों में काम करते हैं, या आम तौर पर दिलचस्प टिप्पणियों के लिए मछली पकड़ने जाते हैं (जो बेहतर और बेहतर काम करता है क्योंकि आप अधिक अनुभवी हैं)।
यदि आप कुछ मान के साथ कुछ पुनरावृत्तियों के लिए लूप चलाते हैं , तो आप देखेंगे कि प्रत्येक पुनरावृत्ति पर:n
- या तो ( यू + वी ) / 2 तक कूदता है ;यू( यू + वी ) / २
- या करने के लिए नीचे कूदता ( यू + v ) / 2 ।v( यू + वी ) / २
विशेष रूप से, से भी कम समय शुरू होता है वी , और यह आगे निकल कभी नहीं होगा। इसके अलावा, यू सकारात्मक शुरू होता है और बढ़ता है, जबकि v n + 1 से शुरू होता है और घटता है। तो 0 ≤ यू ≤ वी ≤ n + 1 इस कार्यक्रम के दौरान एक अपरिवर्तनीय है।यूvयूvएन + १0 ≤ यू ≤ वी ≤ n + 1
एक बात जो इतनी स्पष्ट नहीं है कि क्या कभी भी v के बराबर हो सकता है । यह महत्वपूर्ण है: यदि u और v कभी बराबर हो जाते हैं, तो हमारे पास x = u = v होगा और लूप हमेशा के लिए चलता रहेगा। तो आपको यह साबित करने की आवश्यकता है कि एल्गोरिथम सही है (यानी हमेशा के लिए लूप नहीं करता) साबित करने के लिए यू और वी कभी भी बराबर नहीं बनते। एक बार इस आवश्यकता की पहचान हो जाने के बाद, यह साबित करना आसान है (मैं इसे एक अभ्यास के रूप में छोड़ रहा हूं) कि u < v एक लूप इनवेरिएंट है (ध्यान रखें कि u और v पूर्णांक हैं, इसलिए यह u के बराबर हैयूvयूvx = u = vयूvआप < vयूv )।u+1≤v
चूंकि कार्यक्रम के अंत में, के बाद हालत आप दिए गए थे भी लिखा जा सकता है यू 2 ≤ n < वी 2 (भाग 0 ≤ यू 2 तुच्छ है)। हम इस तरह की पोस्ट-कंडीशन चाहते हैं, जिसमें n शामिल है , यह है कि हम इनपुट n के साथ प्रोग्राम के परिणाम को टाई करना चाहते हैं । यह सटीक स्थिति क्यों? हम उस चीज़ की तलाश कर रहे हैं जो यथासंभव सटीक है, और हम देखते हैं कि एन लूप के अंदर कहां दिखाई देता है:v=u+1u2≤n<v20≤u2nnn
- हमारे पास ;u≤x≤v
- जब , हम लेने के लिए अगले यू होने के लिए एक्स , ताकि यू 2 ≤ n (और वी परिवर्तन नहीं करता है);x2≤nuxu2≤nv
- जब , हम अगले v को x होने के लिए चुनते हैं , ताकि n < v 2 (और u परिवर्तित न हो)।x2>nvxn<v2u
यह विरोधाभास संकेत है कि शायद हर समय। दूसरे शब्दों में, हमें संदेह है कि यह एक पाश अपरिवर्तनीय है। इसे सत्यापित करना पाठक को एक अभ्यास के रूप में छोड़ दिया जाता है (यह जांचने के लिए याद रखें कि संपत्ति शुरू में सच है)।u2≤n<v2
और अब है कि हम यह सब किया है, हम देखते हैं कि और ( यू + 1 ) 2 > n : यू का वर्गमूल है n निकटतम पूर्णांक तक पूर्णांक।u2≤n(u+1)2>nun