---
# System prepended metadata

title: 'Ćwiczenia 2, grupa śr. 17-19, 16. marca 2022'
tags: [SYK21, pwit, ćwiczenia]

---

# Ćwiczenia 2, grupa śr. 17-19, 16. marca 2022

###### tags: `SYK21` `ćwiczenia` `pwit`

## Deklaracje

Gotowość rozwiązania zadania należy wyrazić poprzez postawienie X w odpowiedniej kolumnie! Jeśli pożądasz zreferować dane zadanie (co najwyżej jedno!) w trakcie dyskusji oznacz je znakiem ==X== na żółtym tle.

**UWAGA: Tabelkę wolno edytować tylko wtedy, gdy jest na zielonym tle!**



:::danger
|                        | 1     | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   |
| ----------------------:| ----- | --- | --- | --- | --- | --- | --- | --- | --- |
Grzegorz Bielecki        |       |     |     |     |     |     |     |     |     |
Kamila Brzozowska        |   X   |  X  |  X  |  X  |  X  |     |  X  |  X   |     |
Adam Ciężkowski          |  X    |  X  |  X  |  X  |  X  |   X  | X   |     |     |
Natalia Czerep           |==X==  |  X  |   X |   X |  X  |     | X   |     |     |
Jan Dalecki              |   X    |  X   |  X   |  ==X==   |  X   |     |  X   |  X   |     |
Marko Golovko            |       |     |     |     |     |     |     |     |     |
Adam Górkiewicz          |   X   |  X  |  X  |  X  |  X  |==X==|  X  |  X  |  X  |
Piotr Gunia              |   X   |==X==|  X  |  X  |  X  |     |  X  |     |     |
Krzysztof Jadłowski     |  X     | X    |  X   |  X   |  X   |     |  ==X==  |  X   |     |
Magdalena Jarecka        |  X     |  X   |  X   |  X   | X  |  X   |X     | X    |     |
Mikołaj Jaszcza          |   X    |  X   |  X   |   X  |   X  |  X   |  X   |  X   |  X   |
Monika Jędrzejkowska     |       |     |     |     |     |     |     |     |     |
Michał Kierul            |    X   |  X   |   X  |   X  |     |     |     |     |     |
Damian Lukas             |       |     |     |     |     |     |     |     |     |
Karol Ochman-Milarski    |       |     |     |     |     |     |     |     |     |
Piotr Piesiak            |       |     |     |     |     |     |     |     |     |
Damian Ratajski          |       |     |     |     |     |     |     |     |     |
Aleksandra Rozkrut       |   X   |  X  |     |     |     |     |  X  |  X  |     |
Marcin Sarnecki          |   X   |  X  |  X  |  X  |  X  |  X  |  X  |  X  | X    |
Maria Szlasa             |   X   |  X  |==X==|  X  |  X  |     |  X  |  X  |     |
Mateusz Burdyna          |   X   |  X  |  X  |     |     |     |     |     |     |
Nikola Wrona             |   X   |  X  |  X  |  X  |     |     |  X  |  X  |     |
Marcin Wróbel            |   X   |  X  |  X  |  X  |  X  |  X  |  X  |  X  |  ==X==  |
:::



:::info
**Uwaga:** Po rozwiązaniu zadania należy zmienić kolor nagłówka na zielony.
:::


## Lista 1,  Zadanie 8

