854 Pisano Periods 2.pl 527 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/perl
  2. # Pisano Periods 2
  3. # https://projecteuler.net/problem=854
  4. # See also:
  5. # https://oeis.org/A005013
  6. # Runtime: 0.405s
  7. use 5.036;
  8. use ntheory qw(:all);
  9. sub P($n, $m = 1_234_567_891) {
  10. my $v = 2;
  11. my ($a, $b) = (0, 1);
  12. my ($c, $d) = (2, 1);
  13. for (my $k = 2 ; $k <= $n ; $k += 2) {
  14. $v = mulmod($v, ($k % 4 == 0 ? $b : $d), $m);
  15. ($a, $b) = ($b, addmod($a, $b, $m));
  16. ($c, $d) = ($d, addmod($c, $d, $m));
  17. }
  18. return $v;
  19. }
  20. P(10) == 264 or die "error";
  21. say P(1e6);