function_inverse_binary_search.sf 1001 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 29 July 2018
  4. # https://github.com/trizen
  5. # Compute the inverse of any function, using the binary search algorithm.
  6. # See also:
  7. # https://en.wikipedia.org/wiki/Binary_search_algorithm
  8. func binary_inverse (n, f, min=0, max=n, prec=192) {
  9. local Number!PREC = prec.numify
  10. (min, max) = (max, min) if (min > max)
  11. loop {
  12. var m = (min+max)/2
  13. var c = (f(m) <~> n)
  14. if (c < 0) {
  15. min = m
  16. }
  17. elsif (c > 0) {
  18. max = m
  19. }
  20. else {
  21. return m
  22. }
  23. }
  24. }
  25. say binary_inverse( 2, {|x| x.exp }) # solution to x for: exp(x) = 2
  26. say binary_inverse( 43, {|x| x**2 }) # solution to x for: x^2 = 43
  27. say binary_inverse(-43, {|x| x**3 }) # solution to x for: x^3 = -43
  28. # Find the value of x such that Li(x) = 100
  29. say binary_inverse(100, {|x| Li(x) }, min: 1, max: 1e6, prec: 200) #=> 488.87190985280753190605086392033334827378018556409