fork download
  1. def pisano(m):
  2. if m == 1:
  3. return 1
  4.  
  5. """
  6. toda sequência tem tamanho par, então posso começar de n = 2 e terminar quando
  7. obter:
  8.  
  9. f_n_minus_1 == 0
  10. f_n == 1
  11. """
  12.  
  13. f_n_minus_1 = 1
  14. f_n = 1
  15. n = 2
  16.  
  17. while not(f_n_minus_1 == 0 and f_n == 1):
  18. f_n_plus_1 = (f_n + f_n_minus_1) % m
  19. f_n_minus_1 = f_n
  20. f_n = f_n_plus_1
  21. n += 1
  22. return n - 1
  23.  
  24. def fib_mod(n, m):
  25. n = n % pisano(m)
  26. if n == 0:
  27. return 0
  28. f_x_minus_1 = 0
  29. f_x = 1
  30. x = 1
  31. while x < n:
  32. f_x_plus_1 = (f_x + f_x_minus_1) % m
  33. f_x_minus_1 = f_x
  34. f_x = f_x_plus_1
  35. x += 1
  36. return f_x
  37.  
  38. def fib_fib_mod(n, m):
  39. return fib_mod(fib_mod(n, pisano(m)), m)
  40.  
  41.  
  42. for (n, m) in ((1,100),(2,100),(3,100),(4,100),(5,100),(5,2),(6,100), (10**9,10)):
  43. print("fib_fib_mod({}, {}) = {}".format(n, m, fib_fib_mod(n, m)))
  44.  
  45.  
Success #stdin #stdout 0.04s 9408KB
stdin
Standard input is empty
stdout
fib_fib_mod(1, 100) = 1
fib_fib_mod(2, 100) = 1
fib_fib_mod(3, 100) = 1
fib_fib_mod(4, 100) = 2
fib_fib_mod(5, 100) = 5
fib_fib_mod(5, 2) = 1
fib_fib_mod(6, 100) = 21
fib_fib_mod(1000000000, 10) = 0