133 Repunit nonfactors.pl 846 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 14 May 2017
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=133
  7. # Runtime: 2 min, 7 sec
  8. use 5.010;
  9. use strict;
  10. use warnings;
  11. use ntheory qw(prime_iterator powmod gcd primes vecsum);
  12. my %factors;
  13. my $limit = 100_000;
  14. my $iter = prime_iterator();
  15. OUTER: while ((my $p = $iter->()) < $limit) {
  16. ($p == 2 or $p == 5) && next;
  17. my $sum = 0;
  18. my $period = 0;
  19. foreach my $k (0 .. $p) {
  20. $sum += powmod(10, $k, $p);
  21. $sum %= $p;
  22. $period += 1;
  23. if ($sum == 0) {
  24. (powmod(10, $k, $period) == 0) ? last : next OUTER;
  25. }
  26. }
  27. if ($sum == 0) {
  28. $factors{$p} = 1;
  29. say "$p is a prime factor (period: $period)";
  30. }
  31. }
  32. say vecsum(grep { not exists $factors{$_} } @{primes($limit)});