{"id":"informatyka-2015-maj-matura-rozszerzona/zad/3.2","paper_id":"informatyka-2015-maj-matura-rozszerzona","number":"3.2","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2015,"month":"maj","level":"rozszerzona","text":"Zadanie 3.2. (0-3)\nUzupełnij poniższą rekurencyjną funkcję obliczania pary liczb (x, y) dla danych liczb a, b.\nSpecyfikacja:\nDane:\nliczby całkowite a > 0 i b ≥ 0\nWynik:\npara liczb całkowitych (\n)\n,x y , dla których\n( , ) =\n⋅\n+ ⋅\nNWD a b\na x\nb y\nRozszerzonyEuklides(a, b):\nKrok 1.\nJeśli b = 0, podaj jako wynik funkcji parę (1, 0) i zakończ jej wykonywanie.\nKrok 2.\nr ← a mod b\nKrok 3.\n(x, y) ← RozszerzonyEuklides( , )\nKrok 4.\nPodaj jako wynik parę ( , ).\nMiejsce na obliczenia.\nWypełnia\negzaminator\nNr zadania\n3.1.\n3.2.\nMaks. liczba pkt.\n2\n3\nUzyskana liczba pkt.\nMIN_1R\nBRUDNOPIS (nie podlega ocenie)","answer":null,"answer_text":"Zadanie 3.2. (0-3)\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji z wykorzystaniem\nkomputera, z zastosowaniem podejścia\nalgorytmicznego.\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.).\nZdający stosuje rekurencję w prostych sytuacjach\nproblemowych (5.9.).\nPoprawna odpowiedź\nKrok 3: (b, r).\nKrok 4: ( y, x - (a div b) • y).\nSchemat punktowania\n3 p. - za prawidłowo wypełnione pola w krokach 3 i 4 algorytmu.\n2 p. - za prawidłowo wypełnione pola w kroku 4 algorytmu.\n1 p. - za prawidłowo wypełnione pola w kroku 3 algorytmu albo za odpowiedź (y', x' - (a div b) • y').\n0 p. - za odpowiedź niepełną lub błędną albo za brak odpowiedzi.\nCzęść II","solution":"## Poprawna odpowiedź\n\n**Krok 3:** `(x, y) ← RozszerzonyEuklides(b, r)`\n\n**Krok 4:** `Podaj jako wynik parę (y, x - (a div b)·y).`\n\n## Sposób 1 - wyprowadzenie ze wzoru w treści zadania\n\nW treści zadania mamy: dla x', y' takich, że NWD(b, r) = b·x' + r·y':\n- x = y'\n- y = x' - (a div b)·y'\n\n**Krok 3:** wywołujemy rekurencyjnie RozszerzonyEuklides z argumentami (b, r) - bo r = a mod b. To zwraca parę liczb takich, że b · (pierwsza) + r · (druga) = NWD(b, r) = NWD(a, b).\n\nWynik rekurencji w treści to (x', y'). W algorytmie używamy zmiennych (x, y), więc oznaczamy:\n- po wywołaniu RozszerzonyEuklides(b, r) zmienna `x` = x' (pierwsza zwrócona) oraz `y` = y' (druga zwrócona).\n\n**Krok 4:** zwracamy parę będącą NOWYM (x, y) dla wywołania (a, b):\n- nowe X = stare y' = `y`\n- nowe Y = stare x' - (a div b) · stare y' = `x - (a div b)·y`\n\nZatem zwracamy: **(y, x - (a div b)·y)**.\n\n## Sposób 2 - weryfikacja na konkretnym przykładzie (a=188, b=12)\n\nUżywając algorytmu:\nRozszerzonyEuklides(188, 12):\nr = 188 mod 12 = 8\n(x, y) ← RozszerzonyEuklides(12, 8)\n// zejście\nreturn (1, -1)\n// teraz x = 1, y = -1\nreturn (-1, 1 - 15*(-1)) = (-1, 16)\n\nSprawdzenie: 188·(-1) + 12·16 = -188 + 192 = 4 = NWD(188, 12). ✓\n\n**Pełny pseudokod (z wypełnionymi pustymi miejscami):**\nRozszerzonyEuklides(a, b):\nKrok 1. Jeśli b = 0, podaj jako wynik funkcji parę (1, 0) i zakończ.\nKrok 2. r ← a mod b\nKrok 3. (x, y) ← RozszerzonyEuklides(b, r)\nKrok 4. Podaj jako wynik parę (y, x - (a div b)·y).\n\n**Python:**\n```python\ndef rozszerzony_euklides(a, b):\nif b == 0:\nreturn (1, 0)\nr = a % b\nx, y = rozszerzony_euklides(b, r)\nreturn (y, x - (a // b) * y)\n\nprint(rozszerzony_euklides(188, 12)) # (-1, 16)\nprint(rozszerzony_euklides(231, 30)) # (3, -23)? sprawdzenie 3*231 + (-23)*30 = 693 - 690 = 3 = NWD\n\n## Reference informatyczny - równanie Bézouta i tożsamość\n\n> Reference - Bezout's Identity:\n> - Dla każdych całkowitych a, b istnieją całkowite x, y takie, że a·x + b·y = NWD(a, b).\n> - Algorytm rozszerzony Euklidesa znajduje JEDNĄ taką parę (x, y). Inne rozwiązania mają postać (x + k·b/d, y - k·a/d), gdzie d = NWD(a,b).\n> - Konstrukcja rekurencyjna: bazowy NWD(a, 0) = a = 1·a + 0·0 → (1, 0). Krok rekurencyjny opiera się na: jeśli NWD(b, r) = b·x' + r·y' to NWD(a,b) = a·y' + b·(x' - (a div b)·y').\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 3.2, max 3 pkt):\n> - **3 pkt** - poprawnie wypełnione kroki 3 ORAZ 4\n> - **2 pkt** - poprawnie wypełniony tylko krok 4\n> - **1 pkt** - poprawnie wypełniony tylko krok 3 ALBO odpowiedź (y', x' - (a div b)·y')\n> - **0 pkt** - niepełna lub błędna albo brak\n\n## Typowe pułapki\n\n- Krok 3: podanie `(b, a mod b)` zamiast `(b, r)` - formalnie OK, ale w kontekście kroku 2 `r = a mod b`, więc lepiej napisać `(b, r)`.\n- Krok 4: pomylenie kolejności (x, y) - pierwsze powinno być stare `y` (nie `x`!).\n- Krok 4: zapomnienie minus przy (a div b)·y.\n- Pomylenie a div b z a mod b - dwie różne wartości!\n- W niektórych źródłach: zwracanie pary (y', x' - (a div b)·y') - wtedy oznaczenia (x, y) ↔ (x', y'). Klucz CKE akceptuje obydwa zapisy.\n\n## Złożoność obliczeniowa\n\n- Czas: O(log min(a, b)) (jak klasyczny Euklides).\n- Pamięć: O(log min(a, b)) (stos rekurencji).","image":"img/informatyka-2015-maj-matura-rozszerzona/zad-3.2.webp","solution_image":null,"topics":null,"page_from":9,"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.2. (0-3)<br>Uzupełnij poniższą rekurencyjną funkcję obliczania pary liczb (x, y) dla danych liczb a, b.<br>Specyfikacja:<br>Dane:<br>liczby całkowite a &gt; 0 i b ≥ 0<br>Wynik:<br>para liczb całkowitych (<br>)<br>,x y , dla których<br>( , ) =<br>⋅</p>\n<ul><li>⋅</li></ul>\n<p>NWD a b<br>a x<br>b y<br>RozszerzonyEuklides(a, b):<br>Krok 1.<br>Jeśli b = 0, podaj jako wynik funkcji parę (1, 0) i zakończ jej wykonywanie.<br>Krok 2.<br>r ← a mod b<br>Krok 3.<br>(x, y) ← RozszerzonyEuklides( , )<br>Krok 4.<br>Podaj jako wynik parę ( , ).<br>Miejsce na obliczenia.<br>Wypełnia<br>egzaminator<br>Nr zadania<br>3.1.<br>3.2.<br>Maks. liczba pkt.<br>2<br>3<br>Uzyskana liczba pkt.<br>MIN_1R<br>BRUDNOPIS (nie podlega ocenie)</p>","answer_text_html":"<p>Zadanie 3.2. (0-3)<br>III. Rozwiązywanie problemów<br>i podejmowanie decyzji z wykorzystaniem<br>komputera, z zastosowaniem podejścia<br>algorytmicznego.<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>Zdający stosuje rekurencję w prostych sytuacjach<br>problemowych (5.9.).<br>Poprawna odpowiedź<br>Krok 3: (b, r).<br>Krok 4: ( y, x - (a div b) • y).<br>Schemat punktowania<br>3 p. - za prawidłowo wypełnione pola w krokach 3 i 4 algorytmu.<br>2 p. - za prawidłowo wypełnione pola w kroku 4 algorytmu.<br>1 p. - za prawidłowo wypełnione pola w kroku 3 algorytmu albo za odpowiedź (y&#x27;, x&#x27; - (a div b) • y&#x27;).<br>0 p. - za odpowiedź niepełną lub błędną albo za brak odpowiedzi.<br>Część II</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Krok 3:</strong> <code>(x, y) ← RozszerzonyEuklides(b, r)</code></p>\n<p><strong>Krok 4:</strong> <code>Podaj jako wynik parę (y, x - (a div b)·y).</code></p>\n<h4>Sposób 1 - wyprowadzenie ze wzoru w treści zadania</h4>\n<p>W treści zadania mamy: dla x&#x27;, y&#x27; takich, że NWD(b, r) = b·x&#x27; + r·y&#x27;:</p>\n<ul><li>x = y&#x27;</li><li>y = x&#x27; - (a div b)·y&#x27;</li></ul>\n<p><strong>Krok 3:</strong> wywołujemy rekurencyjnie RozszerzonyEuklides z argumentami (b, r) - bo r = a mod b. To zwraca parę liczb takich, że b · (pierwsza) + r · (druga) = NWD(b, r) = NWD(a, b).</p>\n<p>Wynik rekurencji w treści to (x&#x27;, y&#x27;). W algorytmie używamy zmiennych (x, y), więc oznaczamy:</p>\n<ul><li>po wywołaniu RozszerzonyEuklides(b, r) zmienna <code>x</code> = x&#x27; (pierwsza zwrócona) oraz <code>y</code> = y&#x27; (druga zwrócona).</li></ul>\n<p><strong>Krok 4:</strong> zwracamy parę będącą NOWYM (x, y) dla wywołania (a, b):</p>\n<ul><li>nowe X = stare y&#x27; = <code>y</code></li><li>nowe Y = stare x&#x27; - (a div b) · stare y&#x27; = <code>x - (a div b)·y</code></li></ul>\n<p>Zatem zwracamy: <strong>(y, x - (a div b)·y)</strong>.</p>\n<h4>Sposób 2 - weryfikacja na konkretnym przykładzie (a=188, b=12)</h4>\n<p>Używając algorytmu:<br>RozszerzonyEuklides(188, 12):<br>r = 188 mod 12 = 8<br>(x, y) ← RozszerzonyEuklides(12, 8)<br>// zejście<br>return (1, -1)<br>// teraz x = 1, y = -1<br>return (-1, 1 - 15*(-1)) = (-1, 16)</p>\n<p>Sprawdzenie: 188·(-1) + 12·16 = -188 + 192 = 4 = NWD(188, 12). ✓</p>\n<p><strong>Pełny pseudokod (z wypełnionymi pustymi miejscami):</strong><br>RozszerzonyEuklides(a, b):<br>Krok 1. Jeśli b = 0, podaj jako wynik funkcji parę (1, 0) i zakończ.<br>Krok 2. r ← a mod b<br>Krok 3. (x, y) ← RozszerzonyEuklides(b, r)<br>Krok 4. Podaj jako wynik parę (y, x - (a div b)·y).</p>\n<p><strong>Python:</strong><br>```python<br>def rozszerzony_euklides(a, b):<br>if b == 0:<br>return (1, 0)<br>r = a % b<br>x, y = rozszerzony_euklides(b, r)<br>return (y, x - (a // b) * y)</p>\n<p>print(rozszerzony_euklides(188, 12)) # (-1, 16)<br>print(rozszerzony_euklides(231, 30)) # (3, -23)? sprawdzenie 3<em>231 + (-23)</em>30 = 693 - 690 = 3 = NWD</p>\n<h4>Reference informatyczny - równanie Bézouta i tożsamość</h4>\n<blockquote>Reference - Bezout&#x27;s Identity:<br>- Dla każdych całkowitych a, b istnieją całkowite x, y takie, że a·x + b·y = NWD(a, b).<br>- Algorytm rozszerzony Euklidesa znajduje JEDNĄ taką parę (x, y). Inne rozwiązania mają postać (x + k·b/d, y - k·a/d), gdzie d = NWD(a,b).<br>- Konstrukcja rekurencyjna: bazowy NWD(a, 0) = a = 1·a + 0·0 → (1, 0). Krok rekurencyjny opiera się na: jeśli NWD(b, r) = b·x&#x27; + r·y&#x27; to NWD(a,b) = a·y&#x27; + b·(x&#x27; - (a div b)·y&#x27;).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 3.2, max 3 pkt):<br>- <strong>3 pkt</strong> - poprawnie wypełnione kroki 3 ORAZ 4<br>- <strong>2 pkt</strong> - poprawnie wypełniony tylko krok 4<br>- <strong>1 pkt</strong> - poprawnie wypełniony tylko krok 3 ALBO odpowiedź (y&#x27;, x&#x27; - (a div b)·y&#x27;)<br>- <strong>0 pkt</strong> - niepełna lub błędna albo brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li>Krok 3: podanie <code>(b, a mod b)</code> zamiast <code>(b, r)</code> - formalnie OK, ale w kontekście kroku 2 <code>r = a mod b</code>, więc lepiej napisać <code>(b, r)</code>.</li><li>Krok 4: pomylenie kolejności (x, y) - pierwsze powinno być stare <code>y</code> (nie <code>x</code>!).</li><li>Krok 4: zapomnienie minus przy (a div b)·y.</li><li>Pomylenie a div b z a mod b - dwie różne wartości!</li><li>W niektórych źródłach: zwracanie pary (y&#x27;, x&#x27; - (a div b)·y&#x27;) - wtedy oznaczenia (x, y) ↔ (x&#x27;, y&#x27;). Klucz CKE akceptuje obydwa zapisy.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Czas: O(log min(a, b)) (jak klasyczny Euklides).</li><li>Pamięć: O(log min(a, b)) (stos rekurencji).</li></ul>"}]}