'''simple docstring'''




from __future__ import annotations

from collections.abc import Iterator
from typing import Any




class 	__UpperCAmelCase				:





       '''simple docstring'''



       def __init__(      self    ,     _SCREAMING_SNAKE_CASE )		->     None:
           A_     =   data
           A_     =   None

       def __str__(      self )		->     str:
           return F'''{self.data}'''




class 	__UpperCAmelCase				:





       '''simple docstring'''



       def __init__(      self )		->     None:
           A_     =   None
           A_     =   None

       def __iter__(      self )		->     Iterator[Any]:
           A_     =   self.front
           while node:
               yield node.data
               A_     =   node.next

       def __len__(      self )		->     int:
           return len(tuple(iter(self ) ) )

       def __str__(      self )		->     str:
           return " <- ".join(str(_SCREAMING_SNAKE_CASE ) for item in self )

       def 					__A       (      self )		->     bool:
           return len(self ) == 0

       def 					__A       (      self    ,     _SCREAMING_SNAKE_CASE )		->     None:
           A_     =   Node(_SCREAMING_SNAKE_CASE )
           if self.is_empty():
               A_     =   A_     =   node
           else:
               assert isinstance(self.rear    ,     _SCREAMING_SNAKE_CASE )
               A_     =   node
               A_     =   node

       def 					__A       (      self )		->     Any:
           if self.is_empty():
               raise IndexError('''dequeue from empty queue''' )
           assert isinstance(self.front    ,     _SCREAMING_SNAKE_CASE )
           A_     =   self.front
           A_     =   self.front.next
           if self.front is None:
               A_     =   None
           return node.data

       def 					__A       (      self )		->     None:
           A_     =   A_     =   None


if __name__ == "__main__":
  from doctest import testmod

  testmod()












'''simple docstring'''



def 	_UpperCamelCase       (_lowerCamelCase							:   list[list[int]]      ,		_lowerCamelCase							:   list[list[int]]		)->      list[list[int]]:




     '''simple docstring'''





     __snake_case			    =     []
     __snake_case			    =     len(_lowerCamelCase		)
     for i in range(_lowerCamelCase		):
          __snake_case			    =     []
          for j in range(_lowerCamelCase		):
               __snake_case			    =     0
               for k in range(_lowerCamelCase		):
                    __snake_case			    =     val + matrix_a[i][k] * matrix_b[k][j]
               list_a.append(_lowerCamelCase		)
          matrix_c.append(_lowerCamelCase		)
     return matrix_c







def 	_UpperCamelCase       (_lowerCamelCase							:   int		)->      list[list[int]]:




     '''simple docstring'''





     return [[int(row == column		) for column in range(_lowerCamelCase		)] for row in range(_lowerCamelCase		)]







def 	_UpperCamelCase       (_lowerCamelCase							:   int		)->      int:




     '''simple docstring'''





     if n <= 1:
          return n
     __snake_case			    =     identity(2		)
     __snake_case			    =     [[1, 1], [1, 0]]
     __snake_case			    =     n - 1
     while n > 0:
          if n % 2 == 1:
               __snake_case			    =     multiply(_lowerCamelCase      ,		_lowerCamelCase		)
          __snake_case			    =     multiply(_lowerCamelCase      ,		_lowerCamelCase		)
          __snake_case			    =     int(n / 2		)
     return res_matrix[0][0]







def 	_UpperCamelCase       (_lowerCamelCase							:   int		)->      int:




     '''simple docstring'''





     if n <= 1:
          return n
     __snake_case			    =     0
     __snake_case			    =     1
     for _ in range(2      ,		n + 1		):
          __snake_case    ,			__snake_case			    =     fiba, fiba + fiba
     return fiba







def 	_UpperCamelCase       ()->      None:




     '''simple docstring'''





     for ordinal in "0th 1st 2nd 3rd 10th 100th 1000th".split():
          __snake_case			    =     int(''''''.join(c for c in ordinal if c in '''0123456789'''		)		)  # 1000th --> 1000
          print(
              f'''{ordinal} fibonacci number using matrix exponentiation is '''
              f'''{nth_fibonacci_matrix(_lowerCamelCase		)} and using bruteforce is '''
              f'''{nth_fibonacci_bruteforce(_lowerCamelCase		)}\n'''		)
     # from timeit import timeit
     # print(timeit("nth_fibonacci_matrix(1000000)",
     #              "from main import nth_fibonacci_matrix", number=5))
     # print(timeit("nth_fibonacci_bruteforce(1000000)",
     #              "from main import nth_fibonacci_bruteforce", number=5))
     # 2.3342058970001744
     # 57.256506615000035


if __name__ == "__main__":
     import doctest

     doctest.testmod()
     main()






