700 Eulercoin.sf 866 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 09 February 2020
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=700
  6. # Runtime: ~100ms.
  7. # Using the denominators of Farey approximations of 1504170715041707 / 4503599627370517.
  8. # See also:
  9. # https://en.wikipedia.org/wiki/Farey_sequence
  10. func farey_approximations(r, callback) {
  11. var a1 = r.int
  12. var b1 = 1
  13. var a2 = a1+1
  14. var b2 = 1
  15. loop {
  16. var a3 = a1+a2
  17. var b3 = b1+b2
  18. if (a3 < r*b3) {
  19. (a1, b1) = (a3, b3)
  20. }
  21. else {
  22. (a2, b2) = (a3, b3)
  23. }
  24. callback(a3, b3)
  25. }
  26. }
  27. var a = 1504170715041707
  28. var b = 4503599627370517
  29. var min = a
  30. var sum = min
  31. farey_approximations(a/b, {|_,d|
  32. var t = (a*d % b)
  33. if (t < min) {
  34. min = t
  35. sum += t
  36. break if (t == 0)
  37. }
  38. })
  39. say sum