Przykładowe rozwiązania zadań egzaminacyjnych - Zadania 1

advertisement
Przykładowe rozwiązania zadań egzaminacyjnych - Zadania 1 - 8
Zadanie 1. W alfabecie 10 znakowym S={0,1,2,3,4,5,6,7,8,9}= Z_10 szyfrem
liniowym
y=2*x+5
(w Z_10)
zakodowano wyraz 3.literowy (3,5,8) metodą ,litera po literze'.
1. znaleźć otrzymany nowy wyraz 3.literowy
2. podać kilka innych wyrazów, które mają ten sam wynik kodowania
Rozwiązanie:
Cz.1. Dany szyfr koduje następująco:
x=3 --> y = 2 * 3 + 5 mod 10 = 11 mod 10 = 1
x=5 --> y = 2 * 5 + 5 mod 10 = 15 mod 10 = 5
x=8 --> y = 2 * 8 + 5 mod 10 = 21 mod 10 = 1
Odpowiedź: Wynik kodowania to ciąg (1,5,1)
Cz.2. Zauważam, że 3 i 8 kodują się na ten sam znak 1. Przez wykonanie tabeli
wyników kodowania wszystkich znaków od 0 do9 poznam wszystkie możliwe
wartości:
0 --> 5, 1 --> 7, 2 --> 9, 3 -->1, 4 --> 3, 5 --> 5, 6 --> 7, 7 --> 9, 8 --> 1, 9 --> 3.
Dochodzę do wniosku, że ten sam wynik kodowania (1,5,1) dadzą wszystkie te
wyrazy, które na pierwszym miejscu mają 3 lub 8, na drugim miejscu mają 0 lub 5 i
na trzecim miejscu mają znowu 3 lub 8, np.
Odpowiedź: Oto przykłady spełniające wymogi polecenia - (3,5,8), (8,0,8), (3,0,8),
(3,5,3).
Zadanie 2. Pokazać przykłady takich par wartości bajtów x, y ze zbioru {0,1}^8,
które spełniają równości
1. Par ( x or y ) = Par ( x ) or Par( y )
2. Par ( x xor y ) = Par( x ) xor Par( y )
Uwagi nie należące do rozwiązania:
1. Zapis ,a^b' oznacza ,a do potęgi b'. Zapis ,a_b' oznacza, że b jest dolnym
indeksem a.
2. Zastosowałem łączniki ,or' i ,xor', które mogą być w zadaniach na egzaminie
zastąpione przez ptaszek (taki jak oznaczający w logice ,lub') oraz krzyżyk w kółku,
odpowiednio. Na niektórych edytorach brak tych symboli. JoD
Rozwiązanie:
Cz.1.
Zgodnie z treścią wykładów przyjmuję, że dla x = (x_1, x_2, . . . , x_8) ,
y = (y_1, y_2, . . ., y_8) operacje ,or' oraz ,xor' dają w wyniku
x or y = (x_1 or y_1, x_2 or y_2, . . . , x_8 or y_8)
x xor y = (x_1 xor y_1, x_2 xor y_2, . . . , x_8 xor y_8)
przy czym tabela działania na zmiennych (0,1)-owych jest taka jak w logice:
1 or 1 = 1 or 0 = 0 or 1 = 1, 0 or 0 = 0
1 xor 1 = 0 xor 0 = 0, 1 xor 0 = 0 xor 1 = 1
Ponadto przyjmuję, że Par jest funkcją, która ciągowi (0,1)-owemu
przyporządkowuje wartość 0, jeśli ilość jedynek jest parzysta, zaś wartość 1, jeśli
ilość jedynek jest nieparzysta. Tak więc aby spełniona pierwsza równość zadania,
parzystość połączonych operacją ,or' ciągów x i y musi być równa większej z
parzystości przypisywanych tym ciągom oddzielnie. Dam więc przykłady trzech
istotnie różnych możliwości:
1.1. . . . gdy lewa strona równa się 0 i oba składniki prawej strony są równe 0, np:
x = (0,1,0,1,0,1,0,1), y = (1,0,1,0,0,0,0,0). Rzeczywiście wtedy mamy x or y =
(1,1,1,1,0,1,0,1) a więc L = Par ( x or y ) = 0 (bo liczba jedynek wynosi 6 czyli że
jest liczbą parzystą). Ponadto Par ( x ) = Par ( y ) = 0 (bo liczby jedynek w x i y są
parzyste - 4 i 2, odpowiednio). Tak więc na prawej stronie mamy ,0 or 0' czyli 0.
Zatem lewa strona i prawa są równe.
1.2. . . . . gdy lewa strona równa się 1 i oba składniki prawej strony są równe 1, np:
x = (0,1,0,1,0,1,0,0), y = (1,1,1,0,0,0,0,0). Rzeczywiście wtedy mamy x or y =
(1,1,1,1,0,1,0,0) a więc L = Par ( x or y ) = 1 (bo liczba jedynek wynosi 5 czyli że
jest liczbą nieparzystą). Ponadto Par ( x ) = Par ( y ) = 1 (bo liczby jedynek w x i y są
nieparzyste - 3 i 3, odpowiednio). Tak więc na prawej stronie mamy ,1 or 1' czyli 1.
Zatem lewa strona i prawa są równe.
1.3. . . . gdy lewa strona równa się 1 i tylko jeden składnik prawej strony jest równy
1, np: x = (0,1,0,1,0,1,0,0), y = (1,0,1,0,0,0,0,0). Rzeczywiście wtedy mamy x or y
= (1,1,1,1,0,1,0,0) a więc L = Par ( x or y ) = 1 (bo liczba jedynek wynosi 5 czyli że
jest liczbą nieparzystą). Ponadto Par ( x ) = 1 (bo liczba jedynek w x wynosi 3) zaś
Par ( y ) = 0 ( bo liczba jedynek wynosi 2). Tak więc na prawej stronie mamy ,1 or 0'
czyli 1. Zatem lewa strona i prawa są równe.
Uwaga: W tym zadaniu można dać przykłady, że równość nie jest spełniona.
Odpowiedź: Przykłady ciągów spełniających równość 1.
x = (0,1,0,1,0,1,0,1), y = (1,0,1,0,0,0,0,0);
x = (0,1,0,1,0,1,0,0), y = (1,1,1,0,0,0,0,0);
x = (0,1,0,1,0,1,0,0), y = (1,0,1,0,0,0,0,0).
Cz.2. Tutaj mamy sytuację inną, gdyż zgodnie z treścią wykładów mamy wzór:
(*)
Par( x_1, x_2, . . . , x_8) = x_1 xor x_2 xor . . . xor x_8
Ponadto poznaliśmy prawo łączności i przemienności operacji ,xor'. Zatem możemy
przekształcić lewa stronę następująco:
L = Par ( x xor y ) = Par ( x_1 xor y_1, x_2 xor y_2, . . . , x_8 xor y_8) =
= (x_1 xor y_1) xor (x_2 xor y_2) xor . . . xor (x_8 xor y_8) =
= ( x_1 xor x_2 xor . . . xor x_8) xor ( y_1 xor y_2 xor . . . xor y_8 )
co na mocy wzoru (*) pozwala stwierdzić, że L = Par( x ) xor Par( y ) a więc, że
Odpowiedź: Lewa strona rowności 2. równa się prawej dla dowolnych x i y ze
zbioru {0,1}^8. Zatem jako przykłady par spełniających można wiąć dowolne pary
ciągów (0,1)-owych o długości 8.
Uwaga (poza rozwiązaniem): Jest oczywiste, że ten dowód stosuje się do tej samej
równości dla ciągów dowolnej długości (niekoniecznie 8).
Zadanie 3. Obliczyć wartość liczbową zmiennej typu SHORT INTEGER c,
wiedząc że c = a or b, gdzie zmienne typu SHORT INTEGER a i b mają wartość
liczbową W( a ) = - 11 oraz W( b ) = 23, odpowiednio.
Rozwiązanie:
Korzystamy ze wzoru, który bajtowi a = ( a_1 , a_2, . . . , a_8) (czyli ciągowi (0,1)owemu ze zbioru {0,1}^8) przyporządkowuje wartość
(*)
W ( a ) := a_2 * 64 + a_3 * 32 + . . . + a_8 * 1 - a_1 * 128
Zatem a_1 = 1 (bo W(a) jest ujemne), zaś a_2 * 64 + a_3 * 32 + . . . + a_8 * 1 = 11 + 128 = 117. Z jednoznaczności rozwinięcia dwójkowego otrzymujemy:
a_2 = 1, a_3 = 1, a_4 = 1, a_5 =0, a_6 = 1, a_7 = 0, a_8 = 1
(sprawdzenie: 64 + 32 + 16 + 0*8 + 4 + 0*2 + 1 = 117). Zatem
a = ( 1, 1, 1, 1, 0, 1, 0, 1).
Podobnie, ze wzoru (*) zasosowanego do b otrzymamy b_1 = 0 (bo W( b ) jest
dodatnie) i konsekwentnie
b_2 = 0, b_3 = 0, b_4 = 1, b_5 =0, b_6 = 1, b_7 = 1, b_8 = 1
(sprawdzenie: W( b ) = 0*64 + 0*32 + 16 + 0*8 + 4 + 2 + 1 - 0*128 = 23). Zatem
b = ( 0, 0, 0, 1, 0, 1, 1, 1).
Operacja ,or' zasosowana do a i b daje c = (1, 1, 1, 1, 0, 1, 1, 1). Korzystając
jeszcze raz ze wzoru (*) tym razem zastosowanego do c otrzymujemy
W( c ) = 1*64 + 1*32 + 1*16 + 0*8 + 1*4 + 1*2 + 1*1 - 1*128 = -7.
Odpowiedź: W( c ) = -7.
Zadanie 4. Udowodnić, że ciągi liczbowe S_n oraz T_n podane poniższymi
równościami spełniają ten sam związek rekurencyjny. Korzystając z tego, że S_1 =
T_1 wywnioskować stąd rowność S_n = T_n dla wszystkich n ze zbioru {1, 2, 3,
. . .}. Oto równości definiujące:
S_n := 1 + 2 + . . . + n,
T_n := 0.5 * n * (n+1), dla n = 1, 2, . . . .
Cz.1. Odpowiedź: Dla znalezienia wyrażenia na S_{n+1}
zapiszmy
przy pomocy
S_n
S_{n+1} = 1 + 2 + . . . + n + (n+1)
S_n = 1 + 2 + . . . n,
a więc mamy:
(*)
S_{n+1} = S_n + (n+1).
Dla znalezienia wyrażenia na T_{n+1} przy pomocy T_n zapiszmy
T_{n+1} = 0.5 * (n + 1) * ((n+1) + 1) = 0.5 * (n+1) * (n+2)
T_n = 0.5 * n * ( n+1 ) ,
a więc, wyłączając wspólny czynnik przed nawias, otrzymamy:
T_{n+1} - T_n = 0.5 * (n + 1) [ ( n+2) - n] = 0.5 * (n+1) * 2 = n+1,
czyli:
(**)
T_{n+1} = T_n + (n+1).
Ponieważ formuły (*) i (**) są takie same, więc rzeczywiście ciągi S_n i T_n
spełniają te same związki rekurencyjne.
Cz.2. Odpowiedź: Ponieważ S_1 = 1, T_1 = 0.5 * 1 * 2 =1, więc rzeczywiście S_1
= T_1. Ze wzorów rekurencyjnych udowodnionych w cz. 1 wynika, że dla każdego n
ze zbioru {1,2,3 . . .} mamy
S_n = T_n implikuje S_{n+1} = T_{n+1}
Na mocy postulatu o indukcji matematycznej zupełmej wnosimy, że
S_n = T_n dla każdego n ze zbioru liczb naturalnych {1, 2, 3, . . . }
Zadanie 5. Zbudować sieć boolowską obliczającą wartości bitów z_1, z_2 (ze
zbioru {0, 1} tak, aby dla dowwolnych a, b, c spełniona była równość liczb
naturalnych
( z_1, z_2 )_2 = a + b + c.
Uwaga: lewa strona oznacza wartość liczby zapisanej w systemie dwójkowym przy
pomocy dwóch bitów, tj. liczbę z_1 * 2 + z_2 * 1 .
Odpowiedź:
Ograniczę się do sugestii, aby uzyskać ją z notatek, które prowadzą do konstrukcji
tzw. pełnego sumatora FULL ADDER (dla trzech bitów). Jako dane wejściowe
wziąć zmienne boolowskie a, b i c, zaś jako wyjściowe z_1 i z_2 . Ubóstwo
dostępnej mi grafiki nie pozwala na sporządzenie szkicu tej odpowiedzi.
Zadanie 6. Odwrócić szyfr liniowy y = 5 * x + 2 w pierścieniu Z_9 .
Rozwiązanie: Dany wzór na y w zależności od x należy traktować jako równość w
pierścieniu Z_9 , którego elementami są reszty z dzielenia przez 9 czyli liczby 0,
1, 2, 3, 4, 5, 6, 7, 8 z dodawaniem i mnożeniem modulo 9. Ponieważ liczba 5 jest
pierwsza względem 9, więc ma odwrotność w tym pierścieniu, która można
znaleźć przez wypisanie tabelki mnożenia. Spośród wartości iloczynu przez 5, czyli
z liczb 0, 5, 10, 15, 20, 25, 30, 35, 40 tylko 10 ma wartość równą 1 modulo 9
czyli, że 2 jest odwrotnością 5 w pierścieniu Z_9. Mnożąc równość definiującą
szyfr stronami przez 2 (mod 9) otrzymujemy:
2 * y = 2 * 5 * x + 2 * 2 (mod 9)
2 * y = 1 * x + 4 (mod 9)
x = 2 * y - 4 (mod 9)
i ostatecznie
Odpowiedź: x = 2 * y + 5 (w pierścieniu Z_9).
Zadanie 7. Znaleźć wszystkie liczby całkowite a spełniające warunki
a mod 13 = 4, a mod 8 = 5, a mod 3 = 0.
Rozwiązanie: Zastosujemy chińskie twierdzenie o resztach. W naszym przypadku
mamy, że dzielniki 13, 8 oraz 3 są względnie pierwsze, tzn. żadne dwa nie mają
wspólnego dzielnika. Zatem wśród liczb ze zbioru {0, 1, 2, . . . , M - 1} istnieje
dokładnie jedna liczba X posiadająca wymienione reszty
4, 5, oraz 0,
odpowiednio, gdzie
M = 13 * 8 * 3 = 312. Ponadto, każda inna liczba przy
dzieleniu przez 312 daje tę samą resztę. Zatem zbiór poszukiwanych liczb to
liczby postaci X + k * 312, gdzie k to dowolna liczba ze zbioru liczb
całkowitych Z := { . . ., -1, 0, 1, 2, . . . } .
Obliczanie X . Posłużymy się algorytmem podanym na wykałdzie:
definiujemy
M_1 = 8 * 3 = 24,
M_2 = 13 * 3 = 39,
M_3 = 13 * 8 = 104.
obliczamy
L_1 = M_1 mod 13 = 11,
L_2 = M_2 mod 8 = 7,
L_3 = M_3 mod 3 = 2
obliczamy odwrotności:
N_1 = ODWR(L_1, mod 13) = . . . = 6 (bo 6 * 11 = 5 * 13 +1 = 1 (mod 13) )
N_2 = ODWR(L_2, mod 8) = . . . = 7 (bo 7 * 7 = 6 * 8 + 1 = 1 (mod 8) )
N_3 = ODWR(L_3, mod 3) = . . . = 2 (bo 2 * 2 = 1 * 3 + 1 = 1 (mod 3) )
obliczamy liczbę:
Y = 4 * N_1* M_1 + 5 * N_2 * M_2 + 0 * N_3 * M_3 = 4 * 6 * 24 + 5* 7 *39
= 24 * 24 + 35 * 39 = 1941.
obliczamy jej resztę z dzielenia przez M = 312:
X = Y mod 312 = 69 (bo 1941 = 6 * 312 + 69).
Sprawdzenie: 69 = 3 * 13 + 4 czyli 69 mod 13 = 4,
69 = 8 * 8 +5 czyli 69 mod 8 = 5
oraz
69 = 13 * 3
czyli 69 mod 3 = 0.
Odpowiedź: Zbiór poszukiwanych liczb to wszystkie liczby postaci X + k * 312,
gdzie X = 69 zaś k to dowolna liczba ze zbioru liczb całkowitych Z := { . . ., -1, 0,
1, 2, . . . } .
Zadanie 8. Przy pomocy algorytmu rosyjskich chłopów obliczyć iloczyn 245 * 167.
Odpowiedź: Tworzymy dwie kolumny, z których pierwsza w pierwszym wierszu
zawiera 245 a druga w pierwszym wierszu zawiera 167. Kolejne wiersze powstają z
dzielenia pierwszej kolumny całkowicie liczbowo przez dwa i mnożenie drugiej
kolumny przez 2:
245 167
122 334
61 668
835
30 1336
15 2672 3507
7 5344 8851
3 10688 19539
1 21376 40915
Dodajemy te wyrazy z drugiej kolumny, które stoją obok liczb nieparzystych (w
pierwszej kolumnie): 245 * 167 = 167 + 668 + 2672 + 5344 + 10688 + 21376 =
40915.
PRZYKŁADY DALSZYCH ZADAŃ NA FUNKCJE TWORZĄCE
Download