{"id":"informatyka-2015-maj-matura-rozszerzona/zad/3.1","paper_id":"informatyka-2015-maj-matura-rozszerzona","number":"3.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2015,"month":"maj","level":"rozszerzona","text":"Zadanie 3.1. (0-2)\nUzupełnij poniższą tabelę ilustrującą wykonanie funkcji RozszerzonyEuklides(a, b) dla\ndanych a = 188, b = 12.\ni - nr wywołania\nWartość a w i-tym\nwywołaniu\nWartość b w i-tym\nwywołaniu\nWynik x\nWynik y\n1\n188\n12\n2\n3\n4\n0\n1\n0\nMiejsce na obliczenia.\nMIN_1R","answer":null,"answer_text":"Zadanie 3.1. (0-2)\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji z wykorzystaniem\nkomputera, z zastosowaniem podejścia\nalgorytmicznego.\nZdający stosuje podejście algorytmiczne\ndo rozwiązywania problemu (5.2.).\nZdający opracowuje i przeprowadza wszystkie etapy\nprowadzące do otrzymania poprawnego rozwiązania\nproblemu: od sformułowania specyfikacji problemu\npo testowa nie rozwiązania (5.7.).\nPoprawna odpowiedź\nNumer\nwywołania\nWartość a\nWartość b\nWynik x\nWynik y\n1\n188\n12\n-1\n16\n2\n12\n8\n1\n-1\n3\n8\n4\n0\n1\n4\n4\n0\n1\n0\nSchemat punktowania\n2 p. - za prawidłowe uzupełnienie kolumn z wartościami a i b oraz za prawidłowe uzupełnienie kolumn\nWynik x i Wynik y.\n1 p. - za prawidłowe uzupełnienie kolumn z wartościami a i b albo za prawidłowe uzupełnienie kolumn\nWynik x i Wynik y.\n0 p. - za odpowiedź niepełną lub błędną albo brak odpowiedzi.","solution":"## Poprawna odpowiedź\n\n| i | a | b | x | y |\n| 1 | 188 | 12 | **-1** | **16** |\n| 2 | **12** | **8** | **1** | **-1** |\n| 3 | **8** | **4** | **0** | **1** |\n| 4 | **4** | **0** | **1** | **0** |\n\nNWD(188, 12) = 4 = (-1)·188 + 16·12.\n\n## Sposób 1 - rozwijanie rekurencji od dołu (pre-order) i z powrotem\n\n**Krok 1: zejście rekurencji (oblicz a, b dla każdego wywołania)**\n\ni=1: a=188, b=12, r = 188 mod 12 = 8 (bo 188 = 15·12 + 8). Wywołaj RozszerzonyEuklides(12, 8).\ni=2: a=12, b=8, r = 12 mod 8 = 4. Wywołaj RozszerzonyEuklides(8, 4).\ni=3: a=8, b=4, r = 8 mod 4 = 0. Wywołaj RozszerzonyEuklides(4, 0).\ni=4: a=4, b=0 - przypadek bazowy, zwracamy (x, y) = (1, 0).\n\n**Krok 2: powrót z rekurencji (oblicz x, y)**\n\ni=4: (x, y) = (1, 0). NWD(4, 0) = 4 = 1·4 + 0·0. ✓\n\ni=3: a=8, b=4, dzielnik (a div b) = 8 div 4 = 2. Z rekurencji (x', y') = (1, 0).\n- x = y' = **0**\n- y = x' - (a div b)·y' = 1 - 2·0 = **1**\n- Sprawdzenie: NWD(8, 4) = 4 = 0·8 + 1·4 ✓\n\ni=2: a=12, b=8, (a div b) = 12 div 8 = 1. (x', y') = (0, 1).\n- x = y' = **1**\n- y = x' - 1·y' = 0 - 1·1 = **-1**\n- Sprawdzenie: NWD(12, 8) = 4 = 1·12 + (-1)·8 = 12 - 8 = 4 ✓\n\ni=1: a=188, b=12, (a div b) = 188 div 12 = 15. (x', y') = (1, -1).\n- x = y' = **-1**\n- y = x' - 15·y' = 1 - 15·(-1) = 1 + 15 = **16**\n- Sprawdzenie: NWD(188, 12) = 4 = (-1)·188 + 16·12 = -188 + 192 = **4** ✓\n\n## Sposób 2 - implementacja Python rekurencyjna\n\n```python\ndef rozszerzony_euklides(a, b):\nif b == 0:\nreturn (1, 0)\nr = a % b\nx_prim, y_prim = rozszerzony_euklides(b, r)\nx = y_prim\ny = x_prim - (a // b) * y_prim\nreturn (x, y)\n\nx, y = rozszerzony_euklides(188, 12)\nprint(f'x = {x}, y = {y}') # x = -1, y = 16\nprint(f'sprawdzenie: {x}*188 + {y}*12 = {x*188 + y*12}') # 4\n\nIteracje (trace):\nWywołanie(188, 12): r = 8\nWywołanie(12, 8): r = 4\nWywołanie(8, 4): r = 0\nWywołanie(4, 0): return (1, 0)\nPowrót do (8,4): x = 0, y = 1 - 2*0 = 1 → return (0, 1)\nPowrót do (12,8): x = 1, y = 0 - 1*1 = -1 → return (1, -1)\nPowrót do (188,12): x = -1, y = 1 - 15*(-1) = 16 → return (-1, 16)\n\n## Reference informatyczny - Rozszerzony algorytm Euklidesa\n\n> Reference - Extended Euclidean Algorithm:\n> - Klasyczny Euklides: NWD(a, b) = NWD(b, a mod b), bazowy NWD(a, 0) = a.\n> - **Rozszerzony Euklides** dodaje obliczenie x, y takich że a·x + b·y = NWD(a, b) (tożsamość Bézouta).\n> - Algorytm rekurencyjny: pre-order zejście, post-order powrót z formułami:\n> - x = y'\n> - y = x' - (a div b)·y'\n> - Zastosowania: odwracanie modularne (RSA, kryptografia), rozwiązywanie równań Diofantosa.\n> - Złożoność: O(log min(a, b)) - tyle samo co klasyczny Euklides.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 3.1, max 2 pkt):\n> - **2 pkt** - poprawne uzupełnienie kolumn a i b ORAZ kolumn x i y\n> - **1 pkt** - poprawne tylko a i b ALBO tylko x i y\n> - **0 pkt** - niepełna lub błędna albo brak\n\n## Typowe pułapki\n\n- Pomylenie a div b (dzielenie całkowite) z a / b (zmiennoprzecinkowe). 188 div 12 = 15, nie 15.666.\n- Niepoprawne stosowanie formuły y = x' - (a div b)·y' - łatwo zapomnieć minus.\n- Pomylenie x i x' (apostrof oznacza wartość z rekurencji niżej, bez apostrofu - z aktualnego poziomu).\n- Brak sprawdzenia: a·x + b·y musi się równać NWD.\n- Pomyłka w `a mod b` dla 188, 12 - to 8 (188 = 15·12 + 8).\n\n## Złożoność obliczeniowa\n\n- Liczba wywołań rekurencyjnych: O(log min(a, b)) (twierdzenie Lamé).\n- Pamięć: O(log min(a, b)) (stos rekurencji).\n- Czas: **O(log min(a, b))**.","image":"img/informatyka-2015-maj-matura-rozszerzona/zad-3.1.webp","solution_image":null,"topics":null,"page_from":8,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2015 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 3.1. (0-2)<br>Uzupełnij poniższą tabelę ilustrującą wykonanie funkcji RozszerzonyEuklides(a, b) dla<br>danych a = 188, b = 12.<br>i - nr wywołania<br>Wartość a w i-tym<br>wywołaniu<br>Wartość b w i-tym<br>wywołaniu<br>Wynik x<br>Wynik y<br>1<br>188<br>12<br>2<br>3<br>4<br>0<br>1<br>0<br>Miejsce na obliczenia.<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 3.1. (0-2)<br>III. Rozwiązywanie problemów<br>i podejmowanie decyzji z wykorzystaniem<br>komputera, z zastosowaniem podejścia<br>algorytmicznego.<br>Zdający stosuje podejście algorytmiczne<br>do rozwiązywania problemu (5.2.).<br>Zdający opracowuje i przeprowadza wszystkie etapy<br>prowadzące do otrzymania poprawnego rozwiązania<br>problemu: od sformułowania specyfikacji problemu<br>po testowa nie rozwiązania (5.7.).<br>Poprawna odpowiedź<br>Numer<br>wywołania<br>Wartość a<br>Wartość b<br>Wynik x<br>Wynik y<br>1<br>188<br>12<br>-1<br>16<br>2<br>12<br>8<br>1<br>-1<br>3<br>8<br>4<br>0<br>1<br>4<br>4<br>0<br>1<br>0<br>Schemat punktowania<br>2 p. - za prawidłowe uzupełnienie kolumn z wartościami a i b oraz za prawidłowe uzupełnienie kolumn<br>Wynik x i Wynik y.<br>1 p. - za prawidłowe uzupełnienie kolumn z wartościami a i b albo za prawidłowe uzupełnienie kolumn<br>Wynik x i Wynik y.<br>0 p. - za odpowiedź niepełną lub błędną albo brak odpowiedzi.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p>| i | a | b | x | y |<br>| 1 | 188 | 12 | <strong>-1</strong> | <strong>16</strong> |<br>| 2 | <strong>12</strong> | <strong>8</strong> | <strong>1</strong> | <strong>-1</strong> |<br>| 3 | <strong>8</strong> | <strong>4</strong> | <strong>0</strong> | <strong>1</strong> |<br>| 4 | <strong>4</strong> | <strong>0</strong> | <strong>1</strong> | <strong>0</strong> |</p>\n<p>NWD(188, 12) = 4 = (-1)·188 + 16·12.</p>\n<h4>Sposób 1 - rozwijanie rekurencji od dołu (pre-order) i z powrotem</h4>\n<p><strong>Krok 1: zejście rekurencji (oblicz a, b dla każdego wywołania)</strong></p>\n<p>i=1: a=188, b=12, r = 188 mod 12 = 8 (bo 188 = 15·12 + 8). Wywołaj RozszerzonyEuklides(12, 8).<br>i=2: a=12, b=8, r = 12 mod 8 = 4. Wywołaj RozszerzonyEuklides(8, 4).<br>i=3: a=8, b=4, r = 8 mod 4 = 0. Wywołaj RozszerzonyEuklides(4, 0).<br>i=4: a=4, b=0 - przypadek bazowy, zwracamy (x, y) = (1, 0).</p>\n<p><strong>Krok 2: powrót z rekurencji (oblicz x, y)</strong></p>\n<p>i=4: (x, y) = (1, 0). NWD(4, 0) = 4 = 1·4 + 0·0. ✓</p>\n<p>i=3: a=8, b=4, dzielnik (a div b) = 8 div 4 = 2. Z rekurencji (x&#x27;, y&#x27;) = (1, 0).</p>\n<ul><li>x = y&#x27; = <strong>0</strong></li><li>y = x&#x27; - (a div b)·y&#x27; = 1 - 2·0 = <strong>1</strong></li><li>Sprawdzenie: NWD(8, 4) = 4 = 0·8 + 1·4 ✓</li></ul>\n<p>i=2: a=12, b=8, (a div b) = 12 div 8 = 1. (x&#x27;, y&#x27;) = (0, 1).</p>\n<ul><li>x = y&#x27; = <strong>1</strong></li><li>y = x&#x27; - 1·y&#x27; = 0 - 1·1 = <strong>-1</strong></li><li>Sprawdzenie: NWD(12, 8) = 4 = 1·12 + (-1)·8 = 12 - 8 = 4 ✓</li></ul>\n<p>i=1: a=188, b=12, (a div b) = 188 div 12 = 15. (x&#x27;, y&#x27;) = (1, -1).</p>\n<ul><li>x = y&#x27; = <strong>-1</strong></li><li>y = x&#x27; - 15·y&#x27; = 1 - 15·(-1) = 1 + 15 = <strong>16</strong></li><li>Sprawdzenie: NWD(188, 12) = 4 = (-1)·188 + 16·12 = -188 + 192 = <strong>4</strong> ✓</li></ul>\n<h4>Sposób 2 - implementacja Python rekurencyjna</h4>\n<p>```python<br>def rozszerzony_euklides(a, b):<br>if b == 0:<br>return (1, 0)<br>r = a % b<br>x_prim, y_prim = rozszerzony_euklides(b, r)<br>x = y_prim<br>y = x_prim - (a // b) * y_prim<br>return (x, y)</p>\n<p>x, y = rozszerzony_euklides(188, 12)<br>print(f&#x27;x = {x}, y = {y}&#x27;) # x = -1, y = 16<br>print(f&#x27;sprawdzenie: {x}<em>188 + {y}</em>12 = {x<em>188 + y</em>12}&#x27;) # 4</p>\n<p>Iteracje (trace):<br>Wywołanie(188, 12): r = 8<br>Wywołanie(12, 8): r = 4<br>Wywołanie(8, 4): r = 0<br>Wywołanie(4, 0): return (1, 0)<br>Powrót do (8,4): x = 0, y = 1 - 2*0 = 1 → return (0, 1)<br>Powrót do (12,8): x = 1, y = 0 - 1*1 = -1 → return (1, -1)<br>Powrót do (188,12): x = -1, y = 1 - 15*(-1) = 16 → return (-1, 16)</p>\n<h4>Reference informatyczny - Rozszerzony algorytm Euklidesa</h4>\n<blockquote>Reference - Extended Euclidean Algorithm:<br>- Klasyczny Euklides: NWD(a, b) = NWD(b, a mod b), bazowy NWD(a, 0) = a.<br>- <strong>Rozszerzony Euklides</strong> dodaje obliczenie x, y takich że a·x + b·y = NWD(a, b) (tożsamość Bézouta).<br>- Algorytm rekurencyjny: pre-order zejście, post-order powrót z formułami:<br>- x = y&#x27;<br>- y = x&#x27; - (a div b)·y&#x27;<br>- Zastosowania: odwracanie modularne (RSA, kryptografia), rozwiązywanie równań Diofantosa.<br>- Złożoność: O(log min(a, b)) - tyle samo co klasyczny Euklides.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 3.1, max 2 pkt):<br>- <strong>2 pkt</strong> - poprawne uzupełnienie kolumn a i b ORAZ kolumn x i y<br>- <strong>1 pkt</strong> - poprawne tylko a i b ALBO tylko x i y<br>- <strong>0 pkt</strong> - niepełna lub błędna albo brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li>Pomylenie a div b (dzielenie całkowite) z a / b (zmiennoprzecinkowe). 188 div 12 = 15, nie 15.666.</li><li>Niepoprawne stosowanie formuły y = x&#x27; - (a div b)·y&#x27; - łatwo zapomnieć minus.</li><li>Pomylenie x i x&#x27; (apostrof oznacza wartość z rekurencji niżej, bez apostrofu - z aktualnego poziomu).</li><li>Brak sprawdzenia: a·x + b·y musi się równać NWD.</li><li>Pomyłka w <code>a mod b</code> dla 188, 12 - to 8 (188 = 15·12 + 8).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Liczba wywołań rekurencyjnych: O(log min(a, b)) (twierdzenie Lamé).</li><li>Pamięć: O(log min(a, b)) (stos rekurencji).</li><li>Czas: <strong>O(log min(a, b))</strong>.</li></ul>"}]}