Strona główna » Algorytmy » Artykuły » Rzeczywista Hodowla Fibonacciego
 

Rzeczywista Hodowla Fibonacciego

Opis

Ciąg Fibonacciego jest bardzo często łączony z idealną hodowlą królików. Mianowicie każdy następny wyraz określa ile będzie par królików w hodowli w n-tym miesiącu. Żeby okazało się to prawdziwie to należy dodatkowo przyjąć, że para królików co miesiąc wydaje potomstwo na świat i zawsze jest to para króliczków, a ponadto nowa para królików przez pierwszy miesiąc nie wydaje na świat potomstwa. Jednak w rzeczywistości idealne warunki nie istnieją.

W prawdziwym życiu para królików nie musi mieć co miesiąc potomstwa i tym bardziej tylko pary małych króliczków. Po dłuższym zastanowieniu można zauważyć również, że króliki, aby co miesiąc wydawać potomstwo to musiałyby być nieśmiertelne - w końcu każdy następny wyraz przyjmuje, że dorosła para królików wciąż żyje i wydaje na świat potomstwo. Innymi słowy przedstawiony ciąg należałoby zomdyfikować, aby wyniki były bardziej wiarygodne.

Rozwiązanie

Matematyk John Horton Conroy zasugerował, że uwzględniając śmiertelność królików oraz bardziej nieregularny przyrost naturalny to uzyskamy ciąg, który mógłby faktycznie opisywać rzeczywistą hodowlę królików. Jego zdaniem w przypadku, gdy liczba królików jest liczbą złożoną to należy ją podzielić przez jej najmniejszy dzielnik, który jest liczbą pierwszą. W przypadku, gdy liczba królików jest liczbą pierwszą to nie należy nic dzielić.

Przykład

Matematyk John Horton Conroy zasugerował, że uwzględniając śmiertelność królików oraz bardziej nieregularny przyrost naturalny to uzyskamy ciąg, który mógłby faktycznie opisywać rzeczywistą hodowlę królików. Jego zdaniem w przypadku, gdy liczba królików jest liczbą złożoną to należy ją podzielić przez jej najmniejszy dzielnik, który jest liczbą pierwszą. W przypadku, gdy liczba królików jest liczbą pierwszą to nie należy nic dzielić. Oto pierwsze 100 wyrazów ciagu przyjmując, że w pierwszym i drugim miesiącu była jedna młoda para, która nie wydawała potomstwa.

1, 1, 2, 3, 5, 4, 3, 7, 5, 6, 11, 17, 14, 31, 15, 23, 19, 21, 20, 41, 61, 51, 56, 107, 163, 135, 149, 142, 97, 239, 168, 37, 41, 39, 40, 79, 17, 48, 13, 61, 37, 49, 43, 46, 89, 45, 67, 56, 41, 97, 69, 83, 76, 53, 43, 48, 13, 61, 37, 49, 43, 46, 89, 45, 67, 56, 41, 97, 69, 83, 76, 53, 43, 48, 13, 61, 37, 49, 43, 46, 89, 45, 67, 56, 41, 97, 69, 83, 76, 53, 43, 48, 13, 61, 37, 49, 43, 46, 89, 45, 67, 56, ..

Przyglądając się liczbom można zauważyć, że początkowo liczba królików bardzo szybko wzrasta, aby potem szybko się zmniejszyć. Przypatrzmy się wykresowi, aby dokładniej opisać zachowanie ciągu:

Przez pierwsze blisko 19 miesięcy populacja królików utrzymuje się na niskim poziomie, ale nagle w ciągu następnych 6 miesięcy populacja wzrasta do średnio 150 par, a trzydziestego miesiąca, aż do 239! Jednak co się potem stało? Populacja nagle spada do 40 paru sztuk. Może to być spowodowane wymarciem poprzedniej generacji królików jak również podobnym genomem królików - istnieje wtedy większe ryzyko zachorowań. Interesujaca jest też dalsza część ciągu, ponieważ począwszy od 56 miesiąca dalej populacja zmienia się w identyczny sposób, a okres trwania takiego cyklu wynosi 18 miesięcy.

I tu dochodzimy do bardzo ciekawej cechy omawianego ciągu liczb - zapętla sie. Jednak czy dotyczy to tylko sytuacji, gdy początkowo mamy jedną parę młodych królików? Sprawdźmy sytuację, gdy rozpoczniemy od 2 par w pierwszym miesiącu i 5 w drugim. Warto zauważyć, że dwie wybrane liczby nie są kolejnymi, które występują w ciągu Fibonacciego.

Otrzymany wykres jest bardzo podobny do poprzedniego. Jednak należy zauważyć, że początkowo hodowla miała więcej królików niż w poprzednim przypadku, ale dłużej trwał okres do boomu populacji. Jednak nagły skok populacji znów trwał zaledwie koło roku, a potem po stabilizacji populacja znów zaczęła się zmieniać w sposób cykliczny.

Implementacja

Funkcja rzeczywistyFibonnaci() będzie przyjmować trzy argumenty: ile - ile kolejnych wyrazów wypisać oraz opcjonalnie wyrazy początkowe p1 i p2. Wszystkie dane zostaną wypisane bezpośrednio na konsole, a kolejne dane będą oddzielone znakiem przerwy.

C++
C#
  1. void rzeczywistyFibonnaci(int ile, int p1 = 1, int p2 = 1) {
  2.   cout << p1 << " " << p2;
  3.   while (ile-- > 0) {
  4.     int ps = p1 + p2;
  5.     int d = 1;
  6.     for (int i = 2; i <= ps / 2; i++) {
  7.       if (ps % i == 0) {
  8.         d = i;
  9.         break;
  10.       }
  11.     }
  12.     ps /= d;
  13.     cout << " " << ps;
  14.     p1 = p2;
  15.     p2 = ps;
  16.   }
  17. }

W przedstawionym kodzie funkcja na początek (2.) wypisuje dwa pierwsze wyrazy ciągu i (3.) rozpoczyna wypisywanie ile kolejnych liczb. (4.) W każdej iteracji wyliczamy kolejny wyraz i (5.) przyjmujemy, że minimalnym dzielnikiem właściwym liczby jest 1. Potem (6. - 11.) w pętli szukamy dzielnika wyliczonego wyrazu. Jeśli znajdziemy to (8.) przypisujemy dzielnikowi d numer iteracji i (9.) przerywamy dalsze poszukiwania dzielników, ponieważ szukamy najmniejszego. Ponadto znajdując najmniejszy mamy zagwarantowane, że jest liczbą pierwszą.

Testowanie funkcji

Poniższy kod wczyta od użytkownika informacje dotyczące ciągu, a następnie wywoła funkcję w celu wypisania wyniku

C++
C#
  1. int main () {
  2.   int n, p1, p2;
  3.   cout << "Podaj ile wyrazow wypisac:\n n = ";
  4.   cin >> n;
  5.   cout << "Podaj pierwszy wyraz ciagu:\n p1 = ";
  6.   cin >> p1;
  7.   cout << "Podaj drugi wyraz ciagu:\n p2 = ";
  8.   cin >> p2;
  9.   cout << "Otrzymano nastepujacy ciag:";
  10.   rzeczywistyFibonnaci(n, p1, p2);
  11.   system("pause");
  12.   return 0;
  13. }