:::success
Autor: Mikołaj Jaszcza
:::
![](https://i.imgur.com/69pgoms.png)
Białe bloki na górze reprezentują sumatory 1 bitowe (tworzą razem sumator RCA), które także obliczają propagację dla każdego bitu.
Blok C oblicza propagację dla danego przedziału bitów, i przekazuje dalej generację przez cały przedział bitów obliczoną przez sumator.

Propagacja przedziału jest iloczem (AND - tj. p0 AND p1 AND p2 AND p3) propagacji pojedynczych pozycji. Natomiast generacja w trywialny sposób jest równoważna z wartością carry-out sumatora RCA przy carryin=0 (zauważmy, że jej wartość jest znana już po 2k+1 jednostkach czasu, niezależnie od "wejściowych" c0, gdzie k to liczba bitów w bloczku RCA).

Sygnał jest propagowany w "dół" drzewa (zgodnie ze schematem u góry)
poprawne są kolejne wartości Pij, Gij
dla coraz większych przedziałów (niżej w drzewie), wyznaczone dzięki wzorom 
=> P(i, k) = P(i, j) * P(j+1,k)
=> G(i, k) = (Gj+1, k)+ (Pj+1, k) * G(i, j).

Następnie mając poprawne powyższe wartości
obliczane są wartości carry-out "ck" (chodzi tu o działania mające miejsce w "bloczku" B) bloczku przy otrzymanym carry in (indeksy poniżej na bazie indeksów bloczku B)
c(k + 1) = G(i,k) + P(i,k)c(i). Więc następnie każdy sumator poprawnie oblicza odpowiednie bity sumy.

n=b*k
k-rozmiar bloku
b-liczba bloków

Pełny sumator jednobitowy ma 5 bramek, więc cały sumator k-bitowy będzie miał 5k bramek (i będzie działał w czasie 2k+1). 

Schemat bloczku B:
![](https://i.imgur.com/uvz1ae1.png)

CZAS DZIAŁANIA:
(2k+1)+(2*log(b))+(2*log(b))+(2k+1) - 2

2k+1 sumatory rca na początku
2*log(b) przejście drzewa w dół
2*log(b) przejście drzewa w góre
2k+1 sumator rca na końcu
-2 -> ponieważ w korzeniu drzewa nie ma potrzeby wyznaczania generacji oraz propagacji (o ile nie sprawdzamy potencjalnego overflow)

obliczenie liczby bramek w przedstawionym rozwiązaniu (z podziałem na czynniki):
5*n -> sumatory pełne 1 bitowe (po 5 bramek, n bitów)
n -> liczenie propagacji dla każdego pojedynczego bitu, każdy z nich musi przekazać odpowiednią wartość do bloku C aby wyliczyć propagację całego bloczku - łącznie jest ich n
b -> skoro jest b bloczków typu C, a każdy blok ma po jednym "wielkim" AND (tj obliczanie propagacji) 
5*(b-1) - każdy blok typu B ma 5 bramek (patrz. schemat wklejony powyżej), a bloczków typu B jest b-1 (własności bitowe).


Zatem podsumowując ->  5*n+n+b+5*(b-1)



## Zadanie 1

:::success
Autor: Natalia Czerep
:::
![](https://i.imgur.com/WV8m7Pe.png)
![](https://i.imgur.com/TD4xeZF.png)
![](https://i.imgur.com/mBjQEw5.png)



9 = 1001
3 = 0011

   
   0011
 A=1001
   
  ------
   0011
  0000
 0000
0011
  

  
  



A = 1001
B = 0011
P = 0000
![](https://i.imgur.com/dFqMZJ5.jpg)
## Zadanie 2

:::success
Autor: Piotr Gunia
:::

![](https://i.imgur.com/9cmdR5Z.png)



![](https://i.imgur.com/UrW0Ebx.png)

Przesunięcie arytmetyczne - "rozsmarowanie" bitu znaku

![](https://i.imgur.com/98p9awv.jpg)


## Zadanie 3

:::success
Autor: Maria Szlasa
:::
Wykonaj zadanie 1. dla układu stosującego przesuwanie przez zera (ang. shifting over zeros). 

**Wskazówka: “Appendix J”, str. 45.**
![](https://i.imgur.com/xp2hyU4.png)

**Struktura**
![](https://i.imgur.com/J0rNd3w.png)

**Algorytm**
1. Jeśli najmniej znaczący bit A wynosi 1 to B dodaj do P i sumę umieść w P. Wpp Przejdź do drugiego kroku.
2. P i A przesuń w prawo, carry-out przenieś do najwyższego bitu P, a najmniejszy bit P przenieś do skrajnego prawego bitu A. Fragment bitów przeniesionych z P do A nie jest używany w pozostałej części algorytmu. 

**$9\cdot3$**

|           | start | 1a   | 2        | 2        | 2        | 1a       | 2        |
| --------- | ----- | ---- | -------- | -------- | -------- | -------- | -------- |
| A         | 1001  | 1001 | **1**100 | **11**10 | **011**1 | **011**1 | **1011** |
| B         | 0011  | 0011 | 0011     | 0011     | 0011     | 0011     | 0011     |
| P         | 0000  | 0011 | 0001     | 0000     | 0000     | 0011     | 0001     |
| $c_{out}$ | 0     | 0    | 0        | 0        | 0        | 0        |          |



## Zadanie 4

:::success
Autor: Jan Dalecki
:::

Kodowanie Bootha:

Każdy ciąg n jedynek w zapise binarnym liczby zastępujemy przez liczbę n+1 bitową gdzie wszytkie bity są równe 0 oprócz najstarszego bitu, a najmłodszy bit jest ustawiany na $\hat{1}$ co oznacza odjęcie $2^{i}$ gdzie $i$ to pozycja $\hat{1}$.

Np. 

+ $111111 \rightarrow 100000\hat{1} = 63 = 64 - 1$
+ $11011110 \rightarrow 10\hat{1}1000\hat{1}0 = 222 = 192 + 30 = (256 - 64) + (32 - 2)$

Re-kodowanie Bootha:

Patrzymy na aktualny najmłodszy bit w rejestrze A oraz dodatkowo na ostatnio przeglądany bit.

W i+1 kroku mamy następujące przypadki:

$a_i = 0$, $a_{i-1} = 0$ dodaj $0$ do rejestru P.
$a_i = 0$, $a_{i-1} = 1$ dodaj B do rejestru P.
$a_i = 1$, $a_{i-1} = 0$ odejmij B z rejestru P.
$a_i = 1$, $a_{i-1} = 1$ dodaj $0$ do rejestru P.

Przykład A = -9, B = 3

$A = 10111$
$B = 00011$

Krok 1.

$PA = 00000|10111$, $a_0 = 1 \, \ a_{-1} = 0 \overset{-b}\rightarrow PA=11101|10111 \rightarrow PA=11110|11011$

Krok 2.

$PA = 11110|11011$, $a_0 = 1 \, \ a_{-1} = 1 \overset{+0}\rightarrow PA=11110|11011 \rightarrow PA=11111|01101$

Krok 3.

$PA = 11111|01101$, $a_0 = 1 \, \ a_{-1} = 1 \overset{+0}\rightarrow PA=11111|01101 \rightarrow PA=11111|10110$

Krok 4.

$PA = 11111|10110$, $a_0 = 0 \, \ a_{-1} = 1 \overset{+b}\rightarrow PA=00010|10110 \rightarrow PA=00001|01011$

Krok 5.

$PA = 00001|01011$, $a_0 = 1 \, \ a_{-1} = 0 \overset{-b}\rightarrow PA=11110|01011 \rightarrow PA=11111|00101$

Wynik : $PA = 1111100101 = -27 = ab$
 
#### Poprawność algorytmu

Zakładamy, że liczba $a$ jest ujemna, a liczba $b$ nieujemna. Dla każdego bloku jedynek na bitach $j:i \ \ (j \ge i)$ zapisu binarnego liczby $a$ wykonamy wpierw odjęcie liczby $b2^{i}$, a po $j-i+1$ przesunięciach dodamy liczbę $b2^{j+1}$. W rezultacie zamienimy sumę:

$$b\sum_{k=i}^{j}2^k = b 2^i\frac{1-2^{j-i+1}}{-1} = b2^i(2^{j-i+1} -1) =b2^{j+1} - b2^{i}$$

Krok i+1. (Napotykamy na pierwszą 1)

Na bitach rejestru $2n-1:n-i$ mamy zapisaną liczbę 0.

Odejmujemy liczbę $b$ na rejestrze P i przesuwamy arytmetycznie w prawo.
Na $2n-1:n-i-1$ bitach będziemy mieli liczbę $-b2^{i}$.

W kolejnych krokach dokonujemy już tylko przesunięcia, aż napotkamy kolejną jedynkę.

Wykonaliśmy $j-i+1$ przesunięć w prawo zatem na $2n-1:n-j-1$ będzie liczba $-b2^{i}$. Dodajemy $b2^{j+1}$ i wykonujemy przesunięcie w prawo. Na $2n-1:n-j-2$ bitach znajdzie się liczba $b2^{j+1} - b2^{i}$.

Dalsze bloki obliczane są w analogiczny sposób z dodatkowym założeniem, że dodajemy liczby do sumy otrzymanej z wcześniejszych operacji zapisanej na wcześniejszych bitach.

Zauważmy, że może nie starczyć nam kroków do przeprowadzenia pełnej sekwencji dla bloku jedynek. W takim przypadku najstarszy bit liczby $a$ musi być 1 czyli zgodnie z naszymi założeniami. 

Rozważmy sekwencję jedynek które zapisane są na bitach $n-1:i$ liczby $a$. Możemy założyć, że do ostatniego 0 (bit $i-1$) w zapisie binarnym $a$ obliczyliśmy poprawnie sumę:

$$b\sum_{k=0}^{i-1}2^ka_{k}$$

Mamy do dodania taką sumę: $-2^{n-1}b + b\sum_{k=i}^{n-2}2^{i}$

$$-2^{n-1} + \sum_{k=i}^{n-2}2^{i} = -2^{n-1} + 2^{i}\frac{1-2^{n-i-1}}{-1} = -2^{n-1} + 2^i(2^{n-i-1} - 1) = -2^i$$


W przypadku kodowania Bootha odejmiemy wpierw liczbę $-b2^{i}$ i do końca będziemy wykonywać już tylko przesunięcia arytmetyczne. Zatem otrzymamy poprawny wynik.

#### Układ

![](https://i.imgur.com/lOXgTyJ.jpg)



## Zadanie 5

:::success
Autor: Adam Ciężkowski
:::

Dla liczb $n$-bitowych robimy $n$ razy:

["W locie" korzystamy z kodowania Bootha.]
1) * Jeśli natrafimy na 1 (z daszkiem), odejmujemy 
    * Jeśli natrafimy na 1 (bez daszku), dodajemyA
    * Jeśli natrafimy na 0, nie robimy nic
2) * Robimy shift w prawo (biorąc pod uwagę bit znaku)

![](https://i.imgur.com/lVvCjNJ.png)




## Zadanie 6

:::success
Autor: Adam Górkiewicz
:::
Zadanie pomnożenia dwóch liczb $A = [a_{n - 1}a_{n - 2}\dots a_0]_2$ oraz $B = [b_{n - 1}b_{n - 2}\dots b_0]_2$ możemy sprowadzić do dodania do siebie $n$ liczb $X_i$, gdzie $X_i = A \cdot b_i \cdot 2^i$, ponieważ
$$ \sum X_i = \sum A \cdot b_i \cdot 2^i = A \sum b_i \cdot 2^i = A \cdot B.$$
Możemy wyznaczyć liczby $X_i$ równolegle czasie stałym. 
Sumator CSA jest w stanie w czasie stałym wczytać trzy liczby oraz zwrócić dwie liczby, których suma jest równa sumie liczb wejściowych.
Drzewo Wallace'a ma strukturę $W$ warstw sumatorów CSA.
Sumatory CSA w danej warstwie przyjmują jako kanały wejściowe kanały wyjściowe z warstwy poprzedniej. 
Jeżeli liczba kanałów wyjściowych z warstwy poprzedniej nie jest podzielna przez $3$, nadmiarowe kanały ''bypassują'' warstwę i stają się kanałami wejściowymi warstwy następnej. 
Liczba kanałów wyjściowych z danej warstwy jest około $\frac{3}{2}$-krotnie mniejsza od liczby kanałów wejściowych.
W związku z tym, dla $W = O(\log_{\frac{3}{2}} n) = O(\log n)$, liczba kanałów wyjściowych z ostatniej wastwy wyniesie $2$.
Owe kanały następnie wpuszczane są do dowolnego szybkiego addera, który dodaje je w czasie $O(\log n)$ (przykładowo CLA). 
Złożoność całego algorytmu wyniesie $O(\log n)$.
![](https://i.imgur.com/bZ48l0G.png)

## Zadanie 7

:::success
~~Autor: Krzysztof Jadłowski~~ (nieobecny podczas prezentacji)
:::


![](https://i.imgur.com/Nzy5Tug.png)


![](https://i.imgur.com/zNl3yDY.png)

przykład użycia:
A - 9(1001) , B- 3(0011)
Prześledźmy co znajduje się w rejestrach w ciągu wykonywania algorytmu:
## 1.
### I)
A- 1001 -> 0010,  B- 0011 , P - 0000 -> 0001(przeniesienie z A)
### II-IV)
A - 0010 -> 0010(ujemny wynik), B - 0011, P- 0001 ->0001(ujemny wynik)
## 2.
### I)
A- 0010 -> 0100, B-0011, P-0001 -> 0010

### II-IV)
A - 0100 -> 0100, B- 0011, P - 0010 -> 0010
## 3.
### I)
A- 0100 -> 1000, B- 0011 , P - 0010 -> 0100

### II-IV)
A - 1000-> 1001, B- 0011, P - 0100 -> 0001
## 4.
### I)
A - 1001 -> 0010, B- 0011, P- 0001 -> 0011

### II-IV)
A - 0010 -> 0011, B- 0011, P - 0011 -> 0000

Ostatecznie
9/3 = 3 reszta 0


## Zadanie 8

:::success
Autor: Marcin Sarnecki
:::
![](https://i.imgur.com/BFjMHSZ.png)

![](https://i.imgur.com/THZXAkl.png)


<u>Algorytm:</u>

Powtórz n razy:

Jeśli P < 0:
   a) Przesuń rejestr (PA) w lewo
   b) Dodaj zawartość rejestru B do rejestru P.
W przeciwnym razie:
    a) Przesuń rejestr (PA) w lewo
    b) Odejmij zawartość rejestru B od P
Jeśli P < 0:
    a) Ustaw najmniej znaczący bit A na 0
W przeciwnym razie:
    a) Ustaw najmniej znaczący bit A na 1


Na końcu jeśli P < 0:
Dodaj zawartość rejestru B do rejestru P.
    
    
Iloraz znajduje się w rejestrze A. Reszta znajduje się w rejestrze P.
Jeśli reszta jest ujemna, należy dodać do niej wartość B.

Różnica pomiędzy algorytmami restoring i nonrestoring polega na tym, że w wersji
nonrestoring jeśli po odjęciu wartości B wartość P stanie się ujemna, to nie przywracamy poprzedniej wartości poprzez dodanie wartości B.




| P | A | B | wykonana operacja|
| -------- | -------- | -------- | -------- |
| 00000 | 1001 | 00011 | inicjalizacja |
| 00001 | 001? | 00011 | Shift w lewo |
| 11110 | 001? | 00011 | odjęcie B od P |
| 11110 | 0010 | 00011 | ustawienie najmniej znaczącego bitu A na 0 |
| 11100 | 010? | 00011 | Shift w lewo |
| 11111 | 010? | 00011 | dodanie B do P |
| 11111 | 0100 | 00011 | ustawienie najmniej znaczącego bitu A na 0 |
| 11110 | 100? | 00011 | Shift w lewo |
| 00001 | 100? | 00011 | dodanie B do P |
| 00001 | 1001 | 00011 | ustawienie najmniej znaczącego bitu A na 1 |
| 00011 | 001? | 00011 | Shift w lewo |
| 00000 | 001? | 00011 | odjęcie B od P |
| 00000 | 0011 | 00011 | ustawienie najmniej znaczącego bitu A na 1 |

*Uzasadnienie poprawności*
Zauważmy, że działanie tego algorytmu jest podobne do działania algorytmu restoring division
Gdy P jest dodatnie, algorytm działa tak samo jak restoring division
Gdy P jest ujemne, to nie wykonujemy restore w rejestrze P, więc 
wartość w rejestrze P jest mniejsza o B niż w sytuacji gdybyśmy zrobili restore
następnie po przesunięciu w lewo P w następnym kroku wartość w P jest mniejsza o 2B niż gdybyśmy zrobili restore,
ale skoro P jest ujemne to ten algorytm doda B do P
stąd otrzymamy odpowiednią wartość P, tak jak w algorytmie restoring division.



## Zadanie 9

:::success
Autor: Marcin Wróbel
:::
**Przedstaw algorytm dzielenia metodą SRT (ang. SRT division).**
Dzielimy **a** przez **b** obie są liczbami n bitowymi
Zapisujemy a do rejestru A (długość n)
Zapisujemy b do rejestru B (długość n)
Zapisujemy 0 do rejestru P (długość n+1, zapis U2)

1. Jeśli rejestr B ma k zer wiodących w zapisie n bitowym przesuń rejestr B oraz rejestr (PA) w lewo o k bitów
2. For i=n-1 to 0:
 + a) Jeśli 3 najbardziej znaczące bity P są sobie równe:<BR>przesuń rejestr (PA) w lewo, ustaw najmniej znaczący bit A na 0

 + b) Jeśli 3 najbardziej znaczące bity P nie są sobie równe i P jest ujemne:<BR>przesuń rejestr (PA) w lewo, ustaw najmniej znaczący bit A na -1, dodaj B do P.
 - c) w przeciwnym przypadku:<BR>przesuń rejestr (PA) w lewo, ustaw najmniej znaczący bit A na 1, odejmij B od P.
End loop
3. Jeśli reszta ( P ) jest ujemna popraw wynik (A) odejmując od niego 1, oraz dodając B do P
4. Rejestr P musi być przesunięty o k bitów w prawo (odwracając przesunięcie z kroku 1)
5. A to iloraz, P to reszta

**Oraz zademonstruj działanie na wybranym przez siebie przykładzie.**
A=9<sub>10</sub>
B=3<sub>10</sub>
9<sub>10</sub>/3<sub>10</sub>
1001<sub>2</sub>/0011<sub>2</sub>
|  P    |  A   |  B    | -B    | Komentarz|
| ----- | ---- | ----- | ----  | ---      |
| 00000 | 1001 | 0011 | 11101 | Początkowy stan      |
||||| 1. B ma 2 bity wiodące w zapisie 4-bitowym, SL(B) o 2 bity, SL(PA) o 2 bity |
| 00010 | 0100 | 1100 | 10100 | |
||||| 2.a) SL(PA), nowy bit 0 |
| 00100 | 100**0** | 1100 | 10100 | |
||||| 2.c) SL(PA), nowy bit 1|
| 01001 | 00**01** | 1100 | 10100 | |
||||| 2.c) odejmowanie B od P|
| 11101 | 00**01** | 1100 | 10100 | |
||||| 2.a) SL(PA), nowy bit 0|
| 11010 | 0**010** | 1100 | 10100 | |
||||| 2.b) SL(PA), nowy bit $\overline{1}$|
| 10100 | $\bf010\overline{1}$ | 1100 | 10100 |  |
||||| 2.b) dodawanie B do P|
| 00000 | $\bf010\overline{1}$ | 1100 | 10100 |  |
||||| 4. Reszta ( P ) jest dodatnia wszystko wynik jest ok |
||||| 5. Bity reszty są przesunięte o 2 bity w prawo |
| 00000 | $\bf010\overline{1}$| 1100 | 10100 |  |


**Uzasadnij jego poprawność**
x,y - liczby bez znaku
dzielimy $\frac{x}{y}$
Na początku rejestr
$A = x$
$B = y$
$P = 0$
Dla uproszczenia
Część rejestru ( PA ) reprezentującą resztę będę oznaczał jako X,
Część rejestru ( PA ) reprezentującą iloraz będę oznaczał jako Q,

$\overbrace{10100\qquad1}^{X}\overbrace{\bf01\overline{1}}^{Q}$
$\underbrace{10100}_{P}\qquad\underbrace{1\bf01\overline{1}}_{A}$

---

**Fakt 1.**(pokazany poźniej)
Przed/po każdej iteracji pętli
$P \in <-B,B)$

