044 Pentagon numbers.pl 658 B

1234567891011121314151617181920212223242526272829303132333435
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 28 January 2017
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=44
  7. # Runtime: 1.210s
  8. use 5.010;
  9. use strict;
  10. use integer;
  11. use ntheory qw(is_power sqrtint);
  12. sub is_pentagonal {
  13. my ($n) = @_;
  14. is_power(24*$n + 1, 2)
  15. && sqrtint(24*$n + 1) % 6 == 5 ? 1 : 0;
  16. }
  17. OUTER: for (my $n = 1 ; ; ++$n) {
  18. my $p1 = $n * (3*$n - 1) >> 1;
  19. foreach my $m (1 .. $n) {
  20. my $p2 = $m * (3*$m - 1) >> 1;
  21. if ( is_pentagonal($p1 + $p2)
  22. and is_pentagonal(abs($p1 - $p2))) {
  23. say abs($p1 - $p2);
  24. last OUTER;
  25. }
  26. }
  27. }