Zadanie 1. Wytwórnia mleka czekoladowego

Do produkcji mleka czekoladowego używa się wielu rodzajów kakao. Rodzaje te opisane są liczbami naturalnymi. Receptura jest ściśle chroniona, a zarządzaniem dostawą składników zajmuje się komputer. W zakładzie korespondencja jest szyfrowana za pomocą asymetrycznego algorytmu szyfrującego RSA wykorzystującego udostępnioną wszystkim podmiotom pulę kluczy publicznych. System ten jest wykorzystywany do prowadzenia zabezpieczonej wymiany danych między podmiotami zakładu produkcyjnego.

Zadanie 1.1

Magazyn wymagał uzupełnienia zapasów ziaren kakao różnego typu. W tym celu komputer wysłał do dostawcy wiadomość z zaszyfrowanymi kodami produktów, które powinny zostać zamówione. Ponieważ dla danych rodzajów mleka czekoladowego ziarna kakao trzymane są w osobnych sekcjach, wysłane kody mogą się powtarzać. Aby dowiedzieć się, które rodzaje kakao mają zostać wysłane, dostawca musi odszyfrować kody z użyciem swoich kluczy prywatnych, które umieszczono w pliku z danymi.

W pliku dostawy.txt znajduje się 100 wierszy. Każdy wiersz składa się z trzech liczb naturalnych. Pierwsza i druga liczba to elementy klucza prywatnego dostawcy, trzecia liczba to szyfrogram będący zaszyfrowanym kodem przypisanym do danego typu ziaren kakao. Każda z tych wartości jest oddzielona od pozostałych znakiem odstępu.

Re0mWQHmK8zMb

Plik TXT zawierający 100 wierszy potrzebnych do rozwiązania zadania.

Plik dostawy.txt.
Plik TXT o rozmiarze 1.52 KB w języku polskim

Napisz program, który rozszyfruje podane wiadomości z użyciem kluczy prywatnych dostawcy. Wyniki zapisz w pliku wyniki_1.txt.

Przykład 1

Dla przykładowych danych z pliku dostawy.txt:

Linia 1. 2165 5561 5463. Linia 2. 4811 7387 2197.

plik wynikowy miałby następującą postać:

Linia 1. 10. Linia 2. 13.

Dodajmy do liczb dodatkowy wiersz, w którym wyjaśnimy, co oznaczają dane liczby.

Dane:

Linia 1. d n szyfrogram. Linia 2. 2165 5561 5463. Linia 3. 4811 7387 2197.

gdzie d to pierwszy element klucza prywatnego dostawcy, n to drugi element klucza prywatnego dostawcy, a szyfrogram to zaszyfrowana liczba naturalna będąca identyfikatorem typu kakao.

Wyniki:

Linia 1. odszyfrowana wiadomość. Linia 2. 10. Linia 3. 13.

Do oceny oddajesz:

  • plik wyniki_1.txt zawierający odpowiedź (odszyfrowane wiadomości; każda wiadomość w nowej linii);

  • plik(i) z komputerową realizacją zadania (kodem programu).

Praca domowa

Przedstaw rozwiązanie zadania w postaci programu w wybranym języku (C++, Java lub Python). Zadbaj o prawidłowe wczytanie i zapisanie danych z/do pliku tekstowego. Odpowiedź do zadania znajdziesz w pliku umieszczonym pod omówieniem pseudokodu.

Rozwiązanie

Rozwiązanie przedstawimy w postaci pseudokodu.

Ważne!

Rozwiązując to i kolejne zadania, w pseudokodzie wykorzystamy operatory:

  • mod – operator modulo (oblicza resztę z dzielenia),

  • div – operator dzielenia całkowitego.

Zaczynamy od wczytania z pliku elementów kluczy prywatnych i szyfrogramów:

Linia 1. ile ← 100. Linia 2. d otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof dostawy kropka txt apostrof pierwsze elementy kluczy prywatnych. Linia 3. n otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof dostawy kropka txt apostrof drugie elementy kluczy prywatnych. Linia 4. W otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof dostawy kropka txt apostrof szyfrogramy do odszyfrowania.

