NAME
Sidef::Math::Math
DESCRIPTION
The Math
class implements several useful mathematical functions.
SYNOPSIS
say Math.lcm(3,4,5)
say Math.avg(1,2,3,4)
|
INHERITS
Inherits methods from:
METHODS
avg
Returns the arithmetic mean of a list of numbers.
say Math.avg(42, 50, 99, 147)
|
Aliases: arithmetic_mean
batch_gcd
Efficiently computes the batch-gcd of a list of integers.
say Math.batch_gcd(1909,2923,291,205,989,62,451,1943,1079,2419)
|
Output:
[1909, 1, 1, 41, 23, 1, 41, 1, 83, 41]
|
batch_invmod
Math.batch_invmod(array, n)
|
Efficiently computes the modular multiplicative inverses of a list of integers, modulo n
.
say Math.batch_invmod([33, 42, 99, 103], 2017)
|
binary_exp
Math.binary_exp(c, x, n, {|a,b| ... })
|
Generic implementation of the binary exponentiation algorithm, using the binary expansion of n
.
say Math.binary_exp(1, 3, 43, {|a,b| a * b })
say Math.binary_exp(0, 3, 43, {|a,b| a + b })
|
binsplit
Math.binsplit(block, list...)
|
Binary splitting algorithm.
var arr = [1,2,3,4,5,6,7]
say Math.binsplit({|a,b| a + b }, arr...)
say Math.binsplit({|a,b| a * b }, arr...)
|
chinese
Returns the solution for x
in x ≡ a_k (mod m_k)
, using the Chinese Remainder Theorem (CRT), given a list of pairs [a_k,m_k]
:
say Math.chinese([14,643], [254,419], [87,733])
|
for
Math. for (initial, conditionBlock, nextTermBlock)
|
Returns an Enumerator object, generating a sequence of numbers based on the conditionBlock
and nextTermBlock
blocks.
Math. for (1, { _ <= 10 }, { .inc }). each { . say }
|
The value of conditionBlock
can be nil
, which creates an infinite Enumerator object:
say Math. for (2, nil, { .next_prime }).first(25)
|
gcd
Returns the greatest common divisor (GCD) of a list of integers.
gcd_factors
Math.gcd_factors(n, [a, b, ...])
|
Given a positive integer and an array of integers, it tries to find non-trivial factors of n, checking each gcd(n, array[0])
, gcd(n, array[1])
, etc.
var n = 43*43*97*503
var a = [19*43*97, 1, 13*41*43*101]
say Math.gcd_factors(n, a)
|
The product of the factors gives back n
. However, some factors may be composite.
geometric_mean
Math.geometric_mean(list...)
|
Returns the geometric mean of a list of numbers.
say Math.geometric_mean(42, 50, 99, 147)
|
harmonic_mean
Math.harmonic_mean(list...)
|
Returns the harmonic mean of a list of numbers.
say Math.harmonic_mean(42, 50, 99, 147)
|
lcm
Returns the least common multiple (LCM) of a list of integers.
linear_rec
Math.linear_rec(ker, init, n)
Math.linear_rec(ker, init, from, to)
|
Returns the n-th term or the terms with indices in the range from
.. to
(as an Array object), by iterating the linear recurrence with kernel ker
starting with initial values init
.
say Math.linear_rec([1, 1], [0, 1], 0, 5)
say Math.linear_rec([3, -3, 1], [0, 1, 3], 0, 5)
say Math.linear_rec([4, -6, 4, -1], [0, 1, 5, 14], 100000)
|
Aliases: linear_recurrence
linear_recmod
Math.linear_recmod(ker, init, n, m)
|
Returns the n-th term modulo m
, defined by the linear recurrence with kernel ker
starting with initial values init
.
say Math.linear_recmod([1, 1], [0, 1], 43, 43)
|
Aliases: linear_recurrence_mod
linear_recurrence_matrix
Math.linear_recurrence_matrix(ker)
|
Returns a Matrix object that represents the given linear recurrence kernel.
map
Math. map (value, in_min, in_max, out_min, out_max)
|
Return a given value mapped from a given range to another given range.
say Math. map (25, 1, 100, 1, 10)
|
max
Returns the largest numerical value from a list of numbers.
min
Returns the smallest numerical value from a list of numbers.
num2percent
Math.num2percent(num, min, max)
|
Returns a given value as a percentage, given min
and max
of the value range.
say Math.num2percent(25, 1, 400)
|
prod
Returns the product of a list of numbers.
Aliases: product
product_tree
Math.product_tree(list...)
|
Return the product-tree of a list of integers.
say Math.product_tree(10,20,30,40,50,60)
|
range_map
Math.range_map(amount, from, to)
|
Returns a RangeNumber object with the amount
value mapped between the values from
and to
.
say Math.range_map(10, 2, 5)
|
range_sum
Math.range_sum(from, to, step)
|
Returns the sum of a given range and an optional given step.
say Math.range_sum(1, 10)
say Math.range_sum(1, 10, 2)
|
remainders
Math.remainders(n, array)
|
Efficiently returns the remainders of n
when divided by each integer from the given array.
say Math.remainders(8675309, [11,13,17,19,23])
|
seq
Math.seq(x, y, z, ..., {|a,n| ... })
|
Returns an Enumerator object which generates an infinite sequence specified by the initial terms and the given block.
Example:
say Math.seq(2, { . last .next_prime }).first(30)
say Math.seq(1, 1, { . last (2).sum }).first(30)
|
smooth_numbers
Math.smooth_numbers(primes...)
|
It returns an Enumerator object, which generates smooth numbers using the given list of primes.
Example:
var a = Math.smooth_numbers(2,3,5,7)
var b = Math.smooth_numbers(2,5,7)
say a.first(30)
say b.first(30)
a. each {|k|
if (k > 1e5) {
say k
break
}
}
|
solve_rec_seq
Math.solve_rec_seq(array)
|
Attempts to find a minimal linear recurrence that generates the given array of numbers:
say Math.solve_rec_seq(30.of { .fibonacci })
say Math.solve_rec_seq(30.of { .square })
say Math.solve_rec_seq(30.of { .faulhaber(2) })
|
Aliases: find_linear_recurrence
solve_seq
Math.solve_seq(array, offset=0)
|
Returns a Polynomial object that generates the terms of the given sequence.
Example:
say Math.solve_seq(20.of { .square })
say Math.solve_seq(20.of { .faulhaber(2) })
|
Example with offset:
say Math.solve_seq(20.of { (_+10)**3 })
say Math.solve_seq(20.of { (_+10)**3 }, 10)
|
sum
Returns the sum of a list of numbers.