You are on page 1of 15

Київський національний університет імені Тараса Шевченка

Лабораторна робота №9
«Пошук циклу послідовності Фібоначчі по модулю»

Виконав студент першого курсу групи К-14

Спеціальності «Комп’ютерні науки»

Факультету комп’ютерних наук та кібернетики

Лисанець Андрій Вікторович

Київ – 2022
Зміст
Умова роботи ............................................................................................................................................... 2
Постановка задачі........................................................................................................................................ 3
Теоретичні відомості .................................................................................................................................. 4
Проектування алгоритму ............................................................................................................................ 5
Реалізація алгоритму програмно................................................................................................................ 6
Аналіз виконання програми ....................................................................................................................... 7
Аналіз виконання лабораторної роботи .................................................................................................... 9
Висновки ....................................................................................................................................................10
Джерела ......................................................................................................................................................11
Додаток із кодом програми ......................................................................................................................12

1
Умова роботи
Знайти цикл в числовій послідовності Фібоначчі по модулю.

2
Постановка задачі
Реалізувати алгоритм для пошуку циклу в послідовності чисел Фібоначчі по
модулю з використанням статичної бібліотеки. Порівняти результати
виконання програми за двома формулами F2%m==(F1%m+F0%m)%m та
fib()%m.

3
Теоретичні відомості
Період Пізано — це довжина періоду послідовності Фібоначчі за модулем
заданого цілого додатного числа m.

Послідовність Фібоначчі за модулем будь-якого цілого додатного числа m


періодична, оскільки серед перших m2+1 пар чисел знайдуться дві рівні пари
xi,xi+1=(xj,xj+1) для деяких i≤j. Тому для всіх цілих k виконується рівність
xi+k=xj+k, тобто послідовність періодична.

Наприклад, за модулем 4 послідовність Фібоначчі виглядає як

1, 0, 1, 1, 2, 3, 1, 0, 1, 1…,

Тому 𝜋(4) = 6

4
Проектування алгоритму
Послідовність Фібоначчі за модулем буде мати період, якщо поточний та
наступний елемент такі самі, як перший да другий елемент послідовності.

Для цього пройдемось послідовністю і будемо порівнювати поточний та


наступний елемент із першим та другим. За кожен крок будемо збільшувати
деякий лічильник.

Якщо буде виконуватись умова, задана раніше, пошук завершається та


виводиться довжина періоду послідовності.

5
Реалізація алгоритму програмно
Програма складається з одного файлу main.cpp та має статичну бібліотеку
NumberGenerator, яка в свою чергу складається з файлів main.c та
NumberGenerator.h

1) NumberGenerator.h – файл з прототипами функцій бібліотеки


2) Main.c – файл де описані функції та змінні бібліотеки:
a. static long long F0 – перший елемент послідовності
b. static long long F1 – другий елемент послідовності;
c. static long long m – модуль за яким береться послідовність;
d. void set_m(int M) – задає значення модуля m.
e. Int initNumberGenerator() – задає початкові значення
послідовності Фібоначчі
f. Int nextNumberGenerator() – повертає наступний елемент
послідовності за модулем m.
3) Main.cpp – виконуваний файл, де відбувається введення значення
модуля, виклик функцій бібліотеки NumberGenerator, а також
реалізована функція:
a. int find_cycle(int M) – функція для пошуку циклу послідовності за
заданим модулем M. Повертає довжину циклу та виводить сам
цикл.

6
Аналіз виконання програми
Запустимо програму з різними значеннями модуля m за формулою fib()%m:

1) m = 5

2) m = 20

3) m = 1200

4) m = -2

Також запустимо програму з різними значеннями модуля m за формулою


F2%m==(F1%m+F0%m)%m.

7
1) m = 5

2) m = 20

3) m = 1200

4) m = -2

8
Аналіз виконання лабораторної роботи
Під час виконання лабораторної роботи синтаксичні, алгоритмічні та часу
виконання помилки не виникли. Але потрібно зазначити, що даний алгоритм
працює лише для натуральних чисел більше 1, інакше виводиться “Wrong
value of m”.

9
Висновки
Був побудований алгоритм для знаходження циклу в послідовності чисел
Фібоначчі. Також була розглянута поведінка програми для різних значень
періоду. Також варто зазначити різницю між двома формулами і коли їх
краще використати:

1) fib()%m – корисне, якщо значення модуля, за яким береться


послідовність, може змінюватись протягом програми та значення
модуля не є великими. Адже за цією формулою зберігаються самі
значення послідовності. Неправильна робота програми за великих
значень модуля спричинена переповненням типу long long, бо окрім
заданого модуля, за яким брати послідовність, послідовність береться і
за модулем архітектури.
2) F2%m==(F1%m+F0%m)%m – корисне для великих значень модуля.
Використовувати можна лише, якщо значення модуля не змінюєтсья
протягом програми, адже «генерується» нова послідовність на основі
послідовності Фіобоначчі.

10
Джерела
Період Пізано. (2022, March 23). In Wikipedia.
https://uk.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%96%D0%BE%D
0%B4_%D0%9F%D1%96%D0%B7%D0%B0%D0%BD%D0%BE

11
Додаток із кодом програми
//main.cpp
#include <iostream>
#include "NumberGenerator.h"

using namespace std;

int find_cycle(long long M)


{
set_m(M);
initNumberGenerator();
long long f0 = 1, f1 = 0;
long long cur;
long long next = nextNumberGenerator();
int k = 2;
cout << f1 << " " << f0 << " ";
do
{
cur = next;
next = nextNumberGenerator();
k++;
cout << cur << " ";
} while(f0 != cur || f1 != next);
cout << "| " << next << " " << nextNumberGenerator() <<
" ...\n";
return k;
}

int main()
{
long long M;
cin >> M;
12
if (M <= 1)
cout << "Wrong value of m";
else
cout << find_cycle(M);
return 0;
}

//main.c
static long long F0;
static long long F1;
static long long m;

long long initNumberGenerator()


{
return F1=1, F0=0;
}

long long nextNumberGenerator()


{
F1 += F0, F0=F1-F0;
F1%=m;
F0%=m;
return F1;
}

void set_m(long long M)


{
return m = M;
}

//NumberGenerator.h
13
extern "C" long long initNumberGenerator();
extern "C" long long nextNumberGenerator();
extern "C" void set_m(long long M);

14

You might also like