W kolejnym kroku tworzymy funkcję, która zgodnie ze wzorem Wd mod n odszyfruje wiadomość. Zwróćmy uwagę, że potrzebna jest operacja potęgowania. Ponieważ nie dysponujemy operatorem potęgowania, napiszemy również funkcję wykonującą to działanie.

Linia 1. funkcja rozszyfruj otwórz nawias okrągły d przecinek n przecinek W zamknij nawias okrągły. Linia 2. zwróć potęga otwórz nawias okrągły W przecinek d zamknij nawias okrągły mod n.

W przedstawionej funkcji używamy nieutworzonej jeszcze funkcji obliczającej potęgę liczby. Zapiszmy ją. Wykorzystamy algorytm szybkiego potęgowania, który został opisany w e‑materiałach: Analiza podejścia rekurencyjnego i iteracyjnegoPNMlyY9MbAnaliza podejścia rekurencyjnego i iteracyjnegoAlgorytmy iteracyjne i liczbowe – potęgowanie liczbPeGPO00R1Algorytmy iteracyjne i liczbowe – potęgowanie liczb.

Możemy wykorzystać wersję rekurencyjną lub iteracyjną algorytmu.

Wersja rekurencyjna:

Linia 1. funkcja potęga otwórz nawias okrągły W przecinek d zamknij nawias okrągły. Linia 2. jeżeli W znak równości 0. Linia 3. zwróć 1. Linia 4. jeżeli d mod 2 znak równości 1. Linia 5. zwróć W asterysk potęga otwórz nawias okrągły W przecinek d minus 1 zamknij nawias okrągły. Linia 6. w przeciwnym razie. Linia 7. wartość ← potęga otwórz nawias okrągły W przecinek d prawy ukośnik 2 zamknij nawias okrągły. Linia 8. return wartość asterysk wartość.

Wersja iteracyjna:

Linia 1. funkcja potęga otwórz nawias okrągły W przecinek d zamknij nawias okrągły. Linia 2. W znak równości 1. Linia 3. dopóki d zamknij nawias ostrokątny 0. Linia 4. jeżeli d mod 2 znak równości 1. Linia 5. wynik ← wynik asterysk podstawa. Linia 6. d ← d div 2. Linia 7. W ← W asterysk W. Linia 8. zwróć wynik.

Wykorzystamy wersję rekurencyjną.

Wywołujemy w pętli funkcję odszyfrowującą dla każdego odczytanego z pliku zestawu danych. Zapisujemy wynik do odpowiedniego pliku.

Zamykamy pliki.

Kompletny pseudokod:

Linia 1. funkcja rozszyfruj otwórz nawias okrągły d przecinek n przecinek W zamknij nawias okrągły. Linia 2. zwróć potęga otwórz nawias okrągły W przecinek d zamknij nawias okrągły mod n. Linia 4. funkcja potęga otwórz nawias okrągły W przecinek d zamknij nawias okrągły. Linia 5. jeżeli W znak równości 0. Linia 6. zwróć 1. Linia 7. jeżeli d mod 2 znak równości 1. Linia 8. zwróć W asterysk potęga otwórz nawias okrągły W przecinek d minus 1 zamknij nawias okrągły. Linia 9. w przeciwnym razie. Linia 10. wartość ← potęga otwórz nawias okrągły W przecinek d prawy ukośnik 2 zamknij nawias okrągły. Linia 11. zwróć wartość asterysk wartość. Linia 13. ile ← 100. Linia 14. d otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof dostawy kropka txt apostrof pierwsze elementy kluczy prywatnych. Linia 15. n otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof dostawy kropka txt apostrof drugie elementy kluczy prywatnych. Linia 16. W otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof dostawy kropka txt apostrof szyfrogramy do odszyfrowania. Linia 18. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek ile minus 1 wykonuj. Linia 19. wiadomość znak równości rozszyfruj otwórz nawias okrągły d przecinek n przecinek W zamknij nawias okrągły. Linia 20. zapisz wiadomość w nowej linii pliku apostrof wyniki podkreślnik 1 kropka txt apostrof. Linia 21. zamknij plik apostrof dostawy kropka txt apostrof. Linia 22. zamknij plik apostrof wyniki podkreślnik 1 kropka txt apostrof.

