066 Diophantine equation.sf 590 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 12 February 2018
  4. # License: GPLv3
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=66
  7. # Runtime: 0.325s
  8. func cfrac_denominator (cfrac) {
  9. var (f1, f2) = (0, 1)
  10. for n in (cfrac) {
  11. (f1, f2) = (f2, n*f2 + f1)
  12. }
  13. return f1
  14. }
  15. func solve_pell (d) {
  16. var (k, *period) = sqrt_cfrac(d)...
  17. 2.times {
  18. var x = cfrac_denominator([k, period...])
  19. var p = (4*d * (x*x - 1))
  20. p.is_square && return x
  21. period += period
  22. }
  23. }
  24. say (2..1000 -> max_by {|n|
  25. solve_pell(n)
  26. })