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.