#!/usr/bin/env ruby # -*- encoding: utf-8 -*- # Copyright Steffie Dorn , 2018 # License: GNU APGLv3 (or later) module Math class << self def harmonic n (1..n).reduce(0.0){|s, i| s + (1.0 / i)} end def zipf k, n 1.0 / (k.to_f * harmonic(n)) end def tolerance total θ = total / Math.log(total) θ > total ? total : θ.round end alias :tolerate :tolerance alias :θ :tolerance # TODO meh iterative solution def sufficiency exceptions n = 1 n += 1 while θ(n) < exceptions n end alias :sufficient :sufficiency def factorial n (2..n).reduce(1){|f, x| f * x} end def choose k, n Math.factorial(n) / (Math.factorial(k) * Math.factorial(n - k)) end def mass_index coeff, mass, height, adjustment=1.0 h /= 100.0 if (50..300).include? h # cm -> m auto-correction adjustment * (mass / (height ** coeff)) end def mass_index_at coeff, index, height, adjustment=1.0 h /= 100.0 if (50..300).include? h # cm -> m auto-correction index * (height ** coeff) / adjustment end def bmi m, h ; mass_index 2.0, m, h ; end def bmi_adj m, h ; mass_index 2.5, m, h, 1.3 ; end def bsi m, h ; mass_index 3.0, m, h ; end def bmi_at i, h ; mass_index_at 2.0, i, h ; end def bmi_adj_at i, h ; mass_index_at 2.5, i, h, 1.3 ; end def bsi_at i, h ; mass_index_at 3.0, i, h ; end end end