**Dowód Faktu 1**
Przed/po każdej iteracji pętli
$P \in <-B,B)$

Przed pierwszą iteracją P=0, więc teza zachodzi
Jeśli dzielimy liczby n bitowe, to P ma n+1 bitów,
$P\in<-2^n,2^n-1>$,
w rejestrze B najbardziej znaczący bit jest równy 1
$B\in<2^{n-1},2^n-1>$ ,więc
$<-2^{n-1},2^{n-1}>\subseteq<-B,B>$
$<-2^{n-1},2^{n-1}-1>\subseteq<-B,B)$

2.a Gdy 3 najbardziej znaczące bity są sobie równe, to po SL
2 najbardziej znaczące bity są sobie równe, więc
$P \in <-2^{n}+2^{n-1},2^{n-2}+2^{n-1}+...+1>$
$P \in <-2^{n-1},2^{n-1}-1>$
Skoro B jest równe co najmniej $2^{n-1}$ , to
$P\in<-B,B)$
2.b P jest ujemne, więc
$P \in <-2^n,-1>$
po dodaniu B do P
$P \in <-2^n+2^{n-1},-1+B>$,więc
$P \in <-2^{n-1},B-1>$
$P\in<-B,B)$
3.c P jest dodatnie/równe 0, więc
$P \in <0,2^n-1>$
po odjęciu B od P
$P \in <0-B,2^n-1-2^{n-1}>$
$P \in <-B,2^{n-1}-1>$
$P \in <-B,2^{n-1}-1>$
$P \in <-B,B)$
$P \in <0,B)$

