435 Polynomials of Fibonacci numbers.pl 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 11 October 2017
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=435
  6. # Runtime: ~1 minute, 33 seconds.
  7. use 5.026;
  8. use strict;
  9. use warnings;
  10. use experimental qw(signatures);
  11. use ntheory qw(addmod mulmod powmod lcm factor_exp factorial);
  12. sub pisano_period($mod) {
  13. my sub find_period($mod) {
  14. my ($x, $y) = (0, 1);
  15. for (my $n = 1 ; ; ++$n) {
  16. ($x, $y) = ($y, addmod($x, $y, $mod));
  17. if ($x == 0 and $y == 1) {
  18. return $n;
  19. }
  20. }
  21. }
  22. my @prime_powers = map { $_->[0]**$_->[1] } factor_exp($mod);
  23. my @power_periods = map { find_period($_) } @prime_powers;
  24. return lcm(@power_periods);
  25. }
  26. my $mod = factorial(15);
  27. my $n = powmod(10, 15, pisano_period(factorial(14))); # 870400
  28. my $sum = 0;
  29. my ($f1, $f2) = (0, 1);
  30. foreach my $k (1 .. $n) {
  31. my $power_sum = 0;
  32. foreach my $x (1 .. 100) {
  33. $power_sum = addmod($power_sum, powmod($x, $k, $mod), $mod);
  34. }
  35. $sum = addmod($sum, mulmod($f2, $power_sum, $mod), $mod);
  36. ($f1, $f2) = ($f2, addmod($f1, $f2, $mod));
  37. }
  38. say $sum;