module AlphaMath

Public Class Methods

decomposition(number, factors = []) click to toggle source
# File lib/alpha_math.rb, line 5
def self.decomposition(number, factors = [])
  return factors if number == 1
  (2..number).each do |divisor|
    divmod = number.divmod(divisor)
    quotient, rest = divmod.first, divmod.last
    if rest.zero?
      factors << divisor
      return decomposition(quotient, factors)
    end
  end
end
digital_root(number) click to toggle source
# File lib/alpha_math.rb, line 17
def self.digital_root(number)
  return 0 if number == 0
  rest = number.divmod(9).last
  rest == 0 ? 9 : rest
end
divisors_of(number) click to toggle source
# File lib/alpha_math.rb, line 23
def self.divisors_of(number)
  (1..number / 2).select { |divisor| number.divmod(divisor).last.zero? } << number
end
magnitude(number) click to toggle source
# File lib/alpha_math.rb, line 27
def self.magnitude(number)
  return -Float::INFINITY if number == 0
  decimal, power = ("%e" % number.abs).split('e')
  decimal, power = Float(decimal), Integer(power)
  decimal < 5 ? power : power + 1
end
partitions(number) click to toggle source
# File lib/alpha_math.rb, line 65
def self.partitions(number)
  Partitions.new.enumerates(number)
end
power_of_2?(number) click to toggle source
# File lib/alpha_math.rb, line 34
def self.power_of_2?(number)
  number.to_s(2).count('1') == 1
end
prime?(number) click to toggle source
# File lib/alpha_math.rb, line 38
def self.prime?(number)
  return false if number < 2
  (2..Math.sqrt(number).to_i).each do |divisor|
    return false if number.divmod(divisor).last.zero?
  end
end
primorial(number) click to toggle source
# File lib/alpha_math.rb, line 45
def self.primorial(number)
  primes = []
  (2...Float::INFINITY).each do |value|
    if primes.count < number
      primes << value if prime?(value)
    else
      return primes.inject(:*)
    end
  end
end
trailing_zeros_of_factorial(number) click to toggle source
# File lib/alpha_math.rb, line 56
def self.trailing_zeros_of_factorial(number)
  zeros, multiple = 0, 5
  while (count = number / multiple) != 0
    zeros += count
    multiple *= 5
  end
  zeros
end