Wykład B. POWTÓRKA, str. 1 Każda całkowita dodatnia liczba w daje się jednoznacznie przedstawić w postaci w=2 k z gdziezjestnieparzysta
Wykład B. POWTÓRKA, str. 1 Każda całkowita dodatnia liczba w daje się jednoznacznie przedstawić w postaci w=2 k z gdziezjestnieparzysta Wobec tego pętla while(w%2==0) { p=p*p;w=w/2; } (1) niezmieniawartościwyrażeniap w,apojejzakończeniuwjestnieparzysta.
Wykład B. POWTÓRKA, str. 1 Każda całkowita dodatnia liczba w daje się jednoznacznie przedstawić w postaci w=2 k z gdziezjestnieparzysta Wobec tego pętla while(w%2==0) { p=p*p;w=w/2; } (1) niezmieniawartościwyrażeniap w,apojejzakończeniuwjestnieparzysta.
Wykład B. POWTÓRKA, str. 2 Jeśliw>3,to x p w =(x p 2 ) p w 2
Wykład B. POWTÓRKA, str. 2 Jeśliw>3,to x p w =(x p 2 ) p w 2 Wobec tego, jeśli w jest nieparzysta, to pętla while(w>3) { x=x*p*p;w=w-2; } (2) niezmieniawartościwyrażeniax p w,apojejzakończeniuw=3.
Wykład B. POWTÓRKA, str. 2 Jeśliw>3,to x p w =(x p 2 ) p w 2 Wobec tego, jeśli w jest nieparzysta, to pętla while(w>3) { x=x*p*p;w=w-2; } (2) niezmieniawartościwyrażeniax p w,apojejzakończeniuw=3.
Wykład B. POWTÓRKA, str. 3 Dlatego po wykonaniu fragmentu x=1; while(w%2==0) { p=p*p;w=w/2; } while(w>3) { x=x*p*p;w=w-2; } (1) (2) wartośćwyrażeniax p 3 jestrównapoczątkowejwartościpotęgip w.
Wykład B. POWTÓRKA, str. 4 Ale program, zbudowany na tej zasadzie, wylicza potęgi nieprawidłowo
Wykład B. POWTÓRKA, str. 4 Ale program, zbudowany na tej zasadzie, wylicza potęgi nieprawidłowo: CALKOWITE DODATNIE POTEGI LICZBY 2 od 2.00^8 do 2.00^16 wykl 2.00^wykl --------+-------------- 8 16777216.00 9 512.00 10 1024.00 11 2048.00 12 4096.00 13 8192.00 14 16384.00 15 32768.00 16 281474976710656.00
Wykład B. POWTÓRKA, str. 4 Ale program, zbudowany na tej zasadzie, wylicza potęgi nieprawidłowo: CALKOWITE DODATNIE POTEGI LICZBY 2 od 2.00^8 do 2.00^16 wykl 2.00^wykl --------+-------------- 8 16777216.00 9 512.00 10 1024.00 11 2048.00 12 4096.00 13 8192.00 14 16384.00 15 32768.00 16 281474976710656.00
Wykład B. POWTÓRKA, str. 5 Stwierdzenie Wobec tego, jeśli w jest nieparzysta, to pętla while(w>3) { x=x*p*p;w=w-2; } (2) niezmieniawartościwyrażeniax p w,apojejzakończeniuw=3. jest nieprecyzyjne.
Wykład B. POWTÓRKA, str. 5 Stwierdzenie Wobec tego, jeśli w jest nieparzysta, to pętla while(w>3) { x=x*p*p;w=w-2; } (2) niezmieniawartościwyrażeniax p w,apojejzakończeniuw=3. jest nieprecyzyjne. Jeśliprzedtąpętląw=1,topojejzakończeniuw=1anie3.Wobec tegowtedyx p,aniex p 3,jestrównepoczątkowejwartościpotęgip w.
Wykład B. POWTÓRKA, str. 5 Stwierdzenie Wobec tego, jeśli w jest nieparzysta, to pętla while(w>3) { x=x*p*p;w=w-2; } (2) niezmieniawartościwyrażeniax p w,apojejzakończeniuw=3. jest nieprecyzyjne. Jeśliprzedtąpętląw=1,topojejzakończeniuw=1anie3.Wobec tegowtedyx p,aniex p 3,jestrównepoczątkowejwartościpotęgip w.
Wykład B. POWTÓRKA, str. 5 Stwierdzenie Wobec tego, jeśli w jest nieparzysta, to pętla while(w>3) { x=x*p*p;w=w-2; } (2) niezmieniawartościwyrażeniax p w,apojejzakończeniuw=3. jest nieprecyzyjne. Jeśliprzedtąpętląw=1,topojejzakończeniuw=1anie3.Wobec tegowtedyx p,aniex p 3,jestrównepoczątkowejwartościpotęgip w. Tak się dzieje wtedy, gdy początkowy wykładnik w jest potęgą liczby 2.
Wykład B. POWTÓRKA, str. 6 Niezmiennik pierwszej pętli: p w =podst wykl &wniejestpot.2 &x=1
Wykład B. POWTÓRKA, str. 6 Niezmiennik pierwszej pętli: p w =podst wykl &wniejestpot.2 &x=1 Poprawność pierwszej pętli: / p=podst&w=wykl&wniejestpot.2 &x=1 / while(w%2==0) { p=p*p;w=w/2; } / p w =podst wykl &wnieparzyste&wniejestpot.2 &x=1 /
Wykład B. POWTÓRKA, str. 6 Niezmiennik pierwszej pętli: p w =podst wykl &wniejestpot.2 &x=1 Poprawność pierwszej pętli: / p=podst&w=wykl&wniejestpot.2 &x=1 / while(w%2==0) { p=p*p;w=w/2; } / p w =podst wykl &wnieparzyste&wniejestpot.2 &x=1 / / x p w =podst wykl &wnieparzyste&w 3 /
Wykład B. POWTÓRKA, str. 7 Niezmiennik drugiej pętli: x p w =podst wykl &wnieparzyste&w 3
Wykład B. POWTÓRKA, str. 7 Niezmiennik drugiej pętli: x p w =podst wykl &wnieparzyste&w 3 Poprawność drugiej pętli: / x p w =podst wykl &wnieparzyste&w 3 / while(w>3) { x=x*p*p;w=w-2; } / x p 3 =podst wykl /
Wykład B. POWTÓRKA, str. 8 Pokazaliśmy, że / p=podst&w=wykl&wniejestpot.2 / cały program / x p 3 =podst wykl /
Wykład B. POWTÓRKA, str. 8 Pokazaliśmy, że / p=podst&w=wykl&wniejestpot.2 / cały program / x p 3 =podst wykl / alejeśliwykljestpotęgąliczby2,toztegostwierdzenianicniewynika.
y Wykład B. POWTÓRKA, str. 9 Przykład: (dzielenie binarne) 1010001:110
Wykład B. POWTÓRKA, str. 9 Przykład: (dzielenie binarne) 1 1010001:110 110 100
Wykład B. POWTÓRKA, str. 9 Przykład: (dzielenie binarne) 11 1010001:110 110 1000 110 10
Wykład B. POWTÓRKA, str. 9 Przykład: (dzielenie binarne) 110 1010001:110 110 1000 110 100 000 100
Wykład B. POWTÓRKA, str. 9 Przykład: (dzielenie binarne) 1101 1010001:110 110 1000 110 100 000 1001 110 11
Wykład B. POWTÓRKA, str. 10 Przykład: (dzielenie binarne) wynik q dzielnan :dzielnikk q k reszta r Podział liczby 1010 001 można zapisać tak: 1010 2 3 +001 & 001<2 3
Wykład B. POWTÓRKA, str. 11 Przykład: (dzielenie binarne) Zróbmy więc pętlę z niezmiennikiem n=(k q+r) 2 l +b&0 b<2 l &0 r k 1
Wykład B. POWTÓRKA, str. 11 Przykład: (dzielenie binarne) Zróbmy więc pętlę z niezmiennikiem n=(k q+r) 2 l +b&0 b<2 l &0 r k 1 Inicjalizacja(a=2 l ): a=1; while(a<=n) a=2*a; q=0; r=0; b=n;
Wykład B. POWTÓRKA, str. 12 Przykład: (dzielenie binarne) Zróbmy więc pętlę z niezmiennikiem n=(k q+r) 2 l +b&0 b<2 l &0 r k 1 Główna pętla: while(a>1) { a=a/2;q=q*2;r=r*2; if(a<=b) {b=b-a;r=r+1; } if(r>=k) {r=r-k;q=q+1; } }
Wykład B. POWTÓRKA, str. 13 Przykład: (dzielenie binarne) Dzieleniaimnożeniaprzez2tosąprzesunięciabitówo1miejscewprawo iwlewo.