---
$\overbrace{10100\qquad1}^{X}\overbrace{\bf01\overline{1}}^{Q}$
$\underbrace{10100}_{P}\qquad\underbrace{1\bf01\overline{1}}_{A}$

Na początku oczywiście
$Q = 0$
I poprawny jest niezmiennik, przed każdą iteracją zachodzi:
$\frac{X}{B} + Q*2^{i} = wynik$
gdzie i to zmienna i w pętli for danej iteracji
$wynik$ - matematyczna postać dzielenia $\frac{x}{y}$
**1. Wykonanie przesunięcia o k bitów**
Przesuwamy
$\frac{X*2^k}{B*2^k} + Q*2^{i}*2^k = wynik$
Nadal nierówność będzie zachodzić, bo
$\frac{X*1}{B*1} + 0*2^{i}*2^k = wynik$
$\frac{X}{B} + 0 = wynik$
$\frac{X}{B} + Q*2^{i-1} = wynik$
Nowe wartośći rejestrów to
$X = X*2^k$
$B = B*2^k$
$Q = Q*2^k = Q$ ,bo $Q=0$
**2.a**
$\frac{X-B}{B} + Q*2^i = wynik$
Przesunięcie rejestru (PA) w lewo nie zmienia wartości w X
Q jest teraz o 2 większe w związku z przesunięciem, ale za to i się zmniejszy o 1, więc niezmiennik zostanie zachowany
$\frac{X-B}{B} + (Q*2)*2^{i-1} = wynik$
nowa wartość
$Q=Q*2$

