Skip to content
Related Articles
Fibonacci Number modulo M and Pisano Period
• Difficulty Level : Medium
• Last Updated : 08 Jun, 2021

Given two number N and M. The task is to find the N-th fibonacci number mod M.
In general let FN be the N-th fibonacci number then the output should be FN % M.

The Fibonacci sequence is a series of numbers in which each no. is the sum of two preceding nos. It is defined by the recurrence relation:

```F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2```

These nos. are in the following sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
Here N can be large.

Examples:

Input: N = 438, M = 900
Output: 44

Input: N = 1548276540, M = 235
Output: 185

Approach:
However, for such values of N, a simple recursive approach to keep calculating N Fibonacci numbers with a time complexity of O(2N) should be avoided. Even an iterative or a Dynamic Programming approach with an algorithm looping for N iterations will not be time-efficient.
This problem can be solved using the properties of Pisano Period
For a given value of N and M >= 2, the series generated with Fi modulo M (for i in range(N)) is periodic.

The period always starts with 01. The Pisano Period is defined as the length of the period of this series.
To understand it further, let’s see what happens when M is small:

For M = 2, the period is 011 and has length 3 while for M = 3 the sequence repeats after 8 nos.

Example:
So to compute, say F2019 mod 5, we’ll find the remainder of 2019 when divided by 20 (Pisano Period of 5 is 20). 2019 mod 20 is 19. Therefore, F2019 mod 5 = F19 mod 5 = 1. This property is true in general.
We need to find the remainder when N is divided by the Pisano Period of M. Then calculate F(N)remainder mod M for the newly calculated N.

Below is the implementation of FN modulo M:

## C++

 `// C++ program to calculate``// Fibonacci no. modulo m using``// Pisano Period``#include ``using` `namespace` `std;` `// Calculate and return Pisano Period``// The length of a Pisano Period for``// a given m ranges from 3 to m * m``long` `pisano(``long` `m)``{``    ``long` `prev = 0;``    ``long` `curr = 1;``    ``long` `res = 0;` `    ``for``(``int` `i = 0; i < m * m; i++)``    ``{``        ``long` `temp = 0;``        ``temp = curr;``        ``curr = (prev + curr) % m;``        ``prev = temp;` `        ``if` `(prev == 0 && curr == 1)``            ``res = i + 1;``    ``}``    ``return` `res;``}` `// Calculate Fn mod m``long` `fibonacciModulo(``long` `n, ``long` `m)``{``    ` `    ``// Getting the period``    ``long` `pisanoPeriod = pisano(m);` `    ``n = n % pisanoPeriod;` `    ``long` `prev = 0;``    ``long` `curr = 1;` `    ``if` `(n == 0)``        ``return` `0;``    ``else` `if` `(n == 1)``        ``return` `1;` `    ``for``(``int` `i = 0; i < n - 1; i++)``    ``{``        ``long` `temp = 0;``        ``temp = curr;``        ``curr = (prev + curr) % m;``        ``prev = temp;``    ``}``    ``return` `curr % m;``}` `// Driver Code``int` `main()``{``    ``long` `n = 1548276540;``    ``long` `m = 235;` `    ``cout << (fibonacciModulo(n, m));``    ``return` `0;``}` `// This code is contributed by subhammahato348`

## Java

 `// Java program to calculate``// Fibonacci no. modulo m using``// Pisano Period``import` `java.io.*;` `class` `GFG{``    ` `// Calculate and return Pisano Period``// The length of a Pisano Period for``// a given m ranges from 3 to m * m``public` `static` `long` `pisano(``long` `m)``{``    ``long` `prev = ``0``;``    ``long` `curr = ``1``;``    ``long` `res = ``0``;``    ` `    ``for``(``int` `i = ``0``; i < m * m; i++)``    ``{``        ``long` `temp = ``0``;``        ``temp = curr;``        ``curr = (prev + curr) % m;``        ``prev = temp;``        ` `        ``if` `(prev == ``0` `&& curr == ``1``)``            ``res= i + ``1``;``    ``}``    ``return` `res;``}` `// Calculate Fn mod m``public` `static` `long` `fibonacciModulo(``long` `n,``                                   ``long` `m)``{``    ` `    ``// Getting the period``    ``long` `pisanoPeriod = pisano(m);``    ` `    ``n = n % pisanoPeriod;``    ` `    ``long` `prev = ``0``;``    ``long` `curr = ``1``;``    ` `    ``if` `(n == ``0``)``        ``return` `0``;``    ``else` `if` `(n == ``1``)``        ``return` `1``;``    ` `    ``for``(``int` `i = ``0``; i < n - ``1``; i++)``    ``{``        ``long` `temp = ``0``;``        ``temp = curr;``        ``curr = (prev + curr) % m;``        ``prev = temp;``    ``}``    ``return` `curr % m;``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``long` `n = ``1548276540``;``    ``long` `m = ``235``;``    ` `    ``System.out.println(fibonacciModulo(n, m));``}``}` `// This code is contributor by Parag Pallav Singh`

