Module: FigurateNumbers::Utils
- Defined in:
- lib/figurate_numbers/utils/utils.rb
Overview
Module containing utility methods for working with figurate number sequences.
Class Method Summary collapse
- .binomial_coefficient(n, k) ⇒ Object
- .factorial_iter(num) ⇒ Object
- .figurate_binomial(n, k, seq) ⇒ Object
- .pseudo_pochhammer_function(n, k) ⇒ Object
- .pseudo_rising_factorial(n, k) ⇒ Object
- .rising_factorial(n, k) ⇒ Object
Class Method Details
.binomial_coefficient(n, k) ⇒ Object
14 15 16 |
# File 'lib/figurate_numbers/utils/utils.rb', line 14 def binomial_coefficient(n, k) factorial_iter(n) / (factorial_iter(k) * factorial_iter(n - k)) end |
.factorial_iter(num) ⇒ Object
6 7 8 9 10 11 12 |
# File 'lib/figurate_numbers/utils/utils.rb', line 6 def factorial_iter(num) t = 1 (1..num).each do |i| t *= i end t end |
.figurate_binomial(n, k, seq) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/figurate_numbers/utils/utils.rb', line 38 def figurate_binomial(n, k, seq) raise ArgumentError, "n must be a non-negative Integer" unless n.is_a?(Integer) && n >= 0 raise ArgumentError, "k must be an Integer between 0 and n" unless k.is_a?(Integer) && k.between?(0, n) k = [k, n - k].min first = [] last = [] (1..n).each do |i| value = seq.next first << value if i <= k last << value if i > n - k end numerator = 1 denominator = 1 k.times do |i| numerator *= last[i] denominator *= first[i] gcd = numerator.gcd(denominator) numerator /= gcd denominator /= gcd end denominator == 1 ? numerator : Rational(numerator, denominator) end |
.pseudo_pochhammer_function(n, k) ⇒ Object
34 35 36 |
# File 'lib/figurate_numbers/utils/utils.rb', line 34 def pseudo_pochhammer_function(n, k) (n..(n + k - 2)).reduce(:*) end |
.pseudo_rising_factorial(n, k) ⇒ Object
26 27 28 29 30 31 32 |
# File 'lib/figurate_numbers/utils/utils.rb', line 26 def pseudo_rising_factorial(n, k) t = 1 (n..(n + k - 2)).each do |i| t *= i end t end |
.rising_factorial(n, k) ⇒ Object
18 19 20 21 22 23 24 |
# File 'lib/figurate_numbers/utils/utils.rb', line 18 def rising_factorial(n, k) t = 1 (n..(n + k - 1)).each do |i| t *= i end t end |