**2.b**
Przesunięcie rejestru (PA) zachowuje niezmiennik,
natomiast odjęcie 1 do A i dodanie B od P, to
$\frac{X+B*2^{i-1}}{B} + (Q - 1)*2^{i-1} = wynik$
Działa, bo:
$\frac{X+B*2^{i-1}}{B} + Q*2^{i-1} - 1*2^{i-1} = wynik$
$\frac{X}{B}+\frac{B*2^{i-1}}{B} + Q*2^{i-1} - \frac{B*2^{i-1}}{B} = wynik$
$\frac{X}{B} + Q*2^{i-1}= wynik$

Nowe wartości rejestrów
$X = X+B*2^{i-1}$
$Q = Q-1$

**2.c**
Przesunięcie rejestru (PA) zachowuje niezmiennik,
natomiast dodanie 1 do A i odjęcie B od P, to
$\frac{X-B*2^{i-1}}{B} + (Q + 1)*2^{i-1} = wynik$
Działa, bo:
$\frac{X-B*2^{i-1}}{B} + Q*2^{i-1} + 1*2^{i-1} = wynik$
$\frac{X}{B}-\frac{B*2^{i-1}}{B} + Q*2^{i-1} + \frac{B*2^{i-1}}{B} = wynik$
$\frac{X}{B}*2^{i-1} + Q = wynik$

