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

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

Raises:

  • (ArgumentError)


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