Odpowiedź do zadania dla danych zapisanych w pliku dostawy.txt:

RbdoyPNPrbzvn

Przycisk do pobrania TXT z odpowiedzią do zadania.

Plik wyniki_1.txt.
Plik TXT o rozmiarze 368.00 B w języku polskim

Zadanie 1.2

Po realizacji zamówienia do komputera zajmującego się zarządzaniem składnikami w wytwórni wysyłana jest wiadomość z informacją o tym, kiedy zamówione kakao dotrze do magazynu. W treści znajduje się zakodowana informacja o liczbie dni, które upłyną od otrzymania zlecenia do pojawienia się dostawy w magazynie. Wiersze z liczbą dni odpowiadają wierszom z zamówieniami z zadania 1.1.

Aby zachować poufność korespondencji, wiadomość należy również zaszyfrować. Szyfrowanie odbywa się za pomocą kluczy publicznych podanych w pliku z danymi.

W pliku wiadomosci.txt znajduje się 100 zestawów danych (oddzielnie dla każdego wiersza z zamówieniem) potrzebnych do zaszyfrowania wiadomości. Każdy zestaw zapisany jest w odrębnym wierszu i składa się z trzech liczb naturalnych oddzielonych znakiem spacji. Każdy wiersz składa się z dwóch liczb będących elementami klucza publicznego oraz wiadomości do zaszyfrowania zawierającej liczby dni, które upłyną od otrzymania zlecenia do pojawienia się dostawy w magazynie.

RyxuRkkBb7fG2

Przycisk do pobrania TXT z  zawartością 100 zestawów danych.

Plik wiadomosci.txt.
Plik TXT o rozmiarze 1.04 KB w języku polskim

Napisz program, który zaszyfruje wiadomości podane w pliku zgodnie z przyporządkowanymi im kluczami publicznymi. Wyniki zapisz w pliku wyniki_2.txt.

Przykład 2

Dla przykładowych danych z pliku wiadomosci.txt:

Linia 1. 5 5561 10. Linia 2. 3 7387 13.

plik wynikowy miałby następującą postać:

Linia 1. 5463. Linia 2. 2197.

Dodajmy do liczb dodatkowy wiersz, w którym wyjaśnimy, co oznaczają dane liczby.

Dane:

Linia 1. e n W. Linia 2. 5 5561 10. Linia 3. 3 7387 13.

gdzie e to pierwszy element klucza publicznego dostawcy, n to drugi element klucza publicznego dostawcy, a W to wiadomość do zaszyfrowania.

Wyniki:

Linia 1. zaszyfrowana wiadomość. Linia 2. 5463. Linia 3. 2197.

Do oceny oddajesz:

  • plik wyniki_2.txt zawierający odpowiedź (zaszyfrowane wiadomości; każda wiadomość w nowej linii);

  • plik(i) z komputerową realizacją zadania (kodem programu).

Praca domowa

Przedstaw rozwiązanie zadania w postaci programu w wybranym języku (C++, Java lub Python). Zadbaj o prawidłowe wczytanie i zapisanie danych z/do pliku tekstowego. Odpowiedź do zadania znajdziesz w osobnym pliku umieszczonym pod omówieniem pseudokodu.

Rozwiązanie

Rozwiązanie przedstawimy w postaci pseudokodu.

Zacznijmy od wczytania z pliku wiadomości, które mamy zaszyfrować:

Linia 1. ile ← 100. Linia 2. e otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof wiadomosci kropka txt apostrof pierwsze elementy kluczy publicznych. Linia 3. n otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof wiadomosci kropka txt apostrof drugie elementy kluczy publicznych. Linia 4. W otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof wiadomosci kropka txt apostrof wiadomości do zaszyfrowania.

Tworzymy funkcję, w której wykorzystamy wzór Wemod n do szyfrowania wiadomości. Pamiętajmy, że tak jak w przypadku rozwiązania zadania 1.1 potrzebujemy funkcji wykonującej operację potęgowania. Wykorzystamy w tym celu funkcję z rozwiązania zadania 1.1.

