854 Pisano Periods 2 -- v2.sf 442 B

123456789101112131415161718192021222324252627282930
  1. #!/usr/bin/ruby
  2. # Pisano Periods 2
  3. # https://projecteuler.net/problem=854
  4. # See also:
  5. # https://oeis.org/A005013
  6. # Runtime: 4.014s
  7. func P(n, m=1_234_567_891) {
  8. var v = 2
  9. var (a,b) = (0, 1)
  10. var (c,d) = (2, 1)
  11. for k in (2..n `by` 2) {
  12. v = mulmod(v, (k.is_congruent(0, 4) ? b : d), m)
  13. (a,b) = (b, addmod(a,b,m))
  14. (c,d) = (d, addmod(c,d,m))
  15. }
  16. return v
  17. }
  18. assert_eq(P(10), 264)
  19. say P(1e6)