057 Square root convergents.pl 759 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Website: https://github.com/trizen
  5. # https://projecteuler.net/problem=57
  6. # Runtime: 0.288s
  7. use 5.020;
  8. use Memoize qw(memoize);
  9. use Math::AnyNum qw(:overload);
  10. use experimental qw(signatures);
  11. memoize('kn');
  12. memoize('kd');
  13. sub a($n) { 1 } # numerator
  14. sub b($n) { 2 } # denominator
  15. sub kn($n) {
  16. $n < 2
  17. ? ($n == 0 ? 1 : 0)
  18. : b($n - 1) * kn($n - 1) + a($n - 1) * kn($n - 2);
  19. }
  20. sub kd($n) {
  21. $n < 2
  22. ? $n
  23. : b($n - 1) * kd($n - 1) + a($n - 1) * kd($n - 2);
  24. }
  25. my $count = 0;
  26. for my $i(1..1000) {
  27. my $x = kn($i);
  28. my $y = kd($i);
  29. my $z = $x+$y;
  30. if (int(log($z)/log(10)) > int(log($y)/log(10))) {
  31. ++$count;
  32. }
  33. }
  34. say $count;