Linia 1. funkcja zaszyfruj otwórz nawias okrągły e przecinek n przecinek W zamknij nawias okrągły. Linia 2. zwróć potęga otwórz nawias okrągły W przecinek e zamknij nawias okrągły mod n.

Wywołujemy funkcję szyfrującą dla wartości kluczy publicznych i szyfrowanych wiadomości za pomocą pętli i zapisujemy wynik do pliku docelowego.

Zamykamy pliki.

Cały pseudokod prezentuje się następująco:

Linia 1. funkcja zaszyfruj otwórz nawias okrągły e przecinek n przecinek W zamknij nawias okrągły. Linia 2. zwróć potęga otwórz nawias okrągły W przecinek e zamknij nawias okrągły mod n. Linia 4. funkcja potęga otwórz nawias okrągły W przecinek d zamknij nawias okrągły. Linia 5. jeżeli W znak równości 0. Linia 6. zwróć 1. Linia 7. jeżeli d mod 2 znak równości 1. Linia 8. zwróć W asterysk potęga otwórz nawias okrągły W przecinek d minus 1 zamknij nawias okrągły. Linia 9. w przeciwnym razie. Linia 10. wartość ← potęga otwórz nawias okrągły W przecinek d prawy ukośnik 2 zamknij nawias okrągły. Linia 11. return wartość asterysk wartość. Linia 13. ile ← 100. Linia 14. e otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof wiadomosci kropka txt apostrof pierwsze elementy kluczy publicznych. Linia 15. n otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof wiadomosci kropka txt apostrof drugie elementy kluczy publicznych. Linia 16. W otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof wiadomosci kropka txt apostrof wiadomości do zaszyfrowania. Linia 18. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek ile minus 1 wykonuj. Linia 19. szyfrogram ← zaszyfruj otwórz nawias okrągły e otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek n otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek W otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 20. zapisz szyfrogram w nowej linii pliku apostrof wyniki podkreślnik 2 kropka txt apostrof. Linia 22. zamknij plik apostrof wiadomosci kropka txt apostrof. Linia 23. zamknij plik apostrof wyniki podkreślnik 2 kropka txt apostrof.

Odpowiedź do zadania dla danych zapisanych w pliku wiadomosci.txt:

Rn4V3Es3I6DKp

Przycisk do pobrania TXT z odpowiedzią do zadania.

Plik wyniki_2.txt.
Plik TXT o rozmiarze 565.00 B w języku polskim

Zadanie 1.3

W zakładzie nastąpił wyciek danych, w wyniku którego odtajnione zostały klucze publiczne i prywatne powiązanych podmiotów. Konieczne jest wygenerowanie nowych par kluczy z wykorzystaniem innych par liczb pierwszych. Klucze mają być stosowane z szyfrem RSA, a co za tym idzie, muszą spełniać określone warunki: pierwszy człon klucza publicznego e musi być liczbą względnie pierwszą do wartości phi(n) wyznaczonej funkcją Eulera, a pierwszy człon klucza prywatnego d powinien stanowić odwrotność modulo phi(n) liczby e, podczas gdy drugi człon kluczy n określa największą możliwą wielkość liczbową wiadomości.

W pliku liczby.txt znajduje się 100 par liczb pierwszych p i q, mających zostać użytych do wygenerowania par kluczy: publicznego i prywatnego. Każda para liczb pierwszych zapisana jest w osobnym wierszu.

RC6VU8HHtNNld

Przycisk do pobrania TXT z zwartością 100 par liczb pierwszych.

Plik liczby.txt.
Plik TXT o rozmiarze 678.00 B w języku polskim

Napisz program, który bazując na podanych w pliku liczby.txt liczbach pierwszych, wygeneruje człony kluczy publicznego i prywatnego e, dn, spełniających wymogi podanego algorytmu szyfrującego. Wyniki zapisz w pliku wyniki_3.txt.

Przykład 3

Dla przykładowych danych z pliku liczby.txt:

Linia 1. 11 5. Linia 2. 11 23.

plik wynikowy miałby następującą postać:

Linia 1. 3 27 55. Linia 2. 3 147 253.