Nowe wartości rejestrów
$X = X-B*2^{i-1}$
$Q = Q+1$

**3.**
Niezmiennik zostaje zachowany analogicznie do 2.b
Po wykonaniu mamy stan:
$\frac{X}{B} + Q*2^0 = wynik$
Teraz X to dokładnie rejestr P, a Q to dokładnie rejestr A, więc
$\frac{P}{B} + A = wynik$
Skoro przed wykonaniem tego kroku
$P \in <-B,B)$
to po wykonaniu
$P \in <0, B)$

**4.**
W tym kroku dzielimy $P$ przez $2^k$
wykonując przesunięcie o k bitów w prawo i wirtualnie dzielimy też $B$
$\frac{P}{2^k} \in <0, \frac{B}{2^k})$
$\frac{P}{2^k} \in <0, y)$
Nowa wartość rejestru $P=\frac{P}{2^k}$, więc
$P \in <0, y)$
i wirtualnie traktujemy
$B=\frac{B}{2^k}$, więc
$\frac{P}{B} + A = wynik$
$\frac{P}{y} + A = wynik$
$P \in <0, y)$, więc
A to iloraz, a P to reszta z dzielenia przez y



---

<!-- Rejestr P zawsze przechowuje taką liczbę, że gdy jest ujemny zawsze po dodaniu B otrzymamy liczbę nieujemną, co za tym idzie dodatnią resztę. Wynika to z tego, że B zostało przesunięte w lewo, tak że najbardziej znaczący dodatni bit w B jest równy jeden. -->




**Jaka motywacja stoi za wprowadzeniem tego algorytmu?**
We wcześniejszych implementacjach dzielenia nie pomijamy żadnej operacji dodawania/odejmowania, ale jeżeli iloraz zawiera jakieś bity równe zero,
to moglibyśmy odpowiadające tym bitom operacje dodawania/odejmowania pominąć.
Stąd algorytm SRT division w podstawowej wersji działa szybciej, od poprzednich gdy jakieś bity wyniku są równe 0