## Python3

 `# Python3 program to calculate``# Fibonacci no. modulo m using``# Pisano Period` `# Calculate and return Pisano Period``# The length of a Pisano Period for``# a given m ranges from 3 to m * m``def` `pisanoPeriod(m):``    ``previous, current ``=` `0``, ``1``    ``for` `i ``in` `range``(``0``, m ``*` `m):``        ``previous, current \``        ``=` `current, (previous ``+` `current) ``%` `m``        ` `        ``# A Pisano Period starts with 01``        ``if` `(previous ``=``=` `0` `and` `current ``=``=` `1``):``            ``return` `i ``+` `1` `# Calculate Fn mod m``def` `fibonacciModulo(n, m):``    ` `    ``# Getting the period``    ``pisano_period ``=` `pisanoPeriod(m)``    ` `    ``# Taking mod of N with``    ``# period length``    ``n ``=` `n ``%` `pisano_period``    ` `    ``previous, current ``=` `0``, ``1``    ``if` `n``=``=``0``:``        ``return` `0``    ``elif` `n``=``=``1``:``        ``return` `1``    ``for` `i ``in` `range``(n``-``1``):``        ``previous, current \``        ``=` `current, previous ``+` `current``        ` `    ``return` `(current ``%` `m)` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ``n ``=` `1548276540``    ``m ``=` `235``    ``print``(fibonacciModulo(n, m))`

## C#

 `// C# program to calculate``// Fibonacci no. modulo m using``// Pisano Period``using` `System;` `class` `GFG {` `    ``// Calculate and return Pisano Period``    ``// The length of a Pisano Period for``    ``// a given m ranges from 3 to m * m``    ``public` `static` `long` `pisano(``long` `m)``    ``{``        ``long` `prev = 0;``        ``long` `curr = 1;``        ``long` `res = 0;` `        ``for` `(``int` `i = 0; i < m * m; i++) {``            ``long` `temp = 0;``            ``temp = curr;``            ``curr = (prev + curr) % m;``            ``prev = temp;` `            ``if` `(prev == 0 && curr == 1)``                ``res = i + 1;``        ``}``        ``return` `res;``    ``}` `    ``// Calculate Fn mod m``    ``public` `static` `long` `fibonacciModulo(``long` `n, ``long` `m)``    ``{` `        ``// Getting the period``        ``long` `pisanoPeriod = pisano(m);` `        ``n = n % pisanoPeriod;` `        ``long` `prev = 0;``        ``long` `curr = 1;` `        ``if` `(n == 0)``            ``return` `0;``        ``else` `if` `(n == 1)``            ``return` `1;` `        ``for` `(``int` `i = 0; i < n - 1; i++) {``            ``long` `temp = 0;``            ``temp = curr;``            ``curr = (prev + curr) % m;``            ``prev = temp;``        ``}``        ``return` `curr % m;``    ``}` `    ``// Driver Code``    ``public` `static` `void` `Main()``    ``{``        ``long` `n = 1548276540;``        ``long` `m = 235;` `        ``Console.Write(fibonacciModulo(n, m));``    ``}``}` `// This code is contributed by subham348.`

## Javascript

 ``
Output:
`185`

Pisano Period of 235 is 160. 1548276540 mod 160 is 60. F60 mod 235 = 185. Using Pisano Period, we now need to calculate Fibonacci nos. iteratively for a relatively lower N than specified in the original problem and then calculate FN modulo M.
Time Complexity: O(M2)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up