Do oceny oddajesz:

  • plik wyniki_3.txt zawierający odpowiedź (wyznaczone człony kluczy publicznego i prywatnego w kolejności e, d, n; zestawy członów kluczy zapisane w osobnym wierszu; poszczególne człony kluczy oddzielone są pojedynczym znakiem odstępu);

  • plik(i) z komputerową realizacją zadania (kodem programu).

Praca domowa

Przedstaw rozwiązanie zadania w postaci programu w wybranym języku (C++, Java lub Python). Zadbaj o prawidłowe wczytanie i zapisanie danych z/do pliku tekstowego. Odpowiedź do zadania znajdziesz w osobnym pliku umieszczonym pod omówieniem pseudokodu.

Rozwiązanie

Rozwiązanie przedstawimy w postaci pseudokodu.

Znając liczby pierwsze, możemy wyznaczyć liczbę n, czyli ich iloczyn. Następnie korzystamy z funkcji Eulera w postaci φn=p1q1 do wyznaczenia liczby e, spełniającej założenia: 1 < e < φn takiej, że e jest względnie pierwsza z φn. Na koniec wyznaczamy wartość d, czyli odwrotność modulo z e mod φn.

Zaczniemy od zapisania podanych liczb pierwszych:

Linia 1. ile ← 100. Linia 2. p otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof pierwsze liczby z par liczb pierwszych. Linia 3. q otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof drugie liczby z par liczb pierwszych.

Następnie, bazując na odczytanych liczbach pierwszych, wykonamy w pętli przechodzącej po wszystkich odczytanych parach liczb serię czynności. Pierwszą z nich będzie wyznaczenie wartości liczby n.

Linia 1. ile ← 100. Linia 2. p otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof pierwsze liczby z par liczb pierwszych. Linia 3. q otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof drugie liczby z par liczb pierwszych. Linia 5. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek ile minus 1 wykonuj. Linia 6. n ← p otwórz nawias kwadratowy i zamknij nawias kwadratowy asterysk q otwórz nawias kwadratowy i zamknij nawias kwadratowy.

Kolejnym krokiem będzie wyznaczenie dla każdej pary liczb pierwszych wartości e. W tym celu potrzebne będą między innymi funkcje pomocnicze wyznaczające wartość funkcji Eulera i największy wspólny dzielnik podanych liczb pierwszych.

Funkcja wyznaczająca wartość funkcji Eulera przyjmie postać funkcji zwracającej iloczyn podanych liczb pierwszych pomniejszonych o 1.

Linia 1. funkcja euler otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 2. zwróć otwórz nawias okrągły p minus 1 zamknij nawias okrągły asterysk otwórz nawias okrągły q minus 1 zamknij nawias okrągły.

Kolejnym etapem będzie stworzenie funkcji wyznaczającej największy wspólny dzielnik, w której skorzystamy z algorytmu EuklidesaP7OAFYVSialgorytmu Euklidesa.

Linia 1. funkcja NWD otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 2. dopóki p ≠ q wykonuj. Linia 3. jeżeli p zamknij nawias ostrokątny q. Linia 4. p ← p minus q. Linia 5. w przeciwnym razie. Linia 6. q ← q minus p. Linia 7. zwróć p.

Po napisaniu obu funkcji pomocniczych możemy przystąpić do tworzenia funkcji wyznaczającej wartość e. W funkcji tej za pomocą pętli przejdziemy po liczbach z przedziału 1, φn, sprawdzając, czy są względnie pierwsze (czy ich największy wspólny dzielnik jest równy 1).

Linia 1. funkcja wyznacz podkreślnik e otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 2. euler ← euler otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 3. dla i znak równości 2 przecinek 3 przecinek kropka kropka kropka otwórz nawias okrągły euler minus 1 zamknij nawias okrągły wykonuj dwukropek. Linia 4. jeżeli NWD otwórz nawias okrągły i przecinek euler zamknij nawias okrągły znak równości 1. Linia 5. zwróć i.

Następnie wartość zwracaną przez tę funkcję zapisujemy do zmiennej.

