Lista 3
Zadanie 1
Napisz program szukający liczb doskonałych mniejszych od $N$. Przetestuj go dla $N=100$.
Zadanie 2
Napisz program liczący ile jest par liczb zaprzyjaźnionych mniejszych od $N$. Przetestuj go dla $N=10000$.
Zadanie 3
Zaimplementujemy sito Sundarama, które jest alternatywnym sposobem generowania listy liczb pierwszych. Główny pomysł przebiega następująco:
- zaczynamy od listy liczb od $1$ do $k$,
- wykreślamy liczby postaci $i + j + 2ij$, dla $0 < i, j \leq k$,
- niewykreślone liczby mnożymy razy dwa,
- do wyników dodajemy jeden.
Efektem są liczby pierwsze większe od $2$ i mniejsze od $2k+2$. Następujący wariant wygeneruje wszystkie liczby pierwsze mniejsze od $N$:
- zaczynamy od listy liczb od $0$ do $k = \left\lfloor \frac{N-2}{2}\right\rfloor$,
- wykreślamy liczby postaci $i + j + 2ij$, dla $0 < i, j \leq k$,
- niewykreślone liczby mnożymy razy dwa,
- do wyników dodajemy jeden,
- pierwszą liczbę zastępujemy dwójką.
1) Napisz funkcję sito_Sundarama(N), która wygeneruje liczby pierwsze mniejsze od $N$. Wyniki porównaj z wynikami uzyskanymi za pomocą sita Eratostenesa z wykładu.
2) Do podstawowego algorytmu spróbuj dodać optymalizację, na przykład:
- zastanów się, czy kolejność zmiennych $i$ oraz $j$ ma znaczenie?
- zastanów się, jak może się zmieniać $j$ przy ustalonym $i$, aby liczba postaci $i+j+2ij \leq k$ (czyli aby znajdowała się na liście)?
- zastanów się, czy $i$ oraz $j$ mogą być dowolnie duże, na przykład bliskie $k$, aby wciąż $i+j+2ij \leq k$?
Wybierz i uzasadnij poprawność jednej dowolnie wybranej optymalizacji (z listy powyżej lub innej). Zaimplementuj ją jako funkcję sito_Sundarama2. Wyniki porównaj z wynikami uzyskanymi za pomocą sita Eratostenesa z wykładu.
3) Porównaj czas działania trzech algorytmów do generowania listy liczb pierwszych: jednego wariantu sita Eratostenesa, podstawowej wersji sita Sundarama (z podpunktu 1) oraz zoptymalizowanej przez siebie wersji sita Sundarama (z podpunktu 2).