continued_fraction_to_fraction.sf 924 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 15 July 2017
  4. # https://github.com/trizen
  5. # Convert a finite continued fraction to a fraction.
  6. #
  7. ## Straightforward solution
  8. #
  9. func cfrac2num(f) {
  10. func (i) {
  11. (i < f.end) ? (f[i] + 1/__FUNC__(i+1)) : f[i]
  12. }(0)
  13. }
  14. #
  15. ## Computing the numerator and the denominator separately
  16. #
  17. func contfrac2num(f) {
  18. f = [f[-1], f...]
  19. func kd((0)) { 1 }
  20. func kd((1)) { 0 }
  21. func kd (n) is cached {
  22. f[n-1]*kd(n - 1) + kd(n - 2)
  23. }
  24. func kn((0)) { 0 }
  25. func kn((1)) { 1 }
  26. func kn (n) is cached {
  27. f[n-1]*kn(n - 1) + kn(n - 2)
  28. }
  29. kn(f.len) / kd(f.len)
  30. }
  31. var b = [2,3,4,7,8,12,13,4]
  32. say cfrac2num(b).as_frac # 1141741/494582
  33. say contfrac2num(b).as_frac # =//=
  34. say ''
  35. var d = [19,2,3,19,42,13,9,66,7]
  36. say cfrac2num(d).as_frac #=> 6047225352/311237315
  37. say contfrac2num(d).as_frac # =//=