Linia 1. ile ← 100. Linia 2. p otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof pierwsze liczby z par liczb pierwszych. Linia 3. q otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof drugie liczby z par liczb pierwszych. Linia 5. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek ile minus 1 wykonuj. Linia 6. n ← p otwórz nawias kwadratowy i zamknij nawias kwadratowy asterysk q otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 7. e ← wyznacz podkreślnik e otwórz nawias okrągły p otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek q otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.

Przechodzimy do funkcji wyznaczającej odwrotność modulo phi(n) liczby e. Tworzymy cztery zmienne (abcd) – w dwóch zapisujemy wartość e oraz wartość funkcji Eulera φn, a w pozostałych pomocnicze wartości 1 oraz 0. Następnie tworzymy pętlę, która będzie wykonywała się do momentu, aż wartość zmiennej, do której przypisaliśmy wartość e, wyniesie 0. Jeżeli wartość a (wstępnie liczba e) będzie mniejsza od b (wartość funkcji Eulera), to zamieniamy ich wartości w zmiennych oraz zamieniamy wartości pozostałych zmiennych pomocniczych. Ustalamy wartość zmiennej pomocniczej na wartość zwracaną przez dzielenie całkowite a przez b. Następnie zmniejszamy wartość zmiennej c o iloczyn zmiennej pomocniczej oraz zmiennej d. Zmniejszamy również wartość zmiennej a o iloczyn zmiennej pomocniczej oraz zmiennej b. Tu następuje ustalanie wartości odwrotności modularnej. Wykorzystana też zostaje funkcja pomocnicza zamieniająca wartości zmiennych.

Linia 1. funkcja zamień otwórz nawias okrągły x przecinek y zamknij nawias okrągły. Linia 2. pom ← x. Linia 3. x ← y. Linia 4. y ← pom.
Linia 1. funkcja odwrotność podkreślnik modulo otwórz nawias okrągły e przecinek p przecinek q zamknij nawias okrągły. Linia 2. a ← e. Linia 3. b ← euler otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 4. c ← 1. Linia 5. d ← 0. Linia 6. dopóki a ≠ 0 wykonuj dwukropek. Linia 7. jeżeli a otwórz nawias ostrokątny b. Linia 8. zamień otwórz nawias okrągły a przecinek b zamknij nawias okrągły. Linia 9. zamień otwórz nawias okrągły c przecinek d zamknij nawias okrągły. Linia 10. pom ← a prawy ukośnik b. Linia 11. c ← c minus pom asterysk d. Linia 12. a ← a minus pom asterysk b. Linia 13. jeżeli otwórz nawias okrągły b ≠ 1 zamknij nawias okrągły. Linia 14. jeżeli otwórz nawias okrągły d otwórz nawias ostrokątny 0 zamknij nawias okrągły. Linia 15. d ← d plus b. Linia 16. d ← d plus euler otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 17. zwróć d.

Następnie wywołujemy tę funkcję dla każdej pary liczb pierwszych, a wynik wywołania tej funkcji przypisujemy do zmiennej:

Linia 1. ile ← 100. Linia 2. p otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof pierwsze liczby z par liczb pierwszych. Linia 3. q otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof drugie liczby z par liczb pierwszych. Linia 5. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek ile minus 1 wykonuj. Linia 6. n ← p otwórz nawias kwadratowy i zamknij nawias kwadratowy asterysk q otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 7. e ← wyznacz podkreślnik e otwórz nawias okrągły p otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek q otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 8. d ← odwrotność podkreślnik modulo otwórz nawias okrągły e przecinek p otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek q otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.

Ostatnim krokiem będzie zapisanie wyznaczonych wartości parametrów e, dn do odpowiedniego pliku wynikowego.

Linia 1. ile ← 100. Linia 2. p otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof pierwsze liczby z par liczb pierwszych. Linia 3. q otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof drugie liczby z par liczb pierwszych. Linia 5. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek ile minus 1 wykonuj. Linia 6. n ← p otwórz nawias kwadratowy i zamknij nawias kwadratowy asterysk q otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 7. e ← wyznacz podkreślnik e otwórz nawias okrągły p otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek q otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 8. d ← odwrotność podkreślnik modulo otwórz nawias okrągły e przecinek p otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek q otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 9. zapisz e d n w pliku apostrof wyniki podkreślnik 3 kropka txt apostrof.

