Rozwiązania poniższych zadań to proste procedury operujące na liczbach całkowitych.
Dla każdej procedury rekurencyjnej podaj jej specyfikację, tj. warunek wstępny i końcowy,
oraz uzasadnij jej poprawność.
Poprawność procedur rekurencyjnych można pokazać przez indukcję.
-
Stopień parzystości liczby całkowitej x, to największa taka liczba naturalna i, że x dzieli się przez 2i.
Liczby nieparzyste mają stopień parzystości 0, liczby 2 i -6 mają stopień parzystości 1,
a liczby 4 i 12 mają stopień parzystości 2.
Przyjmujemy, że 0 ma stopień parzystości -1.
Napisz procedurę parzystość
wyznaczającą stopień parzystości danej liczby całkowitej.
Rozwiązania
-
Napisz procedurę, która przekształca daną liczbę naturalną w taką, w której cyfry występują w odwrotnej kolejności,
np. 1234 jest przekształcane na 4321.
Rozwiązania
-
Sumy kolejnych liczb nieparzystych dają kwadraty kolejnych liczb naturalnych, zgodnie ze wzorem:
∑ki=1(2i−1)=k2.
Wykorzystaj ten fakt do napisania procedury sqrt
obliczającej sqrt x
=⌊√x⌋
i nie korzystającej z mnożenia, ani dzielenia.
Rozwiązania
-
Liczbę naturalną nazwiemy rzadką, jeżeli w jej zapisie binarnym żadne dwie jedynki nie stoją obok siebie.
Napisz procedurę rzadkie : int → int
, która dla danej liczby naturalnej n zwróci najmniejszą rzadką liczbę naturalną większą od n. Na przykład, dla n=42=1010102 mamy rzadkie 42=10000002=64.
Rozwiązania
-
Liczbę naturalną nazwiemy rzadką, jeżeli w jej zapisie binarnym żadne dwie jedynki nie stoją obok siebie.
Napisz procedurę rzadkie : int → int
, która dla danej liczby naturalnej n wyznaczy liczbę dodatnich liczb rzadkich, które nie przekraczają n.
Na przykład, dla n=42=1010102 mamy rzadkie 42 = 20
.
Rozwiązania
-
Napisz procedurę, która sprawdza, czy dana liczba jest pierwsza.
Rozwiązania
-
Zaimplementuj kodowanie par liczb naturalnych jako liczby naturalne.
To znaczy, napisz procedurę dwuargumentową, która koduje dwie liczby dane jako argumenty w jednej liczbie naturalnej.
Dodatkowo napisz dwie procedury, które wydobywają z zakodowanej pary odpowiednio pierwszą i drugą liczbę.
Rozwiązania
-
Napisz procedurę, która dla danej liczby n sprawdzi czy pierścień reszt modulo n zawiera nietrywialne pierwiastki
z 1 (tj. takie liczby k, k≠1, k≠n−1, że k^2 \equiv 1\ \mod\ n).
Nota bene, jeśli takie pierwiastki istnieją, to liczba n nie jest pierwsza.
Odwrotna implikacja jednak nie zachodzi --- np. dla n=4 nie ma nietrywialnych pierwiastków z 1.
Rozwiązania