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:
* Sidef::Object::Object
METHODS
avg
Math.avg(list...)
Returns the arithmetic mean of a list of numbers.
say Math.avg(42, 50, 99, 147) #=> 84.5
Aliases: arithmetic_mean
batch_gcd
Math.batch_gcd(list...)
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) #=> [489, 1969, 163, 235]
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 }) #=> 3^43
say Math.binary_exp(0, 3, 43, {|a,b| a + b }) #=> 3*43
binsplit
Math.binsplit(block, list...)
Binary splitting algorithm.
var arr = [1,2,3,4,5,6,7]
# Sum of a list using binary splitting
say Math.binsplit({|a,b| a + b }, arr...)
# Product of a list using binary splitting
say Math.binsplit({|a,b| a * b }, arr...)
chinese
Math.chinese(pairs...)
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]) #=> 87041638
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 } # count from 1 to 10
The value of conditionBlock
can be nil
, which creates an infinite Enumerator object:
say Math.for(2, nil, { .next_prime }).first(25) # array of first 25 primes
gcd
Math.gcd(list...)
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) #=> [43, 43, 97, 503]
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) #=> 74.352051512093712...
harmonic_mean
Math.harmonic_mean(list...)
Returns the harmonic mean of a list of numbers.
say Math.harmonic_mean(42, 50, 99, 147) #=> 65.883471411109602...
lcm
Math.lcm(list...)
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) #=> [0, 1, 1, 2, 3, 5]
say Math.linear_rec([3, -3, 1], [0, 1, 3], 0, 5) #=> [0, 1, 3, 6, 10, 15]
say Math.linear_rec([4, -6, 4, -1], [0, 1, 5, 14], 100000) #=> 333338333350000
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) #=> 42 (== fibmod(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.
# Map 25 from 1..100, to 1..10
say Math.map(25, 1, 100, 1, 10) #=> 3.181818181...
max
Math.max(list...)
Returns the largest numerical value from a list of numbers.
min
Math.min(list...)
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.
# Map the value 25 as a percentage, from a range 1..400
say Math.num2percent(25, 1, 400) #=> 6.01503759398...
prod
Math.prod(list...)
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) #=> RangeNum(2, 5, 3/10)
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) #=> 55
say Math.range_sum(1, 10, 2) #=> 30.25
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]) #=> [5, 6, 5, 4, 8]
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) # prime numbers
say Math.seq(1, 1, { .last(2).sum }).first(30) # Fibonacci numbers
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) # 7-smooth numbers
var b = Math.smooth_numbers(2,5,7) # 7-smooth numbers not divisible by 3
say a.first(30)
say b.first(30)
# Iteration is also supported
a.each {|k|
if (k > 1e5) {
say k #=> 100352
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 }) #=> [1, 1]
say Math.solve_rec_seq(30.of { .square }) #=> [3, -3, 1]
say Math.solve_rec_seq(30.of { .faulhaber(2) }) #=> [4, -6, 4, -1]
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 }) #=> x^2
say Math.solve_seq(20.of { .faulhaber(2) }) #=> 1/3*x^3 + 1/2*x^2 + 1/6*x
Example with offset:
say Math.solve_seq(20.of { (_+10)**3 }) #=> x^3 + 30*x^2 + 300*x + 1000
say Math.solve_seq(20.of { (_+10)**3 }, 10) #=> x^3
sum
Math.sum(list...)
Returns the sum of a list of numbers.