Zamykamy pliki.

Cały pseudokod wygląda następująco:

Linia 1. funkcja euler otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 2. zwróć otwórz nawias okrągły p minus 1 zamknij nawias okrągły asterysk otwórz nawias okrągły q minus 1 zamknij nawias okrągły. Linia 4. funkcja NWD otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 5. dopóki p ≠ q wykonuj. Linia 6. jeżeli p zamknij nawias ostrokątny q. Linia 7. p ← p minus q. Linia 8. w przeciwnym razie. Linia 9. q ← q minus p. Linia 10. zwróć p. Linia 12. funkcja wyznacz podkreślnik e otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 13. euler ← euler otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 14. dla i znak równości 2 przecinek 3 przecinek kropka kropka kropka otwórz nawias okrągły euler minus 1 zamknij nawias okrągły wykonuj dwukropek. Linia 15. jeżeli NWD otwórz nawias okrągły i przecinek euler zamknij nawias okrągły znak równości 1. Linia 16. zwróć i. Linia 18. funkcja zamień otwórz nawias okrągły x przecinek y zamknij nawias okrągły. Linia 19. pom ← x. Linia 20. x ← y. Linia 21. y ← pom. Linia 23. funkcja odwrotność podkreślnik modulo otwórz nawias okrągły e przecinek p przecinek q zamknij nawias okrągły. Linia 24. a ← e. Linia 25. b ← euler otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 26. c ← 1. Linia 27. d ← 0. Linia 28. dopóki a ≠ 0 wykonuj dwukropek. Linia 29. jeżeli a otwórz nawias ostrokątny b. Linia 30. zamień otwórz nawias okrągły a przecinek b zamknij nawias okrągły. Linia 31. zamień otwórz nawias okrągły c przecinek d zamknij nawias okrągły. Linia 32. pom ← a prawy ukośnik b. Linia 33. c ← c minus pom asterysk d. Linia 34. a ← a minus pom asterysk b. Linia 35. jeżeli otwórz nawias okrągły b ≠ 1 zamknij nawias okrągły. Linia 36. jeżeli otwórz nawias okrągły d otwórz nawias ostrokątny 0 zamknij nawias okrągły. Linia 37. d ← d plus b. Linia 38. d ← d plus euler otwórz nawias okrągły p przecinek q zamknij nawias okrągły. Linia 39. zwróć d. Linia 41. ile ← 100. Linia 42. p otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof pierwsze liczby z par liczb pierwszych. Linia 43. q otwórz nawias kwadratowy 0 kropka kropka ile minus 1 zamknij nawias kwadratowy ← Wczytaj z pliku apostrof liczby kropka txt apostrof drugie liczby z par liczb pierwszych. Linia 45. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek ile minus 1 wykonuj. Linia 46. n ← p otwórz nawias kwadratowy i zamknij nawias kwadratowy asterysk q otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 47. e ← wyznacz podkreślnik e otwórz nawias okrągły p otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek q otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 48. d ← odwrotność podkreślnik modulo otwórz nawias okrągły e przecinek p otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek q otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 49. zapisz e d n w pliku apostrof wyniki podkreślnik 3 kropka txt apostrof. Linia 51. zamknij plik apostrof liczby kropka txt apostrof. Linia 52. zamknij plik apostrof wyniki podkreślnik 3 kropka txt apostrof.

Odpowiedź do zadania dla danych zapisanych w pliku liczby.txt:

R9ZPISMNdvbHM

Przycisk do pobrania TXT z odpowiedzią do zadania.

Plik wyniki_3.txt.
Plik TXT o rozmiarze 1.13 KB w języku polskim

Słownik

funkcja Eulera
funkcja Eulera

funkcja przypisująca każdej liczbie naturalnej liczbę liczb względnie pierwszych z nią i nie większych od niej

odwrotność modulo
odwrotność modulo

sposób przypisania do dowolnej pary liczb a, b, takiego c, że c·a mod b = 1

liczba względnie pierwsza
liczba względnie pierwsza

liczba a jest względnie pierwsza z b, jeżeli ich największy wspólny dzielnik wynosi 1