622 Riffle Shuffles -- v2.pl 510 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 13 March 2018
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=622
  6. # Runtime: 0.183s
  7. use 5.020;
  8. use strict;
  9. use warnings;
  10. use Math::AnyNum qw(:overload);
  11. use experimental qw(signatures);
  12. use ntheory qw(znorder lcm divisors);
  13. sub rshuffle_cycle_len ($n) {
  14. lcm(2, znorder(2, $n - 1));
  15. }
  16. my $n = 60;
  17. my $sum = 0;
  18. foreach my $d (divisors(2**$n - 1)) {
  19. if (rshuffle_cycle_len($d + 1) == $n) {
  20. $sum += $d + 1;
  21. }
  22. }
  23. say $sum;