Module:Utils
- This module primarily serves as a library for other modules and has no corresponding template.
This module provides several mathematical functions which are likely to be used frequently on the Xenharmonic Wiki.
Namely, the functions in this module can be called from other modules by using require("Module:Utils") and calling the desired functions.
For pairs of functions with names that differ by a single leading underscore (for example, gcd and _gcd), the function with an underscore is meant to be called by other modules, and the function without an underscore can be used with #invoke.
| Introspection summary for Module:Utils | ||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||||||||||||||||||||||||
No function descriptions were provided. The Lua code may have further information.
Functions
trim(s)- Removes leading and trailing whitespaces (but not interior ones) from a string.
_yesno(frame)- Wrapper function for Module: Yesno, for use with templates. (Module: Yesno does not have a corresponding template.)
_clamp(value, min_value, max_value)- Returns
valuesuch that it is betweenmin_valueandmax_value.
table_contains(tbl, value, compare_func)*- Checks whether table
tblcontainsvalueand returnstrue(if found) orfalseif not found. Passingcompare_funcis optional; By default,valueis a numeric value or a string; to check for other values, such as ratios defined by Module: Rational, a comparison functioncompare_funcmust be passed in.
index_of(array, value, compare_func)*- Returns the first index with the given
value(or nil if not found). Passingcompare_funcis optional. By default,valueis a numeric value or a string; to check for other values, such as ratios defined by Module:Rational, a comparison functioncompare_funcmust be passed in.
value_provided(s)*- Checks whether
sis a non-empty string.
eval_num_arg(input, def_value)*- Evaluates
inputas a number, fraction notation supported but not other expressions; usesdef_valueon error.
log(x, b)- Returns the logarithm base
bofx. Parameterbdefaults to base 2 (octave) if it is omitted.
log2(x)- Returns the base-2 logarithm of
x.
gcd(a, b)- Returns the greatest common divisor of
aandb.
round_dec(x, places)- Returns
xrounded to a precision ofplacesdecimal places. Parameterplacesdefaults to 0 if it is omitted.
round(x, prec)- Returns
xrounded to a precision ofprecsignificant figures. Parameterprecdefaults to 6 if it is omitted.
is_prime(n)*- Returns
trueif the given integernis a prime number.
prime_factorization(n)- Returns the prime factorization of the given integer
nusing the exponential form (in wikitext).
prime_factorization_raw(n)*- Returns a table encoding the prime factorization of
n.
signum(x)*- Returns 1 for positive numbers, −1 for negative ones, and 0 for zero and non-integer inputs.
next_young_diagram(d)- Returns the next Young diagram of the same size; the first one is
[N], the last one is[1, 1, …, 1]. After the last one,nilis returned. The input table is modified.
* These functions are designed to be used by other modules only; they cannot be called with {{#invoke: }}.
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- evaluate input on error use default; cannot be used with {{#invoke:}}
function p.eval_num_arg(input, def_value)
local result = input
if type(input) ~= 'number' then
result = def_value
if type(input) == 'string' then
-- check for fraction notation
if input:match('/') == '/' then
local denominator = 1
input, denominator = input:match("^%s*([0-9]+)[/?]([0-9]+)%s*$")
result = (tonumber(input) or def_value)/(tonumber(denominator) or 1)
else
input = input:match("^%s*(.-)%s*$")
result = tonumber(input)
end
end
end
return result
end
-- return logarithm base b of x
function p.log(frame)
local args = getArgs(frame)
return p._log(args[1], args[2])
end
function p._log(x, b)
-- x defaults to 0
x = p.eval_num_arg(x, 0)
-- b defaults to 2 ("octave")
b = p.eval_num_arg(b, 2)
return math.log(x)/math.log(b)
end
-- return x rounded to places decimal places
function p.round_dec(frame)
local args = getArgs(frame)
return p._round_dec(args[1], args[2])
end
function p._round_dec(x, places)
-- x defaults to 0
x = p.eval_num_arg(x, 0)
-- places defaults to 0
places = p.eval_num_arg(places, 0)
return math.floor (x * 10^places + 0.5)/10^places
end
-- return x rounded to a precision of prec significant figures
function p.round(frame)
local args = getArgs(frame)
return p._round(args[1], args[2])
end
function p._round(x, prec)
-- x defaults to 0
x = p.eval_num_arg(x, 0)
-- prec defaults to 6
prec = p.eval_num_arg(prec, 6)
return p._round_dec(x, prec - math.floor (p._log (math.abs (x), 10)) - 1)
end
-- cached list of primes for is_prime
local primes = {
[0] = false,
[1] = false
}
-- returns true if integer n is prime; cannot be used with {{#invoke:}}
function p.is_prime(n)
local cached = primes[n]
if cached ~= nil then
return cached
end
for i = 2, math.sqrt(n) do
if n % i == 0 then
primes[n] = false
return false
end
end
primes[n] = true
return true
end
-- returns prime factorization of integer n > 1; cannot be used with {{#invoke:}}
-- note: the order of keys is not specified for Lua tables
function p.prime_factorization_raw(n)
local factors = {}
local m = n
for i = 2, math.sqrt(n) + 1 do
while m % i == 0 do
factors[i] = factors[i] or 0
factors[i] = factors[i] + 1
m = m / i
end
if m == 1 then
break
end
end
if m > 1 then
factors[m] = factors[m] or 1
end
return factors
end
-- returns prime factorization of integer n > 2 (with wiki markup for exponents)
function p.prime_factorization(frame)
local args = getArgs(frame)
return p._prime_factorization(args[1])
end
function p._prime_factorization(n)
if n <= 1 then
return tostring(n)
end
local factors, powers = {}, {}
local new_number = p.eval_num_arg(n, 12)
for i = 2, n do
if p.is_prime(i) then
if new_number % i == 0 then
factors[#factors + 1] = i
powers[#factors] = 0
while new_number % i == 0 do
powers[#factors] = powers[#factors] + 1
new_number = new_number / i
end
if powers[#factors] > 1 then
powers[#factors] = factors[#factors] .. "<sup>" .. powers[#factors] .. "</sup>"
else
powers[#factors] = factors[#factors]
end
end
end
if new_number == 1 then
break
end
end
return table.concat(powers, " × ")
end
-- returns signum(x); cannot be used with {{#invoke:}}
function p.signum(x)
if type(x) ~= 'number' then
return 0
end
if x > 0 then return 1 end
if x < 0 then return -1 end
return 0
end
return p