NAME
Sidef::Types::Number::Number
DESCRIPTION
The Number
class implements support for numerical operations, supporting integers, rationals, floating-points and complex numbers at arbitrary precision.
This class also implements many useful mathematical methods, from basic arithmetical operations, to advanced number-theoretic functions, including primality testing and prime factorization methods.
The following class-variables can be changed during runtime:
Num!PREC = 192 # precision for floating-point numbers
Num!ROUND = 0 # rounding mode for floating-point numbers
Num!VERBOSE = false # true to enable verbose/debug mode
Num!USE_YAFU = false # true to use YAFU for factoring large integers
Num!USE_PFGW = false # true to use PFGW64 as a primality pretest for large enough n
Num!USE_PARI_GP = false # true to use PARI/GP in several methods
Num!USE_FACTORDB = false # true to use factordb.com for factoring large integers
Num!USE_PRIMESUM = false # true to use Kim Walisch's primesum in prime_sum(n)
Num!USE_PRIMECOUNT = false # true to use Kim Walisch's primecount in prime_count(n)
Num!USE_CONJECTURES = false # true to use conjectured methods for better performance
Num!SPECIAL_FACTORS = true # true to try to find factors of special form in factor(n)
The supported rounding modes for floating-point numbers, are:
Num!ROUND = 0 # Round to nearest.
Num!ROUND = 1 # Round towards zero.
Num!ROUND = 2 # Round towards +infinity.
Num!ROUND = 3 # Round towards -infinity.
Num!ROUND = 4 # Round away from zero. (with MPFR >= 3.0.0)
Num!ROUND = 5 # Faithful rounding. (with MPFR >= 4.0.0)
The values can also be modified only in a local scope, by using the local
keyword:
func f(n) {
local Num!PREC = 1024
# do some work
}
In the above example, the f(n)
function will use 1024
bits of precision for floating-point numbers, while outside the function, the default precision will be used.
NOTE: the local
scope extends to any other functions or methods that the are called from the local scope.
SYNOPSIS
var a = Num(string)
var b = Number(string, base)
INHERITS
Inherits methods from:
* Sidef::Object::Object
METHODS
!
n!
Factorial of n
. (1*2*3*...*n
)
Aliases: fac, factorial
!!
n!!
Double-factorial of n
.
Aliases: dfac, dfactorial, double_factorial
%
n % k
Remainder of n/k
.
Aliases: mod
%%
n %% k
Returns true if n
is divisible by k
. False otherwise.
Aliases: is_div
&
a & b
Bitwise AND operation.
Aliases: and
*
a * b
Multiplication of a
and b
.
Aliases: mul
**
a**b
Exponentiation: a
to power b
.
Aliases: pow
+
a + b
Addition of a
and b
.
Aliases: add
++
n++
++n
n.inc
Increment n
by 1
and return the result.
Aliases: inc
-
a - b
Subtraction of a
and b
.
Aliases: sub
--
n--
--n
n.dec
Decrement n
by 1
and return the result.
Aliases: dec
..
a .. b
Create an inclusive-inclusive RangeNum
object, from a
to b
.
Equivalent with:
RangeNum(a, b)
Aliases: to, upto
..^
a ..^ b
Create an inclusive-exclusive RangeNum
object, from a
to b-1
.
Equivalent with:
RangeNum(a, b-1)
Aliases: xto, xupto
/
a / b
Division of a
by b
.
Aliases: ÷, div
//
a // b
Integer floor-division of a
and b
.
When a
and b
are integers, this is equivalent with:
floor(a/b)
Aliases: divint, fld, idiv, idiv_floor
:
a : b
Create a new complex number.
Equivalent with:
Complex(a, b)
Aliases: pair
<
a < b
Returns true if a
is less than b
.
Aliases: lt
<<
a << b
Left shift a
by b
bits, which is equivalent with (assuming a
and b
are integers):
floor(a * 2**b)
Aliases: lsft, shift_left
<=>
a <=> b
Comparison of a
with b
. Returns -1
if a
is less than b
, 0
if a
and b
are equal and +1
if a
is greater than b
.
Aliases: cmp
<~>
a <~> b
approx_cmp(a, b)
approx_cmp(a, b, k)
Approximate comparison of a
and b
.
Equivalent with:
a.round(k) <=> b.round(k)
When k
is omitted, it uses the default floating-point precision to deduce k
.
Aliases: approx_cmp
==
a == b
Equality check. Returns true if a
and b
are equal.
Aliases: eq
>
a > b
Returns true if a
is greater than b
. False otherwise.
Aliases: gt
>>
a >> b
Right shift a
by b
bits, which is equivalent with (assuming a
and b
are integers):
floor(a / 2**b)
Aliases: rsft, shift_right
^
a ^ b
Bitwise XOR operation.
Aliases: xor
^..
a ^.. b
Creates a reversed exclusive-inclusive RangeNum
object, from a-1
down to b
.
Equivalent with:
RangeNum(a-1, b, -1)
Aliases: xdownto
C
Num.C
Num.catalan_G
Returns the Catalan constant: 0.915965594177...
Aliases: catalan_G
Y
Num.Y
Num.EulerGamma
Returns the Euler–Mascheroni constant: 0.5772156649...
Aliases: γ, euler_gamma
|
a | b
Returns the bitwise OR or a
and b
.
Aliases: or
~
~a
a.not
Returns the bitwise NOT of a
.
Aliases: not
Γ
Γ(n)
gamma(n)
Num.gamma
When called as Num.gamma
, it returns the Euler-Mascheroni constant:
say Num.gamma #=> 0.5772156...
When given a numeric real value, it computes the gamma function (as a floating-point value), which has the identity:
gamma(n) = (n-1)!
Aliases: gamma
δ
δ(a,b)
The Kronecker delta function, which returns 1 iff a==b
and 0 otherwise.
Aliases: kronecker_delta
ζ
ζ(s)
zeta(s)
The Riemann Zeta function.
Aliases: zeta
η
η(s)
eta(s)
The Dirichlet eta function, defined as:
eta(s) = (1 - 2^(1-s)) * zeta(s)
Aliases: eta
μ
μ(n)
mu(n)
moebius(n)
The Möbius function: μ(n).
Aliases: mu, mobius, möbius, moebius
Π
Π(...)
prod(...)
Returns the product of a given list of numbers.
Aliases: prod, vecprod
π
π(n)
π(a,b)
Num.π
Returns the PI
numerical value:
say Num.pi #=> 3.1415...
When applied on a Number object (as n.pi
or pi(n)
), it returns the number of primes <= n
:
say 100.pi #=> number of primes <= 100
say pi(100) #=> 25
When an additional argument is given, it returns the number of primes in the range a..b
:
say pi(50, 100) # number of primes in the range 50..100
Aliases: pi
Σ
Σ(...)
sum(...)
Returns the sum of a given list of numbers.
Aliases: sum, vecsum
σ
σ(n,k=1)
sigma(n,k=1)
Returns the sum of the positive divisors of n
, each raised to the power k
.
Aliases: sigma
τ
Num.τ
Num.tau
τ(n)
tau(n)
Returns the TAU
constant (2*PI
), or the number of positive divisors of n
.
say Num.tau #=> 6.283185307179...
say tau(120) #=> 16
Aliases: tau
φ
Num.φ
Num.phi
φ(n)
phi(n,k=1)
Returns the golden ratio constant PHI
, or the Euler totient of n
.
say Num.phi #=> 1.618033988749...
say phi(180) #=> 48
Aliases: phi
Ψ
Ψ(x)
digamma(x)
The digamma function, defined as:
Γ'(x)
-------
Γ(x)
Aliases: digamma
Ω
Ω(n,k=0)
bigomega(n,k=0)
For k = 0
, it returns the number of prime factors of n
(counted with multiplicity).
In general, is equivalent with:
n.prime_power_divisors.sum {|d| n**k / d**k }
Aliases: bigomega
ω
ω(n,k=0)
omega(n,k=0)
For k = 0
, it returns the number of distinct prime factors of n
.
In general, is equivalent with:
n.prime_divisors.sum {|d| n**k / d**k }
Aliases: omega
≅
a ≅ b
Returns true if a
and b
are approximately equal to each other.
Aliases: =~=, approx_eq
≠
a ≠ b
Returns true if a
and b
are different from each other.
Aliases: !=, ne
≤
a ≤ b
Returns true if a
is less than or equal to b
.
Aliases: <=, le
≥
a ≥ b
Returns true if a
is greater than or equal to b
.
Aliases: >=, ge
abs
n.abs
The absolute value of n
.
abundancy
abundancy(n)
Returns the abundancy index of n
, defined as:
sigma(n)/n
Aliases: abundancy_index
acmp
acmp(a,b)
Absolute comparison of a
and b
, defined as:
abs(a) <=> abs(b)
acos
n.acos
Inverse cosine of n
in radians.
acosh
n.acosh
Inverse hyperbolic cosine of n
.
acot
n.acot
Inverse cotangent of n
in radians.
acoth
n.acoth
Inverse hyperbolic cotangent of n
.
acsc
n.acsc
Inverse cosecant of n
in radians.
acsch
n.acsch
Inverse hyperbolic cosecant of n
.
addmod
addmod(a, b, m)
Modular integer addition: (a+b) % m
.
say addmod(43, 97, 127) # == (43+97)%127
addmulmod
addmulmod(a, b, c, m)
Modular operation: (a + b*c) % m
.
agm
agm(a, b)
Arithmetic-geometric mean of a
and b
.
ai
x.ai
Ai(x)
Airy function of the first kind: Ai(x)
.
Aliases: airy
aliquot
aliquot(n)
Returns the sum of divisors of n
that are less than n
.
Equivalent with:
sigma(n) - n
all_composite
all_composite(...)
Returns true if all the given values are positive composite numbers.
all_prime
all_prime(...)
Returns true if all the given values are prime numbers.
allsqrtmod
allsqrtmod(a, n)
Given two integers a
and n
, return a sorted array of all modular square roots of a
mod |n|
. If no square root exists, an empty array is returned.
say allsqrtmod(4095, 8469) #=> [1110, 1713, 3933, 4536, 6756, 7359]
Aliases: sqrtmod_all
almost_prime_divisors
n.almost_prime_divisors
n.almost_prime_divisors(k)
Returns the k-almost prime divisors of n
.
say 5040.almost_prime_divisors(7) #=> [720, 1008, 1680, 2520]
When k
is omitted, an array of arrays with the k-almost prime divisors of n
, for each k
in the range 0..bigomega(n)
, is returned:
say 120.almost_prime_divisors #=> [[1], [2, 3, 5], [4, 6, 10, 15], [8, 12, 20, 30], [24, 40, 60], [120]]
almost_primes
k.almost_primes(n)
k.almost_primes(a,b)
Return an array with the k-almost primes <= n
, or in the range a..b
.
5.almost_primes(1e6) # array of 5-almost primes <= 1e6
5.almost_primes(1e5, 1e6) # array of 5-almost primes in the range [1e5, 1e6]
almost_prime_sum
k.almost_prime_sum(n)
k.almost_prime_sum(a,b)
Returns the sum of k-almost primes <= n
, or in the range a..b
.
say 1.almost_prime_sum(100) # sum of primes <= 100
say 2.almost_prime_sum(50, 100) # sum of semiprimes in range 50..100
antidivisor_count
antidivisor_count(n)
Returns the number of antidivisors of n
.
say antidivisor_count(13) #=> 4
say antidivisor_count(27) #=> 5
antidivisors
antidivisors(n)
Returns an array with the antidivisors of n
sorted from 1..n
.
Antidivisors of n
are numbers that do not divide n
by the largest possible margin.
say antidivisors(24) #=> [7, 16]
say antidivisors(128) #=> [3, 5, 15, 17, 51, 85]
antidivisor_sum
antidivisor_sum(n)
Returns the sum of anti-divisors of n
.
Aliases: antidivisor_sigma
approx_ge
approx_ge(a, b)
approx_ge(a, b, k)
True if a
is approximately greater than or equal to b
.
Equivalent with:
a.round(k) >= b.round(k)
approx_gt
approx_gt(a, b)
approx_gt(a, b, k)
True if a
is approximately greater than b
.
Equivalent with:
a.round(k) > b.round(k)
approx_le
approx_le(a, b)
approx_le(a, b, k)
True if a
is approximately less than or equal to b
.
Equivalent with:
a.round(k) <= b.round(k)
approx_lt
approx_lt(a, b)
approx_lt(a, b, k)
True if a
is approximately less than b
.
Equivalent with:
a.round(k) < b.round(k)
approx_ne
approx_ne(a, b)
approx_ne(a, b, k)
True if a
is approximately different than b
.
Equivalent with:
a.round(k) != b.round(k)
as_bin
n.as_bin
Returns a String
with the binary representation of n
.
say 42.as_bin # "101011"
as_dec
n.as_dec
n.as_dec(k)
Given a rational number n
, it returns its decimal expansion as a String
object, expanded at k
decimal places.
say (1/17 -> as_dec(10)) # 0.05882352941
say (1/17 -> as_dec(30)) # 0.0588235294117647058823529411765
Aliases: as_float
asec
n.asec
Inverse secant of n
in radians.
asech
n.asech
Inverse hyperbolic secant of n
.
as_frac
n.as_frac
n.as_frac(base)
String-representation of n
as fraction.
say 24.as_frac # 24/1
say bernoulli(10).as_frac # 5/66
say bernoulli(12).as_frac(36) # -j7/23u
If n
is an integer, it uses 1
for the denominator.
as_hex
n.as_hex
Returns a String representing the integer part of n
in hexadecimal (base 16).
say 42.as_hex # "2a"
Returns nil
when n
cannot be converted to an integer.
asin
n.asin
Inverse sine of n
in radians.
asinh
n.asinh
Inverse hyperbolic sine of n
.
as_int
n.as_int
n.as_int(base)
Returns a String representing the integer part of n
in a given base, where the base must be between 2 and 62.
When the base is omitted, it defaults to base 10.
say 255.as_int # "255"
say 255.as_int(16) # "ff"
Returns nil
when n
cannot be converted to an integer.
as_oct
n.as_oct
Returns a String representing the integer part of n
in octal (base 8).
say 42.as_oct # 52
Returns nil
when n
cannot be converted to an integer.
as_rat
n.as_rat
n.as_rat(base)
Returns a rational string-representation of n
in a given base, where the base must be between 2 and 62.
When the base is omitted, it defaults to base 10.
say as_rat(42) # "42"
say as_rat(2/4) # "1/2"
say as_rat(255, 16) # "ff"
Returns nil
when n
cannot be converted to a rational number.
atan
n.atan
Inverse tangent of n
in radians.
atan2
atan2(a, b)
Four-quadrant inverse tangent of a
and b
.
atanh
n.atanh
Inverse hyperbolic tangent of n
.
base
n.base(b)
Returns a String-representation of n
in a given base b
, which must be between 2 and 62.
Aliases: in_base
bdivisors
bdivisors(n)
Returns an array with the bi-unitary divisors of n
.
say 48.bdivisors #=> [1, 2, 3, 6, 8, 16, 24, 48]
These are divisors d
of n
that satisfy:
gcud(n/d, d) = 1
Aliases: biudivisors, bi_unitary_divisors
bell
n.bell
Returns the n-th Bell number.
Aliases: bell_number
bellmod
bellmod(n, m)
Returns the n-th Bell number modulo m
.
bern
n.bern
bernoulli(n)
bernoulli(n, x)
Returns the n-th Bernoulli number. When an additional argument is provided, it returns the n-th Bernoulli polynomial evaluated at x
.
say bernoulli(10).as_rat # B_10 = 5/66
say bernoulli(10, 2).as_rat # B_10(2) = 665/66
Aliases: bernfrac, bernoulli, bernoulli_number
bernoulli_numbers
bernoulli_numbers(n)
Returns an array containing the Bernoulli numbers with indices in the range 0..n
.
say bernoulli_numbers(5) #=> [1, -1/2, 1/6, 0, -1/30, 0]
say bernoulli_numbers(6) #=> [1, -1/2, 1/6, 0, -1/30, 0, 1/42]
bernoulli_polynomial
bernoulli_polynomial(n)
bernoulli_polynomial(n, x)
Returns the n-th Bernoulli polynomial: B_n(x)
.
When x
is omitted, a Polynomial object is returned.
bernreal
n.bernreal
Return an approximation to the n-th Bernoulli number as a floating-point number.
bessel_j
bessel_j(x, n)
First order Bessel function: J_n(x)
.
bessel_y
bessel_y(x, n)
Second order Bessel function: Y_n(x)
.
beta
beta(a, b)
The beta function (also called the Euler integral of the first kind).
Defined as:
beta(a, b) = gamma(a)*gamma(b) / gamma(a+b)
binomialmod
binomialmod(n, k, m)
Returns the binomial coefficient binomial(n,k)
modulo m
.
say binomialmod(1e10, 1e5, 20!) #=> 286953611424480000
Equivalent with (but much faster):
binomial(n,k) % m
bit
n.bit(k)
n.getbit(k)
Returns 1 if bit k
of n
is set, and 0 if it is not set.
Return nil
when n
cannot be truncated to an integer or when k
is negative.
say getbit(0b1001, 0) # 1
say getbit(0b1000, 0) # 0
Aliases: getbit, testbit
bits
n.bits
Returns the binary digits of n
.
The bits are ordered from the most significant bit to the least significant bit.
say 1234.bits #=> [1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0]
Equivalent with:
n.digits(2).flip
bit_scan0
n.bit_scan0
n.bit_scan0(k)
Scan n
, starting from bit index k
, towards more significant bits, until a 0-bit is found.
When k
is omitted, k=0
is assumed.
Returns nil
if n
cannot be truncated to an integer or if k
is negative.
bit_scan1
n.bit_scan1
n.bit_scan1(k)
Scan n
, starting from bit index k
, towards more significant bits, until a 1-bit is found.
When k
is omitted, k=0
is assumed.
Returns nil
if n
cannot be truncated to an integer or if k
is negative.
bphi
bphi(n)
The bi-unitary analog of Euler's totient function of n
. (OEIS: A116550)
bsearch
bsearch(n, {...})
bsearch(a, b, {...})
Binary search from to 0
to n
, or from a
to b
, which can be any arbitrary large integers.
The last argument is a block which does the comparisons.
This function finds a value k
such that f(k) = 0. Returns nil
otherwise.
say bsearch(20, {|k| k*k <=> 49 }) #=> 7 (7*7 = 49)
say bsearch(3, 1000, {|k| k**k <=> 3125 }) #=> 5 (5**5 = 3125)
bsearch_ge
bsearch_ge(n, {...})
bsearch_ge(a, b, {...})
Binary search from to 0
to n
, or from a
to b
, which can be any arbitrary large integers.
The last argument is a block which does the comparisons.
This function finds a value k
such that f(k-1) < 0 and f(k) >= 0. Returns nil
otherwise.
bsearch_ge(1e6, { .exp <=> 1e+9 }) # 21 (exp( 21) >= 1e+9)
bsearch_ge(-1e6, 1e6, { .exp <=> 1e-9 }) # -20 (exp(-20) >= 1e-9)
bsearch_le
bsearch_le(n, {...})
bsearch_le(a, b, {...})
Binary search from to 0
to n
, or from a
to b
, which can be any arbitrary large integers.
The last argument is a block which does the comparisons.
This function finds a value k
such that f(k) <= 0 and f(k+1) > 0. Returns nil
otherwise.
bsearch_le(1e6, { .exp <=> 1e+9 }) # 20 (exp( 20) <= 1e+9)
bsearch_le(-1e6, 1e6, { .exp <=> 1e-9 }) # -21 (exp(-21) <= 1e-9)
bsearch_max
bsearch_max(n, {...})
bsearch_max(a,b, {...})
Binary search, returning the largest integer value in the range a..b
that satisfies the given comparison function.
say bsearch_max(1, 1e6, {|k| pi(k) <=> 100 }) #=> 546
where:
n = 546 is the largest value satisfying pi(n) <= 100
bsearch_min
bsearch_min(n, {...})
bsearch_min(a,b, {...})
Binary search, returning the smallest integer value in the range a..b
that satisfies the given comparison function.
say bsearch_min(1, 1e6, {|k| pi(k) <=> 100 }) #=> 541
where:
n = 541 is the smallest value satisfying pi(n) >= 100
bsearch_solve
bsearch_solve(n, {...})
bsearch_solve(a,b, {...})
It computes the inverse of any continuous function, given the range that includes the inverse value.
For floating-point values, the approx_cmp(a,b)
method (or the `<~>` operator) is recommended to be used for comparisons.
say bsearch_inverse(100, {|x| exp(x) <~> 2 }) # solution to x for: exp(x) = 2
say bsearch_inverse(200, {|x| x**2 <=> 43 }) # solution to x for: x^2 = 43
say bsearch_inverse(-10, 10, {|x| x**3 <~> -43 }) # solution to x for: x^3 = -43
say bsearch_inverse(300, 500, {|x| Li(x) <~> 100 }) # solution to x for: Li(x) = 100
This method can also be used in computing approximations to some integer-specific functions:
var n = 100000
var v = 2*int(n*log(n) / log(log(n)))
say nth_semiprime(n) #=> 459577
say bsearch_inverse(v, {|x| semiprime_count(x) <=> n }) #=> 459577.93302154541015625
Aliases: bsearch_inverse
bsigma
bsigma(n, k=1)
Returns the sum of the bi-unitary divisors of n
, each divisor raised to the k-th power.
say 20.of { .bsigma } #=> OEIS: A188999
Aliases: biusigma
bsigma0
bsigma0(n)
Returns the count of the bi-unitary divisors of n
.
say 20.of { .bsigma0 } #=> OEIS: A286324
Aliases: biusigma0
by
n.by { ... }
Returns an array with n
elements >= 0 that satisfy the provided block of code.
say 10.by { .is_prime } # first 10 primes
say 10.by { .is_square } # first 10 squares
cadd
cadd(a,b,x,y)
Complex arithmetic addition, defined as:
cadd(a,b,x,y) #=> (a+x, b+y)
Aliases: complex_add
carmichael
k.carmichael(n)
k.carmichael(a, b)
Returns an array with all the Carmichael numbers <= n
or in the range a..b
that have exactly k
prime factors.
say 3.carmichael(1e4) # 3-Carmichael numbers <= 1e4
say 4.carmichael(1e4, 1e6) # 4-Carmichael numbers in range 1e4..1e6
carmichael_each
k.carmichael_each(n, { ... })
k.carmichael_each(a, b, { ... })
Iterates over the Carmichael <= n
or in the range a..b
that have exactly k
prime factors.
3.carmichael_each(1e5, {|n| say n }) # iterate over 3-Carmichael numbers <= 1e5
4.carmichael_each(1e5, 1e6, {|n| say n }) # iterate over 4-Carmichael in range 1e5..1e6
Aliases: each_carmichael
carmichael_strong_fermat
k.carmichael_strong_fermat(base, n)
k.carmichael_strong_fermat(base, a, b)
Returns an array with all the Carmichael numbers <= n
or in the range a..b
that are also strong Fermat pseudoprimes to base
and have exactly k
prime factors.
say 3.carmichael_strong_fermat(2, 1e7) # 3-Carmichael strong Fermat pseudoprimes to base 2 <= 1e7
say 4.carmichael_strong_fermat(2, 1e7, 1e9) # 4-Carmichael strong Fermat pseudoprimes to base 2, in range 1e7..1e9
Aliases: strong_fermat_carmichael, carmichael_strong_psp
carmichael_strong_fermat_each
k.carmichael_strong_fermat_each(base, n, { ... })
k.carmichael_strong_fermat_each(base, a, b, { ... })
Iterates over the Carmichael <= n
or in the range a..b
that are also strong Fermat pseudoprimes to base
and have exactly k
prime factors.
3.carmichael_strong_fermat_each(2, 1e7, {|n| say n }) # iterate over 3-Carmichael strong Fermat to base 2 <= 1e7
4.carmichael_strong_fermat_each(2, 1e5, 1e9, {|n| say n }) # iterate over 4-Carmichael strong Fermat to base 2 in range 1e5..1e9
Aliases: carmichael_strong_psp_each, each_carmichael_strong_psp, each_carmichael_strong_fermat, each_strong_fermat_carmichael, strong_fermat_carmichael_each
catalan
n.catalan
n.catalan(k)
Returns the n-th Catalan number.
If two arguments are provided, it returns the C(n,k)
entry in Catalan's triangle.
cbrt
n.cbrt
Cube root of n
, as a floating-point value.
cdiv
cdiv(a,b,x,y)
Complex arithmetic division, defined as:
cdiv(a,b,x,y) #=> ((a*x + b*y)/(x*x + y*y), (b*x - a*y)/(x*x + y*y))
Aliases: complex_div
ceil
n.ceil
Round n
towards positive Infinity.
Aliases: ceiling
centered_polygonal
n.centered_polygonal(k)
Returns the n-th centered k-gonal number.
say 15.of {|n| centered_polygonal(n, 3) } # centered triangular numbers
say 15.of {|n| centered_polygonal(n, 6) } # centered hexagonal numbers
centered_polygonal_root
n.centered_polygonal_root(k)
Returns the centered k-gonal root of n
. Also defined for complex numbers.
say centered_polygonal_root(n, 3) # centered triangular root
say centered_polygonal_root(n, 5) # centered pentagonal root
centered_pyramidal
n.centered_pyramidal(k)
Returns the n-th centered k-gonal pyramidal number.
centered_pyramidal_root
n.centered_pyramidal_root(k)
Returns the centered k-gonal pyramidal root of n
. Also defined for complex numbers.
cfrac
n.cfrac
n.cfrac(k)
Compute k
terms of the simple continued-fraction expansion of n
.
say sqrt(12).cfrac(6) # [3, 2, 6, 2, 6, 2, 6]
Can also be used to compute very good rational approximations to a given real number:
say Num.pi.cfrac(10).flip.reduce{|a,b| b + 1/a }.as_rat # 4272943/1360120
When k
is omitted, it uses the default floating-point precision to deduce k
.
Aliases: as_cfrac
chebyshev_factor
n.chebyshev_factor
n.chebyshev_factor(B)
n.chebyshev_factor(B,x)
Integer factorization method, based on Chebyshev polynomials, which have the following nesting property:
T_{m n}(x) = T_m(T_n(x))
which are efficiently computed using the Lucas V function V_n(P,Q)
:
T_n(x) = (1/2) * V_n(2x, 1)
This method is particularly effective for numbers that have a prime factor p
such that p-1
or p+1
is B-smooth.
say chebyshev_factor(1124075136413 * 3556516507813, 4000, 3)
The product of the factors will give back n
. However, some factors may be composite.
chebyshevT
chebyshevT(n)
chebyshevT(n, x)
Compute the Chebyshev polynomials of the first kind: T_n(x)
, where n
must be a native integer.
Defined as:
T(0, x) = 1
T(1, x) = x
T(n, x) = 2*x*T(n-1, x) - T(n-2, x)
When x
is omitted, a Polynomial object is returned.
Aliases: chebyshevt
chebyshevTmod
chebyshevTmod(n, x, m)
Compute the modular Chebyshev polynomials of the first kind: T_n(x) mod m
, where n
and m
must be integers (arbitrarily large).
chebyshevU
chebyshevU(n)
chebyshevU(n, x)
Compute the Chebyshev polynomials of the second kind: U_n(x)
, where n
must be a native integer.
Defined as:
U(0, x) = 1
U(1, x) = 2*x
U(n, x) = 2*x*U(n-1, x) - U(n-2, x)
When x
is omitted, a Polynomial object is returned.
Aliases: chebyshevu
chebyshevUmod
chebyshevUmod(n, x, m)
Compute the modular Chebyshev polynomials of the second kind: U_n(x) mod m
, where n
and m
must be integers (arbitrarily large).
chr
n.chr
Convert the integer n
into a character.
say 97.chr # "a"
say 9786.chr # "☺"
cinv
cinv(a,b)
Complex arithmetic inversion, defined as:
cinv(a,b) #=> (a/(a*a + b*b), (-b)/(a*a + b*b))
Aliases: complex_inv
cinvmod
cinvmod(a,b,m)
Complex modular inversion modulo m
: returns a pair of integers (x,y) such that:
cmod(cmul(a,b,x,y), m) == (1, 0)
Aliases: complex_invmod
circular_permutations
n.circular_permutations
n.circular_permutations { ... }
Returns an array of arrays with the circular permutations of the integers in the range 0..n-1
, or iterates over the circular permutations when a block is given.
5.circular_permutations {|*a| say a }
cis
cis(x)
Euler's formula applied on x
, defined as:
cis(x) = cos(x) + sin(x)*i
idiv_ceil
idiv_ceil(a,b)
Integer division of integers a
and b
, rounded towards +Infinity.
When a
and b
are integers, this is equivalent with:
ceil(a/b)
Aliases: cld
clearbit
n.clearbit(k)
Set the k-th bit of integer n
to 0
.
say clearbit(0b1001, 0).as_bin #=> 1000
say clearbit(0b1100, 2).as_bin #=> 1000
cmod
cmod(a,b,m)
Complex arithmetic modular operation, defined as:
cmod(a,b,m) #=> (a%m, b%m)
Aliases: complex_mod
cmul
cmul(a,b,x,y)
Complex arithmetic multiplication, defined as:
cmul(a,b,x,y) #=> (a*x - b*y, a*y + b*x)
Aliases: complex_mul
collatz
n.collatz
Returns the number of halving and tripling steps to reach 1
in the 3x+1
Collatz problem.
combinations
n.combinations(k)
n.combinations(k, { ... })
Returns an array with the k-combinations of the integers in the range 0..n-1
, or iterates over the k-combinations when a block is given.
5.combinations(2, {|*a| say a })
combinations_with_repetition
n.combinations_with_repetition(k)
n.combinations_with_repetition(k, { ... })
Returns an array with the k-combinations with repetition of the integers in the range 0..n-1
, or iterates over the k-combinations with repetition when a block is given.
5.combinations_with_repetition(2, {|*a| say a })
commify
n.commify
Returns a string with thousands separators added after each group of 3 decimal digits.
Exmaple:
say 1000.commify #=> 1,000
say 1e10.commify #=> 10,000,000,000
complex
n.complex
complex(a,b)
Converts n
to a complex number, or creates a complex number from a
and b
.
say complex(3, 4) #=> 3+4i
This is equivalent with:
say Complex(3, 4) #=> 3+4i
complex_cmp
complex_cmp(a,b,x,y)
Complex number comparison, defined as:
(a <=> x) || (b <=> y)
complex_ipow
complex_ipow(a,b,n)
Complex integer exponentiation: returns (x,y)
such that x+y*i = (a+b*i)^n
.
say [complex_ipow(3,4,5)] #=> [-237, -3116]
composite
n.composite
Returns the n-th composite number (OEIS: A002808).
say composite(10**9) #=> 1053422339
Aliases: nth_composite
composite_count
composite_count(n)
composite_count(a,b)
Returns the count of composite numbers <= n
, or in the range a..b
.
say composite_count(100) # number of composites <= 100
say composite_count(50, 100) # number of composites in the range 50..100
composite_count_lower
composite_count_lower(n)
Lower bound for composite_count(n)
.
composite_count_upper
composite_count_upper(n)
Upper bound for composite_count(n)
.
composite_lower
composite_lower(n)
Lower bound for the n-th composite number.
Aliases: nth_composite_lower
composites
composites(n)
composites(a,b)
Returns an array with the composite numbers <= n
, or in the range a..b
.
composite_sum
composite_sum(n)
composite_sum(a, b, k=1)
Returns the sum of composite numbers <= n
, or in the range a..b
.
say composite_sum(100) # sum of composite numbers <= 100
say composite_sum(50, 100) # sum of composite numbers in range 50..100
When k
is specified, it returns the sum of composite numbers, each number raised to the k-th power:
say composite_sum(50, 100, 2) # 50^2 + 51^2 + ... + 100^2
Aliases: composites_sum
composite_upper
composite_upper(n)
Upper bound for the n-th composite number.
Aliases: nth_composite_upper
conj
conj(x)
Complex conjugate of x
. For real integers, this is a fixed-point function.
consecutive_lcm
consecutive_lcm(n)
Returns the least common multiple (LCM) of all the integers in the range 1..n
.
Aliases: consecutive_integer_lcm
convergents
n.convergents(k)
Returns an array with the continued fraction convergents for a given real number n
, where k
is the number of convergents to be computed and returned.
say Num.pi.convergents(5) #=> [3, 22/7, 333/106, 355/113, 103993/33102]
cop_factor
n.cop_factor(tries=n.ilog2)
Congruence of Powers (CoP) factorization method, trying to find algebraic factors of n
.
say cop_factor((5**48 + 1)*(3**120 + 1))
An additional argument can be given to limit the number of iterations.
The product of the factors will give back n
. However, some factors may be composite.
core
core(n)
Squarefree part of n
.
say 30.of { .core } #=> OEIS: A007913
Equivalent to PARI/GP core(n)
function.
Aliases: squarefree_part
cos
cos(x)
Trigonometric cosine function.
cosh
cosh(x)
Hyperbolic cosine function.
cot
cot(x)
Trigonometric cotangent function.
coth
coth(x)
Hyperbolic cotangent function.
cpow
cpow(a,b,n)
Computes (a + b*i)^n
, where a,b
are real numbers and n
is an integer. Returns the real and imaginary part as a list.
say [cpow(3, 4, 10)] #=> [-9653287, 1476984]
Aliases: complex_pow
cpowmod
cpowmod(a,b,n,m)
Efficiently computes (a + b*i)^n mod m
, where a,b,n,m
are all integers. Returns the real and imaginary part as a list.
say [complex_powmod(3, 4, 1000, 1e6)] #=> [585313, 426784]
Aliases: complex_powmod
csc
csc(x)
Trigonometric cosecant function.
csch
csch(x)
Hyperbolic cosecant function.
csub
csub(a,b,x,y)
Complex arithmetic subtraction, defined as:
csub(a,b,x,y) #=> (a-x, b-y)
Aliases: complex_sub
cube
cube(x)
Returns the cube of x
. Equivalent with x**3
.
cube_divisors
n.cube_divisors
Returns the cube divisors of n
.
say 10!.cube_divisors #=> [1, 8, 27, 64, 216, 1728]
Equivalent with:
n.divisors.grep { .is_cube }
cubefree
cubefree(n)
cubefree(a,b)
Returns an array with the cubefree numbers <= n
, or in the range a..b
.
cubefree_count
cubefree_count(n)
cubefree_count(a,b)
Returns the count of cubefree numbers <= n
, or in the range a..b
.
cubefree_divisors
n.cubefree_divisors
Returns an array with the cubefree divisors of n
.
say cubefree_divisors(120) #=> [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60]
cubefree_each
n.cubefree_each { ... }
cubefree_each(a, b, { ... })
Iterates over the cubefree numbers <= n
, or in the range a..b
.
Aliases: each_cubefree
cubefree_sigma
n.cubefree_sigma(k=1)
Sum of the cubefree divisors of n
, each divisor raised to power k
.
say cubefree_sigma(5040) #=> 4368
say cubefree_sigma(5040, 2) #=> 2484300
cubefree_sigma0
n.cubefree_sigma0
Returns the count of cubefree divisors of n
.
cubefree_sum
cubefree_sum(n)
cubefree_sum(a,b)
Returns the sum of cubefree numbers <= n
, or in the range a..b
.
cubefree_udivisors
n.cubefree_udivisors
Returns the unitary cubefree divisors of n
.
say cubefree_udivisors(5040) #=> [1, 5, 7, 9, 35, 45, 63, 315]
cubefree_usigma
n.cubefree_usigma(k=1)
Sum of the unitary cubefree divisors of n
, each divisor raised to power k
.
say 5040.cubefree_usigma #=> 480
say 5040.cubefree_usigma(2) #=> 106600
cubefree_usigma0
n.cubefree_usigma0
Returns the number of unitary cubefree divisors of n
.
say cubefree_usigma0(5040) #=> 8
cubefull
cubefull(n)
cubefull(a,b)
Returns an array with the cubefull numbers <= n
, or in the range a..b
.
cubefull_count
cubefull_count(n)
cubefull_count(a,b)
Returns the count of cubefull numbers <= n
, or in the range a..b
.
cubefull_each
n.cubefull_each { ... }
cubefull_each(a, b, { ... })
Iterates over the cubefull numbers <= n
, or in the range a..b
.
Aliases: each_cubefull
cubefull_sum
cubefull_sum(n)
cubefull_sum(a,b)
Returns the sum of cubefull numbers <= n
, or in the range a..b
.
cube_sigma
n.cube_sigma(k=1)
Sum of the cube divisors of n
, each divisor raised to the power k
.
say 10!.cube_sigma #=> 2044
say 10!.cube_sigma(2) #=> 3037530
Equivalent with:
n.cube_divisors.sum {|d| d**k }
cube_sigma0
n.cube_sigma0
Returns the count of cube divisors of n
.
cube_udivisors
n.cube_udivisors
Returns the unitary cube divisors of n
, such that each divisor d
is a cube and gcd(n/d, d) = 1
.
say 15!.cube_udivisors #=> [1, 125, 729, 91125]
cube_usigma
n.cube_usigma(k=1)
Sum of the unitary cube divisors of n
, each divisor raised to power k
.
say cube_usigma(15!) #=> 91980
say cube_usigma(15!, 2) #=> 8304312692
Equivalent with:
n.cube_udivisors.sum {|d| d**k }
cube_usigma0
n.cube_usigma0
Returns the count of unitary cube divisors of n
.
cubic_formula
cubic_formula(a, b, c, d)
Returns a list of (complex) solutions (x_1, x_2, x_3)
to the cubic equation:
a*x^3 + b*x^2 + c*x + d = 0
cyclotomic
cyclotomic(n)
cyclotomic(n,x)
Returns the n-th Cyclotomic polynomial evaluated at x
.
say cyclotomic(12, 10) #=> 9901
When x
is omitted, a Polynomial object is returned:
say cyclotomic(12) #=> x^4 - x^2 + 1
Aliases: cyclotomic_polynomial
cyclotomic_factor
n.cyclotomic_factor
n.cyclotomic_factor(bases...)
Factorization method, based on cyclotomic polynomials, trying to find algebraic factors of n
.
say cyclotomic_factor(2**120 + 1)
say cyclotomic_factor((10**258 - 1)/9 - 10**(258/2) - 1, 10)
An optional list of bases can be given to restrict the search only to the given bases.
The product of the factors will give back n
. However, some factors may be composite.
cyclotomicmod
cyclotomicmod(n, x, m)
Returns the n-th Cyclotomic polynomial evaluated at x
, computed modulo m
.
say cyclotomicmod(30!, 5040, 2**128 + 1)
It returns NaN when moebius(d) = -1
and gcd(n/d, m) != 1
, for some d|n
.
d
d(n)
tau(n)
sigma0(n)
Returns the count of positive divisors of n
.
dconv
n.dconv(f,g)
The Dirichlet convolution of functions f
and g
, defined as:
Sum_{d|n} f(d) * g(n/d)
Example:
say 20.of { .dconv({.moebius}, {_}) }
Aliases: dirichlet_convolution
de
r.de
r.denominator
Returns the denominator for a rational number r
.
say denominator(43/97) #=> 97
Aliases: denominator
defs
n.defs { ... }
Returns an array with the first n
defined values returned by the given block. The block is called with k = 0,1,2,...
10.defs {|k| k.is_prime ? k+1 : nil } # array of p+1 for the first 10 primes p
deg2rad
deg2rad(x)
Convert degrees to radians.
say deg2rad(180) #=> 3.14159...
derangements
n.derangements
Returns an array of arrays with the derangements of the integers in the range 0..n-1
, or iterates over the derangements when a block is given.
5.derangements {|*a| say a }
Aliases: complete_permutations
derivative
derivative(n)
Arithmetic derivative of n
, defined for rationals and integers (positive and negative).
say derivative(5040) #=> 15168
say derivative(-5040/4323).as_frac #=> -6240176/2076481
Aliases: arithmetic_derivative
difference_of_squares
difference_of_squares(n)
Returns an array of [a,b]
pairs with all the possible solutions to the equation: a^2 - b^2 = n
.
say difference_of_squares(48) #=> [[7, 1], [8, 4], [13, 11]]
digit
n.digit(k, b=10)
Returns the k-th digit of n
in a base b
.
say 1119.digit(0) #=> 9
say 1181.digit(1) #=> 8
say 1711.digit(2) #=> 7
say 6111.digit(3) #=> 6
say 1234.digit(4) #=> 0
It also supports negative indices:
say 9111.digit(-1) #=> 9
say 1811.digit(-2) #=> 8
say 1234.digit(-42) #=> nil
digital_root
digital_root(n, b=10)
Returns the digital root of n
, with respect to base b
.
say 30.of { .digital_root } #=> OEIS: A010888
say 30.of { .digital_root(.isqrt+1) } #=> OEIS: A122197
Also known as "repeated digital sum".
Both n
and b
can be arbitrary large, as long as b > 1.
digits
n.digits(b=10)
Returns the digits of n
in base b
, ordered from the least significant digit to the most significant digit.
say 1234.digits #=> [4,3,2,1]
say 1234.digits(20) #=> [14, 1, 3]
The reverse operation is:
b.digits2num(n.digits(b)) == n
digits2num
b.digits2num(digits)
Convert an array of digits to a number in the base b
.
The array of digits are ordered from the least significant digit to the most significant digit, as returned by n.digits(b)
.
say 10.digits2num([4,3,2,1]) #=> 1234
Aliases: from_digits
digits_sum
sumdigits(n, b=10)
Sum of base b
digits of n
.
say sumdigits(1234) #=> 10
say sumdigits(1e5!, 100) #=> 10658934
This is equivalent to:
n.digits(b).sum
Aliases: sum_digits, sumdigits
dirichlet_sum
n.dirichlet_sum(f, g, F, G)
This method computes the following sum in O(sqrt(n))
steps:
Sum_{k=1..n} Sum_{d|k} f(d) * g(k/d)
where F
and G
are the partial sums of f
and g
, respectively.
say dirichlet_sum(1e6,
{ .is_squarefree ? 1 : 0 },
{ .square },
{ .squarefree_count },
{ .faulhaber(2) }
)
Aliases: dirichlet_hyperbola
divides
a.divides(b)
a `divides` b
Returns true if a
divides b
.
say 3.divides(15) #=> true
divisor_map
n.divisor_map {|d| ... }
Maps the divisors of n
to the given block.
say 24.divisor_map {|d| 1/d } #=> [1, 1/2, 1/3, 1/4, 1/6, 1/8, 1/12, 1/24]
divisor_prod
n.divisor_prod {|d| ... }
Product of the mapping of the positive divisors of n
.
Equivalent with:
n.divisor_map {|d| ... }.prod
Aliases: divisors_prod
divisors
n.divisors(k=n)
Return an array with the positive divisors of n
that are less than or equal to k
.
say 120.divisors #=> [1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24, 30, 40, 60, 120]
say 120.divisors(13) #=> [1, 2, 3, 4, 5, 6, 8, 10, 12]
divisor_sum
n.divisor_sum {|d| ... }
Sum of the mapping of the positive divisors of n
.
say 5040.divisor_sum {|d| euler_phi(d)**2 } #=> 2217854
Equivalent with:
n.divisor_map {|d| ... }.sum
Aliases: divisors_sum
divmod
divmod(a, b)
divmod(a, b, m)
When only two arguments are provided, it returns (a//b, a%b)
.
say [divmod(23, 10)] #=> [2, 3]
When three arguments are given, it does integer modular division: (a/b) % m
.
say divmod(43, 97, 127) # == (43 * invmod(97, 127))%127
dop_factor
n.dop_factor(tries=n.ilog2)
Difference of Powers (DoP) factorization method, trying to find algebraic factors of n
.
say dop_factor(2**120 + 1)
An additional argument can be given to limit the number of iterations.
The product of the factors will give back n
. However, some factors may be composite.
downto
a.downto(b, step=1)
Returns a reverse range from a
down to b
, with an optional stepping value.
say 10.downto(1) #=> RangeNum(10, 1, -1)
say 10.downto(1, 2) #=> RangeNum(10, 1, -2)
dump
n.dump
Returns a stringification version of n
.
say dump(42) #=> "42"
say dump(3/4) #=> "3/4"
e
Num.e
Returns the e mathematical constant: 2.71828...
each_almost_prime
k.each_almost_prime(n, {...})
k.each_almost_prime(a,b, {...})
Iterates over the k-almost prime numbers <= n
, or in the range a..b
.
11.almost_primes_each(1e7, {|n| say n }) # iterate over 11-almost primes <= 1e6
11.almost_primes_each(1e6, 1e7, {|n| say n }) # iterate over 11-almost primes in the range [1e6, 1e7]
Aliases: almost_primes_each
each_composite
n.each_composite { ... }
each_composite(a,b, { ... })
Iterate over the composite numbers <= n
, or in the given range a..b
.
# Iterate over the composite integers between 100 and 200
each_composite(100, 200, {|c|
say c
})
# Iterate over the composite integers <= 100
100.each_composite {|c|
say c
}
Aliases: composites_each
each_fermat_psp
k.fermat_psp_each(base, n, { ... })
k.fermat_psp_each(base, a, b, { ... })
Iterates over the k-omega Fermat pseudoprimes <= n
or in the range a..b
.
3.fermat_psp_each(2, 1e5, {|n| say n }) # iterate over 3-Fermat psp to base 2 <= 1e5
4.fermat_psp_each(2, 1e5, 1e6, {|n| say n }) # iterate over 4-Fermat psp to base 2 in range 1e4..1e6
Aliases: fermat_psp_each
each_lucas_carmichael
k.lucas_carmichael_each(n, { ... })
k.lucas_carmichael_each(a, b, { ... })
Iterates over the Lucas-Carmichael <= n
or in the range a..b
that have exactly k
prime factors.
3.lucas_carmichael_each(1e5, {|n| say n }) # iterate over 3-Lucas-Carmichael numbers <= 1e5
4.lucas_carmichael_each(1e5, 1e6, {|n| say n }) # iterate over 4-Lucas-Carmichael in range 1e4..1e6
Aliases: lucas_carmichael_each
each_noncubefree
n.noncubefree_each { ... }
noncubefree_each(a, b, { ... })
Iterates over the noncubefree numbers <= n
, or in the range a..b
.
Aliases: noncubefree_each
each_nonpowerfree
k.nonpowerfree_each(n, { ... })
k.nonpowerfree_each(a, b, { ... })
Iterates over the numbers <= n
, or in the range a..b
, that are not k-powerfree.
2.nonpowerfree_each(100, {|n| say n }) # iterate over nonsquarefree numbers <= 100
3.nonpowerfree_each(50, 100, {|n| say n }) # iterate over noncubefree numbers in range 50..100
Aliases: nonpowerfree_each
each_nonsquarefree
n.nonsquarefree_each { ... }
nonsquarefree_each(a, b, { ... })
Iterates over the nonsquarefree numbers <= n
, or in the range a..b
.
Aliases: nonsquarefree_each
each_omega_prime
k.omega_primes_each(n, { ... })
k.omega_primes_each(a, b, { ... })
Iterates over the k-omega primes <= n
, or in the range a..b
.
k-omega primes are numbers n
that satisfy omega(n) == k
.
1.omega_primes_each(100, {|n| say n }) # iterate over prime powers <= 100
2.omega_primes_each(50, 100, {|n| say n }) # iterate over 2-omega primes in range 50..100
Aliases: omega_primes_each
each_powerfree
k.powerfree_each(n, { ... })
k.powerfree_each(a, b, { ... })
Iterates over the k-powerfree numbers <= n
, or in the range a..b
.
2.powerfree_each(100, {|n| say n }) # iterate over squarefree numbers <= 100
3.powerfree_each(50, 100, {|n| say n }) # iterate over cubefree numbers in the range 50..100
Aliases: powerfree_each
each_powerful
k.powerful_each(n, { ... })
k.powerful_each(a, b, { ... })
Iterates over the k-powerful numbers <= n
, or in the range a..b
.
2.powerful_each(100, {|n| say n }) # iterate over 2-powerful numbers <= 100
2.powerful_each(50, 100, {|n| say n }) # iterate over 2-powerful numbers in the range 50..100
Aliases: powerful_each
each_prime
n.each_prime {...}
each_prime(a,b,{...})
Iterates over the primes in the given range.
# Iterate over the primes between 100 and 200
each_prime(100, 200, {|p| say p })
# Iterate over the primes <= 100
100.each_prime {|p| say p }
Aliases: primes_each
each_prime_power
n.each_prime_power { ... }
each_prime_power(a,b, { ... })
Iterate over prime powers <= n
, or in the range a..b
:
100.each_prime_power {|k| say k } # iterate over prime powers <= 100
each_prime_power(50, 100, {|k| say k }) # iterate over prime powers in the range [50, 100]
Aliases: prime_powers_each
each_semiprime
n.each_semiprime { ... }
each_semiprime(a,b, { ... })
Iterate over semiprimes <= n
, or in the range a..b
:
100.each_semiprime {|k| say k } # iterate over semiprimes <= 100
each_semiprime(50, 100, {|k| say k }) # iterate over semiprimes in the range [50, 100]
Aliases: semiprimes_each
each_squarefree
n.each_squarefree {...}
each_squarefree(a,b,{...})
Iterates over the squarefree numbers in a given range.
# Iterate over the squarefree numbers in the interval [100, 200]
each_squarefree(100, 200, {|n|
say n
})
# Iterate over the squarefree numbers <= 100
100.each_squarefree {|n|
say n
}
Aliases: squarefree_each
each_squarefree_almost_prime
k.each_squarefree_almost_prime(n, {...})
k.each_squarefree_almost_prime(a,b,{...})
Iterates over the squarefree k-almost primes <= n
, or in the range a..b
.
# Iterate over squarefree 3-almost primes <= 100
3.squarefree_almost_primes_each(100, { .say })
# Iterate over squarefree 3-almost primes in the range 50..100
3.squarefree_almost_primes_each(50, 100, { . say })
Aliases: squarefree_almost_primes_each
each_squarefree_fermat_psp
k.squarefree_fermat_psp_each(base, n, { ... })
k.squarefree_fermat_psp_each(base, a, b, { ... })
Iterates over the squarefree Fermat pseudoprimes <= n
or in the range a..b
that have exactly k
prime factors.
3.squarefree_fermat_psp_each(2, 1e5, {|n| say n }) # iterate over squarefree 3-Fermat psp to base 2 <= 1e5
4.squarefree_fermat_psp_each(2, 1e5, 1e6, {|n| say n }) # iterate over squarefree 4-Fermat psp to base 2 in range 1e4..1e6
Aliases: squarefree_fermat_psp_each
each_squarefree_semiprime
n.each_squarefree_semiprime { ... }
each_squarefree_semiprime(a,b, { ... })
Iterate over the squarefree semiprimes <= n
, or in the range a..b
:
100.each_squarefree_semiprime {|k| say k } # iterate over squarefree semiprimes <= 100
each_squarefree_semiprime(50, 100, {|k| say k }) # iterate over squarefree semiprimes in the range [50, 100]
Aliases: squarefree_semiprimes_each
each_squarefree_strong_fermat_psp
k.each_squarefree_strong_fermat_psp(base, n, { ... })
k.each_squarefree_strong_fermat_psp(base, a, b, { ... })
Iterates over the squarefree strong Fermat pseudoprimes <= n
or in the range a..b
that have exactly k
prime factors.
3.each_squarefree_strong_fermat_psp(2, 1e6, {|n| say n }) # iterate over squarefree strong 3-Fermat psp to base 2 <= 1e6
4.each_squarefree_strong_fermat_psp(2, 1e7, 1e8, {|n| say n }) # iterate over squarefree strong 4-Fermat psp to base 2 in range 1e7..1e8
Aliases: squarefree_strong_fermat_psp_each
each_squarefull
n.squarefull_each { ... }
squarefull_each(a, b, { ... })
Iterates over the squarefull (or 2-full) numbers <= n
, or in the range a..b
.
Aliases: squarefull_each
each_strong_fermat_psp
k.each_strong_fermat_psp(base, n, { ... })
k.each_strong_fermat_psp(base, a, b, { ... })
Iterates over the k-omega strong Fermat pseudoprimes <= n
or in the range a..b
.
3.each_strong_fermat_psp(2, 1e6, {|n| say n }) # iterate over 3-omega strong Fermat psp to base 2 <= 1e6
4.each_strong_fermat_psp(2, 1e7, 1e8, {|n| say n }) # iterate over 4-omega strong Fermat psp to base 2 in range 1e7..1e8
Aliases: strong_fermat_psp_each
ecm_factor
n.ecm_factor
n.ecm_factor(B1)
n.ecm_factor(B1, curves)
Hendrik Lenstra's elliptic curve factorization method (ECM).
The product of the factors will give back n
. However, some factors may be composite.
edivisors
edivisors(n)
Returns an array with the exponential divisors (or e-divisors) of n
.
say edivisors(5040) #=> [210, 420, 630, 1260, 1680, 5040]
Aliases: exponential_divisors
egypt_greedy
egypt_greedy(p/q)
Greedy algorithm for Egyptian fraction expansion (also called the Fibonacci-Sylvester algorithm): at each step, extract the largest unit fraction less than the target and replace the target with the remainder.
say egypt_greedy(9/10) #=> [2, 3, 15]
say egypt_greedy(5/121) #=> [25, 757, 763309, 873960180913, 1527612795642093418846225]
Returns the array of denominators, such that egypt_greedy(p/q).sum{|d| 1/d }
equals p/q
.
ei
ei(x)
Exponential integral function.
Aliases: eint
erf
erf(x)
The Gauss error function.
erfc
erfc(x)
The complementary error function.
esigma
esigma(n, k=1)
Returns the sum of the exponential divisors (or e-divisors) of n
, each divisor raised to k-th power.
say 20.of { .esigma } #=> OEIS: A051377
esigma0
esigma0(n)
Returns the count of the exponential divisors (or e-divisors) of n
.
say 20.of { .esigma0 } #=> OEIS: A049419
euler
euler(n)
euler(n,x)
Returns the n-th Euler number:
say 10.of {|n| euler_number(n) } #=> [1, 0, -1, 0, 5, 0, -61, 0, 1385, 0]
Returns the n-th Euler polynomial evaluated at x
, when x
is given:
say euler(10, 5) #=> 1981100
Aliases: euler_number
euler_numbers
euler_numbers(n)
Returns an array containing the Euler numbers with indices in the range 0..n
.
say euler_numbers(9) #=> [1, 0, -1, 0, 5, 0, -61, 0, 1385, 0]
say euler_numbers(10) #=> [1, 0, -1, 0, 5, 0, -61, 0, 1385, 0, -50521]
euler_polynomial
euler_polynomial(n)
euler_polynomial(n, x)
Returns the n-th Euler polynomial evaluated at x
.
When x
is omitted, a Polynomial object is returned.
eval
eval(x,v)
Returns back x
.
exp
exp(x)
exp(b, x)
Exponential function: e^x
.
When two arguments are given, it does floating-point exponentiation: b^x
.
exp10
exp10(x)
Exponential function: 10^x
.
exp2
exp2(x)
Exponential function: 2^x
.
exp_mangoldt
exp_mangoldt(n)
Returns exp(Λ(n)); the exponential of the Mangoldt function.
expmod
powmod(b, n, m)
Modular exponentiation: b^n mod m
, where b
is an integer or a rational number and n
and m
are both integers.
say powmod(2, 42, 43) #=> 1
say powmod(3/4, 1234, 4171) #=> 2138
Aliases: powmod
expnorm
expnorm(n, b=10)
Returns exp(n)
normalized in the range [0,1)
. The base b
can be any value != {0,1}
.
say expnorm(log(2) * 20996011) #=> 0.125976895450330105020494309574...
say exp(log(10!)) #=> 3628800
say expnorm(log(10!)) #=> 0.36288
say expnorm(log(10!), 2) #=> 0.86517333984375
say 3628800.base(2) #=> 1101110101111100000000
say 0.86517333984375.base(2) #=> 11011101011111/100000000000000
Complex numbers are also supported:
say expnorm(log(-1)) #=> 0.06682015101903....+0.074398033695749....i
say expnorm(log(-1234)).abs #=> 0.1234
Equivalent with:
exp(n) / b**k # for some positive integer value of k
to_f
x.to_f
Convert x
to a floating-point value number.
Aliases: f, float, to_float
factor
factor(n)
factor(n, { ... })
Returns an array with the prime factors of n
, where n
is a positive integer, such that n.factor.prod == n
.
say 180.factor #=> [2, 2, 3, 3, 5]
An optional block can be provided, to use a specific factorization method:
say factor(10**120 - 10**40, {|k| k.ecm_factor })
say factor(10**120 - 10**40, {|k| k.fermat_factor })
The block is expected to return an array with zero or more (not necessarily prime) factors of k
.
The block is called recursively for each new composite factor found, until no new factors are found.
Aliases: factors
factor_exp
factor_exp(n)
Returns an array of pairs [p,k]
factors p^k
of n
.
say 180.factor_exp #=> [[2, 2], [3, 2], [5, 1]]
Aliases: factors_exp
factorialmod
factorialmod(n,m)
Returns the factorial of n
modulo m
.
Equivalent with (but much faster):
factorial(n) % m
factorial_valuation
factorial_valuation(n, p)
Returns the number of times n!
is divisible by p
, where p
is a prime number.
Equivalent with (but more efficient):
valuation(n!, p)
Aliases: factorial_power
factorial_sum
factorial_sum(n)
Left factorial of n
, defined as:
Sum_{k=0..n-1} k!
Example:
say 20.of { .factorial_sum } # OEIS: A003422
Aliases: left_factorial
factor_map
n.factor_map {|p,k| ... }
Maps the prime-power factorization (p,k)
of n
to the given block.
say 5040.factor_map {|p,k| p**k } #=> [16, 9, 5, 7]
factor_prod
n.factor_prod {|p,k| ... }
Product of the mapping of the prime-power factorization of n
.
say 5040.factor_prod {|p,k| (p-1) * p**(k-1) } #=> 1152
Equivalent with:
n.factor_map {|p,k| ... }.prod
Aliases: factors_prod
factor_sum
n.factor_sum {|p,k| ... }
Sum of the mapping of the prime-power factorization of n
.
Equivalent with:
n.factor_map {|p,k| ... }.sum
Aliases: factors_sum
falling_factorial
falling_factorial(n,k)
Falling factorial: (n)_k = n * (n - 1) * ... * (n - k + 1)
, defined as:
binomial(n, k) * k!
For negative values of k
, falling factorial is defined as:
falling_factorial(n, -k) = 1/falling_factorial(n + k, k)
When the denominator is zero, NaN
is returned.
farey
farey(n)
Generates the Farey sequence of maximum denominator n
.
say farey(5) #=> [0, 1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5, 1]
farey_neighbors
farey_neighbors(n, p/q)
Returns the neighbors of p/q
in the Farey sequence of max denominator n
.
say [farey_neighbors(5, 2/5)] #=> [1/3, 1/2]
say [farey_neighbors(2**32, 43/97)] #=> [1903954555/4294967252, 1903954563/4294967270]
faulhaber
faulhaber(n,k)
Sum of powers: 1^k + 2^k + ... + n^k
, using Faulhaber's summation formula.
faulhaber(5, 2) # 1^2 + 2^2 + 3^2 + 4^2 + 5^2 = 55
The value for k
must be a nonnegative native integer.
Aliases: faulhaber_sum
faulhaber_polynomial
faulhaber_polynomial(n)
faulhaber_polynomial(n, x)
Computes the n-th Faulhaber polynomials evaluated at x
.
Defined in terms of the Bernoulli polynomials, as:
faulhaber_polynomial(n,x) = (bernoulli_polynomial(n+1,x+1) - bernoulli_polynomial(n+1, 1))/(n+1)
When x
is omitted, a Polynomial object is returned.
faulhaber_range
faulhaber_range(a, b, k)
Sum of powers: a^k + (a+1)^k + (a+2)^k + ... + b^k
, using Faulhaber's summation formula.
faulhaber_range(50, 100, 2) # 50^2 + 51^2 + ... + 100^2 = 297925
The value for k
must be a nonnegative native integer.
fermat_factor
n.fermat_factor(k=1e4)
Tries to factorize a given number using Fermat's factorization method (using at most k
iterations).
Works for odd composite nonpower numbers n
that have two divisors close to sqrt(n)
.
The product of the factors will give back n
. However, some factors may be composite.
fermat_psp
k.fermat_psp(base, n)
k.fermat_psp(base, a, b)
Returns an array with all the k-omega Fermat pseudoprimes to the given base
that are <= n
or in the range a..b
.
say 3.fermat_psp(2, 10000) # 3-omega Fermat psp to base 2
say 4.fermat_psp(2, 10000, 100000) # 4-omega Fermat psp to base 2 in range
fib
fib(n)
fib(n,k)
Returns the n-th Fibonacci number.
say 10.of { .fib } #=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
When an additional is provided, it returns the n-th Fibonacci number of k-th order.
say 20.of { .fib(3) } #=> Tribonacci numbers
say 20.of { .fib(4) } #=> Tetranacci numbers
say 20.of { .fib(5) } #=> Pentanacci numbers
Aliases: fibonacci
fib_factor
n.fib_factor(upto = 2*n.ilog2)
Tries to find special factors of a Fibonacci-like number.
say fib_factor(480.fib)
say fib_factor(480.lucas)
The product of the factors will give back n
. However, some factors may be composite.
Aliases: fibonacci_factor
fibmod
fibmod(n,m)
fibmod(n,k,m)
Efficiently computes the n-th Fibonacci number modulo m
.
fibmod(n,m) == (fibonacci(n) % m)
When three arguments are given, it computes the n-th k-th order Fibonacci number modulo m
.
fibmod(n,k,m) == (fibonacci(n,k) % m)
Aliases: fibonacci_mod, fibonaccimod
fibonorial
fibonorial(n)
Returns the product of first n
nonzero Fibonacci numbers F(1), ..., F(n)
.
flip
n.flip(base=10)
Returns the reversal of n
in base b
. When b
is not given, it defaults to base 10
.
say 20.of { .flip } # A004086
say 20.of { .flip(2) } # A030101
Aliases: reverse
flipbit
flipbit(n,k)
Flip the value of the k-th bit of integer n
.
say flipbit(0b1000, 0).as_bin #=> 1001
say flipbit(0b1001, 0).as_bin #=> 1000
floor
floor(x)
Round x
towards -Infinity.
say floor( 2.5) # 2
say floor(-2.5) # -3
flt_factor
n.flt_factor(base=2, tries=1e4)
Tries to find a factor of n
, using a new factorization method, inspired by Fermat's Little Theorem (FLT).
This method is particularly effective for numbers that have factors close to each other, or have a factor k
for which znorder(2,k)
is small.
Example (try with base 3
and give up after 10^6
iterations):
say flt_factor(2**64 + 1, 3, 1e6) #=> [274177, 67280421310721]
The product of the factors will give back n
. However, some factors may be composite.
fubini
fubini(n)
Returns the n-th Fubini number.
say 10.of { .fubini } #=> OEIS: A000670
Aliases: fubini_number
fubini_numbers
fubini_numbers(n)
Returns an array containing the Fubini numbers with indices in the range 0..n
.
say fubini_numbers(5) #=> [1, 1, 3, 13, 75, 541]
fusc
fusc(n)
Returns the n-th term in Stern's diatomic series (or Stern-Brocot sequence).
say 30.of { .fusc } #=> OEIS: A002487
gcd
gcd(...)
Returns the greatest common divisor of a list of integers.
gcdext
gcdext(a,b)
The extended greatest common divisor of a
and b
, returning (u, v, d)
, where d = gcd(a,b)
, while u
and v
are the coefficients satisfying:
u*a + v*b = d.
The value of d
is always nonnegative.
gcd_factors
n.gcd_factors([a, b, ...])
Given a positive integer and an array of integers, it tries to find nontrivial 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 gcd_factors(n, a) #=> [43, 43, 97, 503]
The product of the factors gives back n
. However, some factors may be composite.
gcud
gcud(...)
Returns the greatest common unitary divisor of a list of integers.
geometric_sum
geometric_sum(n,r)
Geometric sum: r^0 + r^1 + ... + r^n
, using the following formula:
geometric_sum(n, r) = (r^(n+1) - 1) / (r - 1)
Example:
say geometric_sum(5, 8) # 8^0 + 8^1 + 8^2 + 8^3 + 8^4 + 8^5 = 37449
geometric_summod
geometric_summod(n, r, m)
Geometric sum modulo m
: r^0 + r^1 + ... + r^n (mod m)
, using the following formula:
geometric_summod(n, r, m) = ((powmod(r, n+1, m)-1) * invmod(r-1, m)) % m
germain_factor
germain_factor(n)
Tries to factorize n
, using the Sophie Germain identity:
x^4 + 4y^4 = (x^2 - 2xy + 2y^2) * (x^2 + 2xy + 2y^2)
The product of the factors will give back n
. However, some factors may be composite.
Aliases: sophie_germain_factor
gpf
gpf(n)
Returns the greatest prime factor of n
.
Defined with the base-cases:
gpf(0) = 0
gpf(1) = 1
Example:
say gpf(2**128 + 1) #=> 5704689200685129054721
gpf_sum
gpf_sum(n)
gpf_sum(a,b)
Returns the sum of largest prime factors of numbers from 1
to n
, or in the range a..b
.
say 30.of { .gpf_sum } #=> OEIS: A088822
hamdist
hamdist(a,b)
Returns the Hamming distance (number of bit-positions where the bits differ) between integers a
and b
.
harm
harmonic(n)
harmonic(n, k)
Returns the n-th Harmonic number H_n
. The harmonic numbers are the sum of reciprocals of the first n
natural numbers: 1 + 1/2 + 1/3 + ... + 1/n
.
When an additional argument is given, it returns the n-th Harmonic number of the k-th order.
Aliases: harmfrac, harmonic, harmonic_number
harmreal
harmreal(n)
harmreal(n, k)
Returns the n-th Harmonic number H_n
as a floating-point value, defined as:
harmreal(n) = digamma(n+1) + γ
where γ
is the Euler-Mascheroni constant.
When an additional argument is given, it returns the n-th Harmonic number of the k-th order.
hclassno
hclassno(n)
Returns the Hurwitz-Kronecker class number.
say 30.of { .hclassno.nu } # OEIS: A058305
say 30.of { .hclassno.de } # OEIS: A058306
say 30.of { 12 * .hclassno } # OEIS: A259825
hermiteH
hermiteH(n)
hermiteH(n, x)
Physicists' Hermite polynomials: H_n(x)
.
When x
is omitted, a Polynomial object is returned.
Aliases: hermite_polynomialH
hermiteHe
hermiteHe(n)
hermiteHe(n, x)
Probabilists' Hermite polynomials: He_n(x)
.
When x
is omitted, a Polynomial object is returned.
Aliases: hermite_polynomialHe
holf_factor
n.holf_factor(tries=1e4)
Hart's OLF method (variant of Fermat's method).
The product of the factors will give back n
. However, some factors may be composite.
hyperfactorial
hyperfactorial(n)
Hyperfactorial of n
, defined as Prod_{k=1..n} k^k
.
hyperfactorial_ln
hyperfactorial_ln(n)
Natural logarithm of hyperfactorial(n)
, where n
is a nonnegative integer.
Aliases: lnhyperfactorial, hyperfactorial_log
hypot
hypot(x,y)
The value of the hypotenuse for catheti x
and y
, defined as:
sqrt(x**2 + y**2)
Also defined for complex numbers.
i
x.i
Multiplies x
by the imaginary unit i
.
say 42.i #=> 42i
say 42i.i #=> -42
iabs
iabs(n)
integer absolute value, by first truncating n
to an integer.
Aliases: absint
iadd
iadd(a,b)
Integer addition: a+b
.
Aliases: addint
icbrt
icbrt(n)
Integer cube root of n
.
Aliases: cbrtint
icmp
x.icmp(y)
Integer comparison, by first truncating x
and y
to integers.
Aliases: cmpint
idivisors
n.idivisors
Returns an array with the infinitary divisors (or i-divisors) of n
.
say 96.idivisors #=> [1, 2, 3, 6, 16, 32, 48, 96]
Aliases: infinitary_divisors
ilog
ilog(n,b)
Integer logarithm of n
to base b
, satisfying:
b**ilog(n,b) <= n < b**(ilog(n,b)+1)
Aliases: logint
ilog10
ilog10(n)
Integer logarithm of n
to base 10
, equivalent to:
ilog(n,10)
ilog2
ilog2(n)
Integer logarithm of n
to base 2
, equivalent to:
ilog(n,2)
im
x.im
The imaginary part of complex number x
. Return 0 when x
is a real number.
Aliases: imag, imaginary
imod
imod(a,m)
Integer remainder of a
when divided by m
: a % m
.
Aliases: modint
imul
imul(a,b)
Integer multiplication: a*b
.
Aliases: mulint
ineg
ineg(n)
Integer negation, by first truncating n
to an integer.
Aliases: negint
inf
Num.inf
Returns the positive Infinity special floating-point value.
int
int(n)
trunc(n)
Truncate n
to an integer.
Aliases: to_i, to_int, trunc
inv
inv(n)
Multiplicative inverse of n
: 1/n
.
inverse_phi
n.inverse_phi
Returns all the solutions x
to the Euler totient function: phi(x) = n
.
Aliases: inverse_totient
inverse_phi_len
n.inverse_phi_len
Returns the number of solutions to the Euler totient function: phi(x) = n
.
Equivalent with:
n.inverse_phi.len
Aliases: inverse_totient_len
inverse_phi_max
n.inverse_phi_max
Returns the largest solution x to the Euler totient function: phi(x) = n
.
Equivalent with:
n.inverse_phi.max
Returns nil
if there are no solutions.
Aliases: inverse_euler_phi_max
inverse_phi_min
n.inverse_phi_min
Returns the smallest solution x to the Euler totient function: phi(x) = n
.
Equivalent with:
n.inverse_phi.min
Returns nil
if there are no solutions.
Aliases: inverse_euler_phi_min
inverse_polygonal
polygonal_inverse(n)
Returns an array of pairs [r,k]
such that polygonal(r,k) = n
.
say polygonal_inverse(4012) #=> [[2, 4012], [4, 670], [8, 145], [4012, 2]]
Aliases: polygonal_inverse
inverse_psi
n.inverse_psi
Returns all the solutions x
to Dedekind's psi function: psi(x) = n
.
say inverse_psi(120) #=> [75, 76, 87, 95]
Aliases: inverse_dedekind_psi
inverse_psi_len
n.inverse_psi_len
Returns the number of solutions to Dedekind's psi function: psi(x) = n
.
Equivalent to n.inverse_psi.len
, but much faster.
Aliases: inverse_dedekind_psi_len
inverse_psi_max
n.inverse_psi_max
Returns the largest solution x
to Dedekind's psi function: psi(x) = n
.
Equivalent with:
n.inverse_psi.max
Returns nil
if there are no solutions.
Aliases: inverse_dedekind_psi_max
inverse_psi_min
n.inverse_psi_min
Returns the smallest solution x
to Dedekind's psi function: psi(x) = n
.
Equivalent with:
n.inverse_psi.min
Returns nil
if there are no solutions.
Aliases: inverse_dedekind_psi_min
inverse_sigma
n.inverse_sigma(k=1)
The method returns all the numbers m
for which sigma(m,k) = n
, where n
is given.
say inverse_sigma(42) # [20, 26, 41]
say inverse_sigma(22100, 2) # [120, 130, 141]
Also works with arbitrary large integers:
say inverse_sigma(9325257382230393314439814176)
inverse_sigma_len
n.inverse_sigma_len(k=1)
Returns the number of solutions to the sigma sum of divisors function: sigma_k(x) = n
.
Equivalent with:
n.inverse_sigma(k).len
inverse_sigma_max
n.inverse_sigma_max(k=1)
Returns the largest solution x to the sum of divisors function: sigma_k(x) = n
.
Equivalent with:
n.inverse_sigma(k).max
Returns nil
if there are no solutions.
inverse_sigma_min
n.inverse_sigma_min(k=1)
Returns the smallest solution x to the sum of divisors function: sigma_k(x) = n
.
Equivalent with:
n.inverse_sigma(k).min
Returns nil
if there are no solutions.
inverse_uphi
n.inverse_uphi
Returns an array with all the solutions x
to uphi(x) = n
.
say inverse_uphi(120) #=> [121, 143, 144, 155, 164, 183, 220, 231, 240, 242, 286, 310, 366, 462]
inverse_usigma
n.inverse_usigma
Returns an array with all the possible solutions x
to usigma(x) = n
.
say inverse_usigma(120) #=> [60, 87, 92, 95, 99]
invmod
n.invmod(m)
Returns the modular inverse of n
modulo m
.
iphi
iphi(n, k=1)
Infinitary analog of Euler's phi function. (OEIS: A091732)
ipolygonal_root
ipolygonal_root(n,k)
First integer k-gonal root of n
.
say ipolygonal_root(n, 5) # integer pentagonal root
say ipolygonal_root(polygonal(10, 5), 5) # prints: "10"
ipolygonal_root2
ipolygonal_root2(n,k)
Second integer k-gonal root of n
.
say ipolygonal_root2(n, 5) # second integer pentagonal root
say ipolygonal_root2(polygonal(-10, 5), 5) # prints: "-10"
ipow
ipow(b,n)
Integer exponentiation: b^n
.
Aliases: powint
ipow10
ipow10(n)
Integer exponentiation: 10^n
.
ipow2
ipow2(n)
Integer exponentiation: 2^n
.
iquadratic_formula
iquadratic_formula(a,b,c)
Returns a list of integer solutions (x_1, x_2)
to the quadratic equation: a*x^2 + b*x + c = 0
, defined as:
floor((-b ± isqrt(b^2 - 4ac)) / (2a))
Example:
say [iquadratic_formula(13, -42, -34)] #=> [3, -1]
Aliases: integer_quadratic_formula
irand
irand(n)
irand(a,b)
Returns a cryptographically-secure pseudorandom integer in the range 0..n
(all inclusive), or in the range a..b
(all inclusive).
If a
is greater than b
, the returned integer will be in the range b..a
.
irand(10) # a pseudorandom integer in the interval [0, 10]
irand(10, 20) # a pseudorandom integer in the interval [10, 20]
The underlying CSPRNG is ISAAC-32.
iroot
n.iroot(k)
Integer k-th root of n
.
Aliases: rootint
irootrem
n.irootrem(k)
Returns a list with the integer k-th root of n
and k-th root remainder of n
.
Equivalent with:
(n.iroot(k), n - n.iroot(k)**k)
is_abs_euler_psp
n.is_abs_euler_psp
Returns true if n
is an absolute Euler pseudoprime: p-1 | (n-1)/2
for every p|n
, where n
is a squarefree composite integer.
say 10.by { .is_abs_euler_psp } #=> OEIS: A033181
Aliases: is_absolute_euler_psp
is_abundant
n.is_abundant
Returns true if n
is an abundant number, else false.
say 20.by { .is_abundant } #=> OEIS: A005101
An abundant number is smaller than the sum of its positive proper divisors.
is_aks_prime
n.is_aks_prime
Return true if n
passes the Agrawal-Kayal-Saxena (AKS) primality test.
is_almost_prime
n.is_almost_prime(k=2)
Return true if n
is a k-almost prime (i.e.: true iff n
is the product of k
not necessarily distinct primes).
Equivalently, k-almost primes are numbers n
that satisfy bigomega(n) == k
.
say 20.by { .is_almost_prime(1) } # primes
say 20.by { .is_almost_prime(2) } # semiprimes
say 20.by { .is_almost_prime(3) } # 3-almost primes
In order for n
to have at least k
prime factors, without having any prime factors less than or equal to B
, it implies that n
must be greater than B^k
, since all the prime factors of n
are greater than B
.
By setting Num!USE_CONJECTURES = true
, the function uses a conjectured approach based on Pollard's rho method to find a larger bound for B
, which requires O(sqrt(B))
steps to find a prime factor less than B
. Therefore, if we take B = 10^12
, after c*10^6
iterations (we use c=2
) of the Pollard rho method without success in finding a prime factor of n
, it's very probable that n
has no prime factor less than 10^12
.
By enabling the conjectured approach, the function becomes about 5x faster than the rigorous method, for large enough inputs.
is_amicable
is_amicable(n,m)
Returns true if the numbers n
and m
are "amicable", else false.
Amicable numbers are two different numbers so related that the sum of the proper divisors of each is equal to that of the other.
say is_amicable(220, 284) #=> true
is_between
n.is_between(min, max)
Returns a true value when `n >= min` and `n <= max`.
is_bfsw_psp
n.is_bfsw_psp
Returns true if n
passes a slightly stronger and faster variant of the BFW primality test, based on the Lucas-V function, checking the following congruences:
V_{n+1} == 2*Q (mod n)
Q^(n+1) == Q^2 (mod n)
where Q = -2
and P
is the first integer >= 2 such that D = P^2 - 4*Q
gives kronecker(D, n) == -1
.
There are no known composites that pass this test.
is_bpsw_prime
n.is_bpsw_prime
Returns true if n
passes the B-PSW primality test (extra-strong variant).
is_carmichael
n.is_carmichael
Determine if n
is a Carmichael number or not.
is_centered_polygonal
n.is_centered_polygonal(k)
Returns true if n
is a centered k-gonal number.
say 15.by { .is_centered_polygonal(3) } # centered triangular numbers
say 15.by { .is_centered_polygonal(6) } # centered hexagonal numbers
is_chebyshev
n.is_chebyshev
Returns true if n
is an odd composite Chebyshev pseudoprime, as defined by OEIS A175530.
Aliases: is_chebyshev_psp, is_chebyshev_pseudoprime
is_complex
x.is_complex
Returns true if x
is a complex number.
say is_complex(complex(4)) # false (is real)
say is_complex(complex(4i)) # false (is imaginary)
say is_complex(complex(3+4i)) # true
is_composite
n.is_composite
Returns true if n
is a positive > 1 composite number.
is_congruent
n.is_congruent(a,m)
Returns true when n
is congruent to a
modulo m
.
say 99923.is_congruent(-2, 5) #=> true
say 99923.is_congruent(3, 5) #=> true
Also defined for rationals, floats and complex numbers:
say is_congruent(124, 1/4, 3/4) #=> true
is_coprime
is_coprime(a,b)
Returns true if gcd(a,b) = 1
.
is_cube
n.is_cube
Return true if n
is a cube number (i.e.: if it can be written as b^3
, for some integer b
).
is_cubefree
n.is_cubefree
Returns true if n
is not divisible by any perfect cube > 1.
is_cubefull
n.is_cubefull
Returns true if n
is divisible by the cubes of all its prime factors.
is_cyclic
n.is_cyclic
Returns true when gcd(phi(n), n) = 1
, where phi(n)
is the Euler totient function.
say 30.by { .is_cyclic } # OEIS: A003277
is_deficient
n.is_deficient
Returns true if n
is a deficient number, else false.
A deficient number is greater than the sum of its positive proper divisors.
is_ecpp_prime
n.is_ecpp_prime
Return true if n
can be proved prime using the Elliptic Curve Primality Proving algorithm.
useed
iseed(n)
useed(n)
Takes a nonnegative integer n
, which is used to seed the internal CSPRNG (currently, ISAAC-32) used for random functions, such as irand
, urand
and the random prime functions.
For good security, n
should be at least an 128-bit random integer.
Internally, the value of n
is converted into a binary string, SHA-512 hashed and expanded into a 8192-bit key.
is_euler_psp
n.is_euler_psp(bases...)
Return true if n
is an Euler-Jacobi pseudoprime, given a list of bases.
Aliases: is_euler_pseudoprime
is_even
n.is_even
Returns true if n
is an integer divisible by 2.
is_fib
n.is_fib
Returns true if n
is a Fibonacci number. False otherwise.
Aliases: is_fibonacci
is_fib_psp
n.is_fib_psp(P=1, Q=-1)
Returns true if n
passes the Lucas test to the U
, using the parameters P
and Q
.
say 10.by { .is_composite && .is_lucasU_psp } # Fibonacci pseudoprimes
say 10.by { .is_odd_composite && .is_lucasU_psp(2, -1) } #=> OEIS: A327651
Aliases: is_lucasu_psp, is_lucasU_psp, is_fibonacci_psp, is_lucasU_pseudoprime, is_fibonacci_pseudoprime
is_float
x.is_float
Returns true if x
is stored as a floating-point number.
is_frobenius_psp
n.is_frobenius_psp(a,b)
Return true if n
is a Frobenius probable prime with respect to the polynomial x^2 - ax + b
.
Aliases: is_frobenius_pseudoprime
is_fundamental
n.is_fundamental
Returns true if n
is a fundamental discriminant.
is_gaussian_prime
is_gaussian_prime(a,b)
Returns true if a+b*i is a Gaussian prime.
say is_gaussian_prime(3, 4) #=> false
say is_gaussian_prime(13, 42) #=> true
Provided by Math::Prime::Util::GMP >= 0.52.
isigma
isigma(n, k=1)
Returns the sum of the infinitary divisors of n
, each divisor raised to the k-th power.
say 20.of { .isigma } #=> OEIS: A049417
isigma0
isigma0(n)
Returns the count of the infinitary divisors of n
.
say 20.of { .isigma0 } #=> OEIS: A037445
is_imag
x.is_imag
Returns true if x
is an imaginary number.
say is_imag(complex(4)) # false (is real)
say is_imag(complex(4i)) # true
say is_imag(complex(3+4i)) # false (is complex)
is_imprimitive_carmichael
n.is_imprimitive_carmichael
Returns true if n
is an imprimitive Carmichael numbers, as defined by OEIS: A328935.
say 325533792014488126487416882038879701391121.is_imprimitive_carmichael # true
The method efficiently tries to factorize large Carmichael numbers, using the miller_factor(n)
method.
is_inf
x.is_inf
Returns true if x
equals positive infinity (Inf
).
is_int
x.is_int
Returns true if x
is an integer.
is_khashin_psp
n.is_khashin_psp
Return true if n
passes the Frobenius test of Sergey Khashin.
Aliases: is_khashin_pseudoprime, is_frobenius_khashin_psp, is_frobenius_khashin_pseudoprime
is_llr_prime
n.is_llr_prime(k)
Returns true if 2^n * k - 1
is prime, using the Lucas-Lehmer-Riesel (LLR) primality test.
say 15.by { .is_llr_prime(3) } # numbers n such that 2^n * 3 - 1 is prime
is_lucas_psp
n.is_lucas_psp
Return true if n
is a Lucas pseudoprime.
Aliases: is_lucas_pseudoprime
is_lucas
n.is_lucas
Returns true if n
is a Lucas number. False otherwise.
is_lucas_carmichael
n.is_lucas_carmichael
Returns true if n
is a Lucas-Carmichael number.
say 10.by(:is_lucas_carmichael) # OEIS: A006972
say is_lucas_carmichael(58735331016965175152455996272482303) # true
is_lucasv_psp
n.is_lucasv_psp(P=1, Q=-1)
Returns true if n
passes the Lucas test to the V
sequence, using the parameters P
and Q
.
say 10.by { .is_composite && .is_lucasV_psp } # Bruckman-Lucas pseudoprimes
say 10.by { .is_odd_composite && .is_lucasV_psp(2, -1) } #=> OEIS: A330276
Aliases: is_lucasV_psp, is_bruckman_lucas_psp, is_lucasV_pseudoprime, is_bruckman_lucas_pseudoprime
is_mersenne_prime
is_mersenne_prime(p)
Returns true if 2^p - 1
is a Mersenne prime.
say 607.is_mersenne_prime # prints true; (2**607 - 1) is a Mersenne prime.
is_mone
x.is_mone
Returns true if x
equals -1.
is_nan
x.is_nan
Returns true if x
holds the Not-a-Number special value (NaN
).
is_neg
x.is_neg
Returns true if x
is negative.
Aliases: is_negative
is_ninf
x.is_ninf
Returns true if x
equals negative infinity (-Inf
).
is_nm1_prime
n.is_nm1_prime
Return true if n
can be proved prime using the factorization of n-1
.
Aliases: is_pm1_prime, is_nminus1_prime
is_noncubefree
n.is_noncubefree
Returns true if n
is a positive integer divisible by the cube of a prime.
is_nonpowerfree
n.is_nonpowerfree
Returns true if n
is a positive integer divisible by the k-th power of a prime.
is_nonsquarefree
n.is_nonsquarefree
Returns true if n
is a positive integer divisible by the square of a prime.
is_np1_prime
n.is_np1_prime
Return true if n
can be proved prime using the factorization of n+1
.
Aliases: is_pp1_prime, is_nplus1_prime
is_ntf
g.is_ntf(n)
Returns true if g
is a nontrivial integer factor of n
.
Equivalent with (assuming g
and n
are both integers):
g.divides(n) && g.is_between(2, n-1)
Aliases: is_nontrivial_factor
is_odd
n.is_odd
Returns true when n
is an integer not divisible by 2.
is_odd_composite
n.is_odd_composite
Returns true when n
is an odd composite integer.
is_omega_prime
n.is_omega_prime(k=2)
Return true if n
is a k-omega prime (i.e.: true if n
is divisible by exactly k
different primes).
Equivalently, k-omega primes are numbers n
such that omega(n) == k
.
say 20.by { .is_omega_prime(1) } # prime powers
say 20.by { .is_omega_prime(2) } # numbers n such that omega(n) == 2
In order for n
to have at least k
prime factors, without having any prime factors less than or equal to B
, it implies that n
must be greater than B^k
, since all the prime factors of n
are greater than B
.
By setting Num!USE_CONJECTURES = true
, the function uses a conjectured approach based on Pollard's rho method to find a larger bound for B
, which requires O(sqrt(B))
steps to find a prime factor less than B
. Therefore, if we take B = 10^12
, after c*10^6
iterations (we use c=2
) of the Pollard rho method without success in finding a prime factor of n
, it's very probable that n
has no prime factor less than 10^12
.
By enabling the conjectured approach, the function becomes about 5x faster than the rigorous method, for large enough inputs.
is_one
n.is_one
Returns true when n
equals 1.
is_over_psp
n.is_over_psp
Returns true if n
is an overpseudoprime to base b
. Multiple bases can also be provided.
An overpseudoprime to base b
is a also a strong Fermat pseudoprime to base b
and a super-pseudoprime to base b
, where znorder(b,n) == znorder(b,p) for every p|n.
say 10.by { .is_composite && .is_over_psp } # overpseudoprimes to base 2
say 10.by { .is_composite && .is_over_psp(3) } # overpseudoprimes to base 3
Aliases: is_over_pseudoprime, is_overpseudoprime
is_palindrome
n.is_palindrome(b=10)
Returns true if the given number n
is palindromic in the given base b
. When no base is given, it defaults to 10.
# Numbers that are palindromic in bases 2 and 10 (OEIS: A007632)
say 1e6.range.grep{ .is_palindrome(2) && .is_palindrome(10) }
Aliases: is_palindromic
is_pell_lucas_psp
n.is_pell_lucas_psp
It returns true if V_n(2, -1) = 2 (mod n)
.
say 20.by { .is_pell_lucas_pseudoprime } #=> OEIS: A270342
say 20.by { .is_pell_lucas_pseudoprime && .is_composite } #=> OEIS: A335668
say 20.by { .is_pell_lucas_pseudoprime && .is_composite && .is_odd } #=> OEIS: A330276
Aliases: is_pell_lucas_pseudoprime
is_pell_psp
n.is_pell_psp
These are odd numbers that satisfy:
U_n(2, -1) = (2|n) (mod n)
Example:
say 10.by { .is_pell_pseudoprime && .is_composite } # OEIS: A099011
Aliases: is_pell_pseudoprime
is_perfect
n.is_perfect
Returns true if n
is a perfect number (i.e.: sigma(n) == 2*n).
is_perrin_psp
n.is_perrin_psp
Returns true if n
passes the Perrin primality test.
Aliases: is_perrin_pseudoprime
is_plumb_psp
n.is_plumb_psp
Return true if n
passes Colin Plumb's Euler Criterion primality test.
Aliases: is_euler_plumb_psp, is_plumb_pseudoprime, is_euler_plumb_pseudoprime
is_polygonal
is_polygonal(n,k)
Returns true if n
is a first k-gonal number.
say is_polygonal(145, 5) #=> 1 ("145" is a pentagonal number)
say is_polygonal(155, 5) #=> 0
is_polygonal2
is_polygonal2(n,k)
Returns true when n
is a second k-gonal number.
say is_polygonal2(145, 5) #=> 0
say is_polygonal2(155, 5) #=> 1 ("155" is a second-pentagonal number)
is_pos
x.is_pos
Returns true when x
is a positive integer.
Aliases: is_positive
is_powerfree
n.is_powerfree(k=2)
Returns true when all the exponents in the prime-power factorization of n
are less than k
.
say 15.by { .is_powerfree(2) } # squarefree numbers
say 15.by { .is_powerfree(3) } # cubefree numbers
is_powerful
n.is_powerful(k=2)
Returns true when all the exponents in the prime-power factorization of n
are greater than or equal to k
.
is_power_of
n.is_power_of(b)
Return true if n
is a power of b
, such that n = b^k
for some k
>= 0
:
n.is_power_of(b) # true if n == b^k for some k >= 0
Example:
say 1000.range.grep { .is_power_of(2) } # powers of 2
say 1000.range.grep { .is_power_of(5) } # powers of 5
is_pow
n.is_power
n.is_power(k)
When k
is provided, it returns true if n
can be expressed as n = b^k
for some integer b
>= 1
.
say 225.is_power # true: 225 == 15**2
say 100.is_power(2) # true: 100 is square (10**2)
say 125.is_power(3) # true: 125 is a cube ( 5**3)
When k
is omitted, it true if n
is a perfect power.
Aliases: is_power, is_perfect_power
is_practical
n.is_practical
Returns true if n
is a practical number (OEIS: A005153).
say 20.by { .is_practical }
is_prime
n.is_prime
Returns true if n
is a prime number.
is_prime_power
n.is_prime_power
Returns true if n
is a power of some prime.
is_primitive_abundant
n.is_primitive_abundant
Returns true if n
is a primitive abundant number, else false.
say 20.by { .is_primitive_abundant } #=> OEIS: A091191
A primitive abundant number is an abundant number having no abundant proper divisor.
is_primitive_root
n.is_primitive_root(m)
Returns true if n
is a primitive root modulo m
.
is_prob_prime
is_prob_prime(n)
Returns true if n
is probably prime. The method does some trial division, then it performs a B-PSW test.
is_prob_squarefree
n.is_prob_squarefree
n.is_prob_squarefree(limit)
Returns true if n
is probably squarefree, checking if n
is divisible by a square p^2
with p
less than or equal to limit
:
say is_prob_squarefree(2**512 - 1, 1e6) # true (probably squarefree)
say is_prob_squarefree(10**136 + 1, 1e3) # false (definitely not squarefree)
If n
is less than limit^3
and the function returns true
, then n
is definitely squarefree.
If the limit
parameter is omitted, multiple limits are tested internally, trying to find a square factor of n
, up to limit = 10^7
.
is_proth_prime
n.is_proth_prime(k)
Returns true if 2^n * k + 1
is prime, using the Proth primality test.
say 15.by { .is_proth_prime(3) } # numbers n such that 2^n * 3 + 1 is prime
is_prov_prime
n.is_prov_prime
Returns true if n
is definitely a prime.
Aliases: is_provable_prime
is_psp
n.is_psp(bases...)
Returns true if n
is a Fermat pseudoprime to the provided bases.
Each base must be coprime to n
.
Aliases: is_fermat_psp, is_pseudoprime, is_fermat_pseudoprime
is_pyramidal
n.is_pyramidal(k)
Returns true if n
is a k-gonal pyramidal number.
say 15.by { .is_pyramidal(3) } #=> tetrahedral numbers
say 15.by { .is_pyramidal(5) } #=> pentagonal pyramidal numbers
isqrt
n.isqrt
Integer square root of n
.
Aliases: sqrtint
isqrtrem
n.isqrtrem
Returns a list with the integer square root of n
and the square root remainder of n
.
Equivalent with:
(n.isqrt, n - n.isqrt**2)
is_rat
x.is_rat
Returns true if x
is a rational number.
is_real
x.is_real
Returns true if x
is a real number.
say is_real(complex(4)) # true
say is_real(complex(4i)) # false (is imaginary)
say is_real(complex(3+4i)) # false (is complex)
is_rough
n.is_rough(k)
Returns true if all prime factors of n
are >= k
.
say 30.by { .is_rough(3) } #=> OEIS: A005408
say 30.by { .is_rough(5) } #=> OEIS: A007310
say 30.by { .is_rough(7) } #=> OEIS: A007775
# ...
say 30.by { .is_rough(23) } #=> OEIS: A166063
is_safe_prime
n.is_safe_prime
It returns true if both n
and (n-1)/2
are prime.
say 30.by { .is_safe_prime } #=> OEIS: A005385
is_semiprime
n.is_semiprime
Returns true if n
has exactly two prime factors (not necessarily distinct).
is_strong_lucas_psp
n.is_strong_lucas_psp
Return true if n
is a strong Lucas pseudoprime.
Aliases: is_strong_lucas_pseudoprime
is_smooth
n.is_smooth(k)
Returns true if all the prime factors of n
are <= k
. False otherwise.
is_smooth_over_prod
n.is_smooth_over_prod(k)
Returns true when n
is smooth over the prime factors of k
.
is_strong_psp
n.is_strong_psp(bases...)
Return true if n
is a strong Fermat pseudoprime to the given bases.
Each base must be coprime to n
.
Aliases: miller_rabin, is_strong_fermat_psp, is_strong_pseudoprime, is_strong_fermat_pseudoprime
is_square
n.is_square
Returns true if n
is a perfect square integer.
Aliases: is_sqr, is_perfect_square
is_squarefree
n.is_squarefree
Returns true if the prime factorization of n
does not include duplicated factors (i.e.: n
is not divisible by a square).
Aliases: is_square_free
is_squarefree_almost_prime
n.is_squarefree_almost_prime(k=2)
Returns true if n
is a squarefree k-almost prime (i.e.: true iff n
is the product of k
distinct primes).
Equivalently, k-almost primes are numbers n
that satisfy bigomega(n) == omega(n) == k
.
say 20.by { .is_squarefree_almost_prime(1) } # primes
say 20.by { .is_squarefree_almost_prime(2) } # squarefree semiprimes
say 20.by { .is_squarefree_almost_prime(3) } # sphenic numbers
is_squarefree_semiprime
is_squarefree_semiprime(n)
Returns true if n
is a squarefree semiprime (i.e.: n = p*q
, where p
and q
are two distinct primes).
is_squarefull
n.is_squarefull
Returns true if n
is divisible by the squares of all its prime factors.
is_stronger_lucas_psp
n.is_stronger_lucas_psp
Return true if n
is an extra-strong Lucas pseudoprime.
Aliases: is_extra_strong_lucas_psp, is_stronger_lucas_pseudoprime, is_extra_strong_lucas_pseudoprime
is_strong_fib
n.is_strong_fib
Returns true if n
is a strong Fibonacci pseudoprime, satisfying:
V_n(P,Q) = P (mod)
for Q = -1 and all P.
Odd composite integer n
is a strong Fibonacci pseudoprime iff:
1) n is a Carmichael number: p-1 | n-1
2) 2(p + 1) | (n − 1) or 2(p + 1) | (n − p)
for each prime p|n.
Example:
say is_strong_fibonacci_pseudoprime(443372888629441) #=> true
say is_strong_fibonacci_pseudoprime(39671149333495681) #=> true
Aliases: is_strong_fib_psp, is_strong_fibonacci, is_strong_fibonacci_psp, is_strong_fibonacci_pseudoprime
is_strongish_lucas_psp
n.is_strongish_lucas_psp
Return true if n
is almost an extra-strong Lucas pseudoprime.
Aliases: is_strongish_lucas_pseudoprime
is_super_psp
n.is_super_psp(bases...)
It returns true if the given value of n
is a super-pseudoprime to the given bases.
When no base is given, the base 2
is used (which represents the Super-Poulet numbers: A050217)
# Super-Poulet numbers (OEIS: A050217)
say 1e4.range.grep { .is_super_pseudoprime }.grep{ .is_composite }
# Super-Poulet numbers to base 3 (OEIS: A328662)
say 1e4.range.grep { .is_super_pseudoprime(3) }.grep{ .is_composite }
# Super-Poulet numbers to base 2 and 3
say 1e5.range.grep { .is_super_pseudoprime(2, 3) }.grep{ .is_composite }
Aliases: is_super_pseudoprime, is_superpseudoprime
is_totient
n.is_totient
Given an integer n
, returns true if there exists an integer x
such that euler_phi(x) == n
.
isub
isub(a,b)
Integer subtraction: a-b
.
Aliases: subint
is_underwood_psp
n.is_underwood_psp
Return true if n
passes the efficient Frobenius test of Paul Underwood.
Aliases: is_underwood_pseudoprime, is_frobenius_underwood_psp, is_frobenius_underwood_pseudoprime
is_vpsp
n.is_vpsp
Returns true if n
passes the Lucas-V BFW test: V_{n+1} == 2*Q (mod n)
for carefully chosen values of P
and Q
.
The composite numbers that pass this test are extremely rare (OEIS A365514).
When combined with a strong Fermat pseudoprime test to base 2, there are no known composites that pass both tests.
Reference:
Strengthening the Baillie-PSW primality test
https://arxiv.org/abs/2006.14425
Aliases: is_bfw_psp
is_zero
x.is_zero
Returns true when x
equals 0.
jacobi
jacobi(a,n)
Returns the Jacobi symbol: (a|n)
.
jordan_totient
jordan_totient(n,k)
Jordan's totient J_k(n)
, which is a generalization of Euler's totient function.
kronecker
kronecker(a,n)
Returns the Kronecker symbol: (a|n)
.
laguerre
laguerre(n)
laguerre(n, x)
Laguerre polynomials: L_n(x)
.
When x
is omitted, a Polynomial object is returned.
Aliases: laguerreL, laguerre_polynomial
lambda
lambda(n)
Carmichael lambda function: λ(n)
, defined as the smallest positive integer m
such that:
powmod(a, m, n) == 1
for every integer a
between 1
and n
that is coprime to n
.
Alias: carmichael_lambda.
lambert_w
lambert_w(x)
The Lambert-W function. When the value of x
is less than -1/e
, it returns a complex number.
It also accepts a complex number as input.
Identities (assuming x>0):
LambertW(exp(x)*x) = x
LambertW(log(x)*x) = log(x)
lcm
lcm(...)
Least common multiple of a list of integers.
legendre
legendre(a,p)
Returns the Legendre symbol: (a|p)
.
legendreP
legendreP(n)
legendreP(n,x)
Legendre polynomials: P_n(x)
.
When x
is omitted, a Polynomial object is returned.
Aliases: legendrep, legendre_polynomial
legendre_phi
n.legendre_phi(k)
Returns the count of numbers <= n
that are not divisible by the first k
primes.
Equivalent with:
prime(k+1).rough_count(n)
len
n.len(b=10)
Returns the number of digits of the integer part of n
in a given base..
say 5040.len #=> 4
say 5040.len(2) #=> 13
Aliases: size, length
lgamma
lgamma(x)
Natural logarithm of abs(Γ(x))
.
Aliases: gamma_abs_log
lgrt
lgrt(x)
Returns the "logarithm-root" of x
, such that lgrt(x) ** lgrt(x) =~= x
.
say lgrt(100) #=> 3.59728502354041750549765225178229
say lgrt(-100) #=> 3.70202936660214594290193962952737+1.34823128471151901327831464969872i
li
li(x)
Returns the logarithmic integral of x.
say 100.li # prints: 30.12614158...
li2
li2(x)
Dilogarithm function, defined as the integral of -log(1-t)/t
from 0
to x
.
lift
n.lift
Returns the self object.
linear_congruence
linear_congruence(n, r, m)
Return an array with the values of x
satisfying the following linear congruence:
n*x == r (mod m)
Example:
say linear_congruence(3, 12, 15) #=> [4, 9, 14]
liouville
liouville(n)
The Liouville function.
Equivalent to:
(-1)**omega(n)
liouville_sum
liouville_sum(n)
liouville_sum(a,b)
Computes partial sums of the Liouville lambda function:
Sum_{k=1..n} liouville(k)
When an additional argument is given, the returned result is:
Sum_{k=a..b} liouville(k)
Example:
say liouville_sum(10**9) #=> -25216
say liouville_sum(10**9, 10**10) #=> -90809
ln
x.ln
Natural logarithm of x
.
ln2
Num.ln2
Returns the natural logarithm of 2 constant.
lnbern
lnbern(n)
Returns the natural logarithm of the n-th Bernoulli number.
Aliases: bern_log, lnbernreal, bernoulli_log
lngamma
lngamma(x)
Natural logarithm of Γ(x)
.
Aliases: gamma_log
lnsuperfactorial
lnsuperfactorial(n)
Natural logarithm of superfactorial(n)
.
Aliases: superfactorial_ln, superfactorial_log
lnsuperprimorial
lnsuperprimorial(n)
Natural logarithm of superprimorial(n)
.
Aliases: superprimorial_ln, superprimorial_log
log
log(x)
log(x, b)
Natural logarithm of x
to base e, or to a given base b
.
log10
x.log10
Logarithm of x
to base 10.
log2
x.log2
Logarithm of x
to base 2.
logarithmic_derivative
logarithmic_derivative(n)
Return the logarithmic derivative of n
, defined as:
derivative(n)/n
lpf
lpf(n)
Returns the least prime factor of n
.
Defined with the base-cases:
lpf(0) = 0
lpf(1) = 1
Example:
say lpf(fibonacci(1234)) #=> 234461
lpf_sum
lpf_sum(n)
lpf_sum(a,b)
Returns the sum of least prime factors of numbers from 1
to n
, or in the range a..b
.
say 30.of { .lpf_sum } #=> OEIS: A088821
lsb
lsb(n)
Returns the index of the least significant bit of n
that is nonzero.
say 0b110010101111000000.lsb # 6
lucas
lucas(n)
Returns the n-th Lucas number.
lucas_carmichael
k.lucas_carmichael(n)
k.lucas_carmichael(a, b)
Returns an array with all the Lucas-Carmichael numbers <= n
or in the range a..b
that have exactly k
prime factors.
say 3.lucas_carmichael(10000) # 3-Lucas-Carmichael numbers
say 4.lucas_carmichael(10000, 100000) # 4-Lucas-Carmichael numbers in range
lucas_factor
n.lucas_factor(j=1, tries=100)
A factorization method, using the modular Lucas sequences, which is effective in factoring Carmichael numbers, Fermat pseudoprimes, Lucas pseudoprimes and Lucas-Carmichael numbers.
say lucas_factor(2425361208749736840354501506901183117777758034612345610725789878400467)
The product of the factors will give back n
. However, some factors may be composite.
Aliases: lucas_miller_factor
lucas_mod
lucasmod(n,m)
Efficiently compute the n-th Lucas number modulo m
.
Aliases: lucasmod
lucasU
lucasU(P, Q, n)
The Lucas U_n(P, Q)
function.
say 20.of{|n| lucasU(1, -1, n) } # the Fibonacci numbers
say 20.of{|n| lucasU(2, -1, n) } # the Pell numbers
say 20.of{|n| lucasU(1, -2, n) } # the Jacobsthal numbers
Aliases: lucasu
lucasUmod
lucasUmod(P,Q,n,m)
Efficiently compute the Lucas U_n(P, Q)
function modulo m
.
Aliases: lucasumod
lucasUVmod
lucasUVmod(P,Q,n,m)
Efficiently compute the Lucas U_n(P, Q)
and V_n(P,Q)
functions modulo m
.
Equivalent with:
(lucasUmod(P,Q,n,m), lucasVmod(P,Q,n,m))
Aliases: lucasuvmod
lucasV
lucasV(P, Q, n)
The Lucas V_n(P, Q)
function.
say 20.of{|n| lucasV(1, -1, n) } # the Lucas numbers
say 20.of{|n| lucasV(2, -1, n) } # the Pell-Lucas numbers
say 20.of{|n| lucasV(1, -2, n) } # the Jacobsthal-Lucas numbers
Aliases: lucasv
lucasvmod
lucasVmod(P,Q,n,m)
Efficiently compute the Lucas V_n(P, Q)
function modulo m
.
Aliases: lucasVmod
make_coprime
n.make_coprime(k)
Returns the largest divisor of n
that is coprime to k
.
mangoldt
mangoldt(n)
The Mangoldt function. For the exponential values, see exp_mangoldt
.
max
max(...)
Returns the maximum value from a list of numbers.
Aliases: vecmax
mbe_factor
n.mbe_factor(tries=10)
Tries to find a factor of n
, by using the "Modular Binary Exponentiation" factorization method (randomized version).
This method is particularly effective for numbers that contain a prime factor p
such that p-1
is sufficiently smooth.
The running time of the method, is: O(tries * log(n)^2)
.
Example:
say mbe_factor(2**64 + 1, 1) #=> [274177, 67280421310721]
The product of the factors will give back n
. However, some factors may be composite.
mertens
mertens(n)
mertens(a,b)
Returns the Mertens functions, which is defined as the partial sums of the Moebius function:
Sum_{k=1..n} moebius(k)
When an additional argument is given, the returned result is:
Sum_{k=a..b} moebius(k)
Example:
say mertens(100000) # equivalent with: (1..100000 -> sum { .moebius })
say mertens(21, 123) # equivalent with: (21..123 -> sum { .moebius })
mfac
mfac(n,k)
mfactorial(n,k)
The generalized multi-factorial of n
.
say 15.of { .mfac(2) } # double-factorials (OEIS: A006882)
say 15.of { .mfac(3) } # triple-factorials (OEIS: A007661)
Aliases: mfactorial, multi_factorial
miller_factor
n.miller_factor(tries=100)
A factorization method, based on the Miller-Rabin primality test. Effective in factoring Carmichael numbers and Fermat pseudoprimes.
It returns an array with the factors of n
. The product of the factors will give back n
. However, some factors may be composite.
Aliases: miller_rabin_factor
miller_rabin_random
n.miller_rabin_random(k)
Return true if n
passes the Miller-Rabin primality test with k
random bases.
min
min(...)
Returns the smallest value from a list of numbers.
Aliases: vecmin
mobius_range
mobius_range(a, b)
Returns an array with the Möbius values for the range a..b
.
say moebius_range(7, 17) => [-1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1]
Aliases: moebius_range
mone
Num.mone
Returns the -1 value.
motzkin
motzkin(n)
Returns the n-th Motzkin number. (OEIS: A001006)
say 10.of { .motzkin } #=> [1, 1, 2, 4, 9, 21, 51, 127, 323, 835]
msb
msb(n)
Returns the index of the most significant bit of n
.
say 0b110010101111000000.msb # 17
muladdmod
muladdmod(a, b, c, m)
Modular operation: (a*b + c) % m
.
muladdmulmod
muladdmulmod(a, b, c, d, m)
Modular operation: (a*b + c*d) % m
.
mulmod
mulmod(a,b,m)
Modular integer multiplication: (a*b) % m
.
say mulmod(43, 97, 127) # == (43*97)%127
mulsubmod
mulsubmod(a, b, c, m)
Modular operation: (a*b - c) % m
.
mulsubmulmod
mulsubmulmod(a, b, c, d, m)
Modular operation: (a*b - c*d) % m
.
multinomial
multinomial(...)
The multinomial coefficient, given a list of native integers.
say multinomial(1, 4, 4, 2) #=> 34650
nan
Num.nan
Returns the Not-a-Number special value (NaN
).
nbsigma
nbsigma(n, k=1)
Returns the sum of the non-bi-unitary divisors of n
, each divisor raised to the k-th power.
say 30.of { .nbsigma } #=> OEIS: A319072
nbsigma0
nbsigma0(n)
Returns the count of the non-bi-unitary divisors of n
.
next_composites
n.next_composites(start=4)
Returns an array with n
consecutive composite numbers starting from start
.
say 5.next_composites #=> [4, 6, 8, 9, 10]
say 5.next_composites(50) #=> [50, 51, 52, 54, 55]
Aliases: ncomposites, n_composites
nd
n.st({...})
n.nd({...})
n.rd({...})
n.th({...})
It returns the n-th value for which the provided block evaluates to a true value, starting counting from 0.
say 100.th { .is_prime } # 100-th prime
Also aliased as .st
, .nd
and .rd
:
say 1.st { .is_prime } # first prime
say 2.nd { .is_prime } # second prime
say 3.rd { .is_prime } # third prime
Aliases: rd, st, th
neg
x.neg
Negates the sign of x
(equivalent with: -x
).
nesigma
nesigma(n, k=1)
Returns the sum of the nonexponential divisors of n
, each divisor raised to the k-th power.
say 30.of { .nesigma } #=> OEIS: A160135
nesigma0
nesigma0(n)
Returns the count of the nonexponential divisors of n
.
say 30.of { .nesigma0 } #=> OEIS: A160097
new
Number(string, base=10)
Num.new(string, base=10)
Create a new Number object, given a string and a base.
Aliases: call
next_almost_prime
n.next_almost_prime(k=2)
Returns the next k-almost prime greater than n
.
next_composite
n.next_composite
Given a nonnegative integer n
, returns the next composite number greater than n
.
next_cubefree
n.next_cubefree
Returns the next cubefree number greater than n
.
next_cubefull
n.next_cubefull
Returns the next cubefull (or 2-full) number greater than n
.
next_noncubefree
n.next_noncubefree
Returns the next noncubefree number greater than n
.
next_nonpowerfree
n.next_nonpowerfree(k=2)
Returns the next k-nonpowerfree number greater than n
.
next_nonsquarefree
n.next_nonsquarefree
Returns the next nonsquarefree number greater than n
.
next_omega_prime
n.next_omega_prime(k=2)
Returns the next k-omega prime greater than n
.
next_palindrome
n.next_palindrome(b=10)
Efficiently returns the next palindrome in base-b greater than n
.
# Iterate over the base-10 palindromic numbers < 10^6
for (var n = 0; n < 1e6; n = n.next_palindrome) {
say n
}
next_perfect_power
next_perfect_power(n)
next_perfect_power(n,k)
Returns the next perfect power greater than n
.
say next_perfect_power(1e6) #=> 1002001
When k
is given, it returns the next k-perfect-power greater than n
.
say next_perfect_power(1e6, 3) #=> 1030301
next_pow
n.next_pow(b)
Returns the next perfect power greater than n
, with base b
.
say 63.next_pow(2) #=> 64
say 64.next_pow(2) #=> 128
Equivalent with:
b**(1+ilog(n,b))
Aliases: next_power
next_powerfree
n.next_powerfree(k=2)
Returns the next k-powerfree number greater than n
.
next_powerful
n.next_powerful(k=2)
Returns the next k-powerful (or k-full) number greater than n
.
next_prime
n.next_prime
Returns the next prime larger than n
.
next_prime_power
n.next_prime_power
Given a nonnegative integer n
, returns the next prime power (p^k
with k >= 1) greater than n
.
next_semiprime
n.next_semiprime
Returns the next semiprime greater than n
.
next_squarefree
n.next_squarefree
Returns the next squarefree number greater than n
.
next_squarefree_almost_prime
n.next_squarefree_almost_prime(k=2)
Returns the next squarefree k-almost prime greater than n
.
next_squarefree_semiprime
n.next_squarefree_semiprime
Returns the next squarefree semiprime greater than n
.
next_squarefull
n.next_squarefull
Returns the next squarefull (or 2-full) number greater than n
.
next_twin_prime
n.next_twin_prime
Returns next twin prime number larger than n
.
Provided by Math::Prime::Util::GMP >= 0.52.
ninf
Num.ninf
Returns the negative infinity special value (-Inf
).
nisigma
nisigma(n, k=1)
Returns the sum of the noninfinitary divisors of n
, each divisor raised to the k-th power.
say 30.of { .nisigma } #=> OEIS: A348271
nisigma0
nisigma0(n)
Returns the count of the noninfinitary divisors of n
.
say 30.of { .nisigma0 } #=> OEIS: A348341
nok
nok(n,k)
binomial(n,k)
Returns the binomial coefficient n
over k
, also called the "choose" function.
Equivalent to:
n!
binomial(n, k) = --------
k!(n-k)!
Aliases: binomial
noncubefree
noncubefree(n)
noncubefree(a,b)
Returns an array with the noncubefree numbers <= n
, or in the range a..b
.
noncubefree_count
noncubefree_count(n)
noncubefree_count(a,b)
Returns the count of noncubefree numbers <= n
, or in the range a..b
.
noncubefree_sum
noncubefree_sum(n)
noncubefree_sum(a,b)
Returns the sum of noncubefree numbers <= n
, or in the range a..b
.
nonpowerfree
k.nonpowerfree(n)
k.nonpowerfree(a,b)
Returns an array of numbers <= n
, or in the range a..b
, that are not k-powerfree.
say 2.nonpowerfree(100) # numbers that are not squarefree <= 100
say 3.nonpowerfree(50, 100) # numbers that are not cubefree in range 50..100
nonpowerfree_count
k.nonpowerfree_count(n)
k.nonpowerfree_count(a,b)
Returns the count of numbers <= n
, or in the range a..b
, that are not k-powerfree.
nonpowerfree_sum
k.nonpowerfree_sum(n)
k.nonpowerfree_sum(a,b)
Returns the sum of numbers <= n
, or in the range a..b
, that are not k-powerfree.
nonsquarefree
nonsquarefree(n)
nonsquarefree(a,b)
Returns an array with the nonsquarefree numbers <= n
, or in the range a..b
.
nonsquarefree_count
nonsquarefree_count(n)
nonsquarefree_count(a,b)
Returns the count of nonsquarefree numbers <= n
, or in the range a..b
.
nonsquarefree_sum
nonsquarefree_sum(n)
nonsquarefree_sum(a,b)
Returns the sum of nonsquarefree numbers <= n
, or in the range a..b
.
norm
norm(x)
Returns the normalized value of x
: abs(x)^2
.
next_primes
n.next_primes(start=2)
Returns an array containing n
consecutive primes that are `>= start` (if omitted, then start = 2).
say 10.next_primes #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
say 10.next_primes(1000) #=> [1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061]
The value for start
can be any arbitrarily large integer:
say 10.next_primes(2**128 + 1) # first 10 primes >= 2^128
Aliases: nprimes, n_primes
nth_almost_prime
nth_almost_prime(n, k=2)
Returns the n-th k-almost prime.
say nth_almost_prime(1e7, 2) #=> 56168169
say nth_almost_prime(1e7, 3) #=> 41657362
say nth_almost_prime(1e7, 4) #=> 47997635
nth_cubefree
n.nth_cubefree
Returns the n-th cubefree number.
nth_cubefull
n.nth_cubefull
Returns the n-th cubefull (or 3-full) number.
nth_noncubefree
n.nth_noncubefree
Returns the n-th noncubefree number.
nth_nonpowerfree
n.nth_nonpowerfree(k)
Returns the n-th k-nonpowerfree number.
say nth_nonpowerfree(1e9, 2) #=> 2550546152
say nth_nonpowerfree(1e9, 3) #=> 5949100928
say nth_nonpowerfree(1e9, 4) #=> 13147239114
nth_nonsquarefree
n.nth_nonsquarefree
Returns the n-th nonsquarefree number.
nth_omega_prime
nth_omega_prime(n, k=2)
Returns the n-th k-omega prime.
say nth_omega_prime(1e7, 2) #=> 42314023
say nth_omega_prime(1e7, 3) #=> 28013887
say nth_omega_prime(1e7, 4) #=> 39780102
nth_perfect_power
nth_perfect_power(n)
nth_perfect_power(n,k)
Returns the n-th perfect power.
say nth_perfect_power(1e8) #=> 9956760243243489
say nth_perfect_power(1e9) #=> 997995681331086244
When k
is given, it returns the n-th k-perfect-power.
nth_powerfree
nth_powerfree(n, k=2)
Returns the n-th k-powerfree number.
say nth_powerfree(1e14, 2) #=> 164493406685659
say nth_powerfree(1e14, 3) #=> 120205690315927
say nth_powerfree(1e14, 4) #=> 108232323371116
nth_powerful
nth_powerful(n, k=2)
Returns the n-th k-powerful (or k-full) number.
say nth_powerful(1e4, 2) #=> 23002083
say nth_powerful(1e4, 3) #=> 16720797973
nth_prime_power
nth_prime_power(n)
Returns the n-th prime power p^k
with k >= 1.
say nth_prime_power(1e12) #=> 29996212395727
nth_squarefree
nth_squarefree(n)
Returns the n-th squarefree number. (OEIS: A005117)
say nth_squarefree(1e14) #=> 164493406685659
nth_squarefree_almost_prime
nth_squarefree_almost_prime(n, k=2)
Returns the n-th squarefree k-almost prime.
say nth_squarefree_almost_prime(1e7, 2) #=> 56173891
say nth_squarefree_almost_prime(1e7, 3) #=> 48108421
say nth_squarefree_almost_prime(1e7, 4) #=> 81556446
nth_squarefull
n.nth_squarefull
Returns the n-th squarefull (or 2-full) number.
nu
r.nu
r.numerator
Returns the numerator of rational number r
.
say numerator(43/97) #=> 43
Aliases: numerator
nude
nude(r)
Returns a list with the numerator and the denominator of a rational number r
.
say [nude(43/97)] #=> [43, 97]
num2perm
num2perm(n,k)
Given a nonnegative integer n
and integer k
, return the rank k
lexicographic permutation of n
elements.
k
will be interpreted as mod n!
.
The inverse value for k
is given by Array#perm2num
:
say num2perm(5, 43) #=> [1, 4, 0, 3, 2]
say num2perm(5, 43).perm2num #=> 43
numify
n.numify
Returns a raw native number representation for the self-number.
Can be used for assigning values to Num!PREC
variable.
local Num!PREC = 42.numify # set precision to 42 bits
say sqrt(2) # 1.414213562
Native numbers can also be used when indexing an array:
var arr = [42, 43, 44]
var idx = 2.numify
say arr[idx] #=> 44
Although this may or may not be actually faster.
nuphi
nuphi(n)
The nonunitary totient function. (OEIS: A254503)
nusigma
nusigma(n, k=1)
Returns the sum of the nonunitary divisors of n
, each divisor raised to the k-th power.
say 30.of { .nusigma } #=> OEIS: A048146
nusigma0
nusigma0(n)
Returns the count of the nonunitary divisors of n
.
say 30.of { .nusigma0 } #=> OEIS: A048105
of
n.of {|k| ... }
Returns an array with n
elements mapped to the given block. The block is called with k = 0,1,2...,n-1
.
say 10.of { _*_ } #=> first 10 squares
say 10.of { .fib } #=> first 10 Fibonacci numbers
omega_prime_divisors
n.omega_prime_divisors
n.omega_prime_divisors(k)
Returns the k-omega prime divisors of n
.
say 5040.omega_prime_divisors(4) #=> [210, 420, 630, 840, 1260, 1680, 2520, 5040]
When k
is omitted, an array of arrays with the k-omega prime divisors of n
, for each k
in the range 0..omega(n)
, is returned:
say 120.omega_prime_divisors #=> [[1], [2, 3, 4, 5, 8], [6, 10, 12, 15, 20, 24, 40], [30, 60, 120]]
omega_prime_count
k.omega_prime_count(n)
k.omega_prime_count(a,b)
Returns the count of k-omega primes <= n
, or in the range a..b
.
say 1.omega_prime_count(100) # number prime powers <= 100
say 2.omega_prime_count(50, 100) # number of 2-omega primes in range 50..100
Aliases: omega_primepi
omega_primes
k.omega_primes(n)
k.omega_primes(a,b)
Returns an array with k-omega primes <= n
, or in the range a..b
.
k-omega primes are numbers n
that satisfy omega(n) == k
.
say 1.omega_primes(100) # prime powers <= 100
say 2.omega_primes(50, 100) # 2-omega primes in range 50..100
omega_prime_sum
k.omega_prime_sum(n)
k.omega_prime_sum(a,b)
Returns the sum of k-omega primes <= n
, or in the range a..b
.
say 1.omega_prime_sum(100) # sum of prime powers <= 100
say 2.omega_prime_sum(50, 100) # sum of 2-omega primes in range 50..100
one
Num.one
Returns the 1 value.
partition_count
partition_count(n)
Returns the number of partitions of n
.
Aliases: partition_number
parts
x.parts
Returns an array with the real and imaginary parts of x
.
say parts(5) #=> [5, 0]
say parts(3+4i) #=> [3, 4]
rho_brent_factor
n.rho_brent_factor
n.rho_brent_factor(tries)
Pollard-Brent rho factorization method.
The product of the factors will give back n
. However, some factors may be composite.
pell_factor
n.pell_factor(tries=1e4)
Pell factorization method, trying to find a factor of n
.
This method is particularly effective for numbers that have factors close to sqrt(n)
.
say pell_factor(10**120 - 10**40)
The product of the factors will give back n
. However, some factors may be composite.
perfect_power
n.perfect_power
Returns the largest power k
of n
for which there exists an integer r
, such that: n = r^k
.
say perfect_power(15**5) #=> 5
perfect_power_count
perfect_power_count(n)
perfect_power_count(n,k)
Returns the count of perfect powers <= n
.
say perfect_power_count(10**6) #=> 1111
say perfect_power_count(10**20) #=> 10004650118
When k
is provided, it returns the number of k-powers <= n
.
perfect_power_sum
perfect_power_sum(n)
perfect_power_sum(n,k)
Returns the sum of perfect powers <= n
.
say perfect_power_sum(10**6) #=> 361590619
say perfect_power_sum(10**20) #=> 333449517656248628022493884999
When k
is provided, it returns the sum of k-powers <= n
.
perfect_root
n.perfect_root
Returns the smallest root r
of n
for which there exists an integer k
, such that: n = r^k
.
say perfect_root(15**5) #=> 15
permutations
n.permutations
Returns an array of arrays with the permutations of the integers in the range 0..n-1
, or iterates over the permutations when a block is given.
5.permutations {|*a| say a }
phi_finder_factor
n.phi_finder_factor(tries=1e4)
Tries to find a factor of n
, using the Phi-finder factorization method due to Kyle Kloster (2010).
This method is particularly effective for semiprimes n = p*q
such that p
and q
are relatively close to each other.
Example:
say phi_finder_factor(622882096110539) #=> [23099599, 26965061]
say phi_finder_factor(132750061135361, 1e5) #=> [9369673, 14168057]
The product of the factors will give back n
. However, some factors may be composite.
almost_prime_count
k.almost_prime_count(n)
k.almost_prime_count(a,b)
Returns the count of k-almost primes <= n
, or in the range a..b
.
say 1.almost_prime_count(100) # count of primes <= 100
say 2.almost_prime_count(50, 100) # count of semiprimes in range 50..100
Aliases: almost_primepi, pi_k
pisano_period
pisano_period(n)
Returns the n-th Pisano number: period of Fibonacci numbers mod n
.
say pisano_period(10!) #=> 86400
say pisano_period(2**128 + 1) #=> 28356863910078205764000346543980814080
pm1_factor
n.pm1_factor
n.pm1_factor(B)
Pollard p-1 factorization method.
The product of the factors will give back n
. However, some factors may be composite.
Aliases: pminus1_factor
pn_primes
pn_primes(n)
pn_primes(a,b)
Returns the first n
prime numbers, or the primes in the range prime(a)..prime(b)
.
say pn_primes(25) # the first 25 primes
say pn_primes(100, 110) # the primes from 100-th prime to 110-th prime (inclusive)
pn_primorial
pn_primorial(n)
Returns the product of the first n
primes.
polygonal
polygonal(n,k)
Returns the n-th k-gonal number. When n
is negative, it returns the second k-gonal number.
say 10.of {|n| polygonal( n, 3) } # triangular numbers
say 10.of {|n| polygonal( n, 5) } # pentagonal numbers
say 10.of {|n| polygonal(-n, 5) } # second pentagonal numbers
polygonal_root
polygonal_root(n,k)
Returns the k-gonal root of n
. Also defined for complex numbers.
say polygonal_root(n, 3) # triangular root
say polygonal_root(n, 5) # pentagonal root
polygonal_root2
polygonal_root2(n,k)
Returns the second k-gonal root of n
. Also defined for complex numbers.
say polygonal_root2(n, 5) # second pentagonal root
polymod
n.polymod(...)
Returns a list of mod results corresponding to the divisors in given list.
say [120.polymod(10)] # (0, 12)
say [120.polymod(10,10)] # [0, 2, 1]
Particularly useful for:
var (sec, min, hours, days) = seconds.polymod(60, 60, 24)
popcount
n.popcount
Number of 1's in binary representation of n
.
This value is also known as the Hamming weight value.
Aliases: hammingweight
power_count
k.power_count(n)
k.power_count(a,b)
Returns the number of k-th power positive integers in <= n
, or in the range a..b
.
power_divisors
k.power_divisors(n)
Return an array with the k-th power divisors of n
.
say 3.power_divisors(10!) #=> [1, 8, 27, 64, 216, 1728]
say 4.power_divisors(10!) #=> [1, 16, 81, 256, 1296, 20736]
Equivalent with:
n.divisors.grep { .is_power(k) }
powerfree
k.powerfree(n)
k.powerfree(a, b)
Returns an array with the k-powerfree <= n
, or in the range a..b
.
say 2.powerfree(50) # squarefree numbers <= 50
say 3.powerfree(50, 100) # cubefree numbers in the range 50..100
powerfree_count
k.powerfree_count(n)
k.powerfree_count(a,b)
It efficiently counts the number of k-powerfree numbers <= n
, or in the range a..b
:
say 3.powerfree_count(100) #=> count of cubefree numbers <= 100
say 3.powerfree_count(50, 100) #=> count of cubefree numbers in the range 50..100
powerfree_divisors
k.powerfree_divisors(n)
Returns an array with the k-powerfree divisors of n
.
say 2.powerfree_divisors(5040) # squarefree divisors of 5040
say 3.powerfree_divisors(5040) # cubefree divisors of 5040
powerfree_part
k.powerfree_part(n)
Returns the k-powerfree part of n
.
say 30.of { 2.powerfree_part(_) } # squarefree part (OEIS: A007913)
say 30.of { 3.powerfree_part(_) } # cubefree part (OEIS: A050985)
powerfree_part_sum
k.powerfree_part_sum(n)
k.powerfree_part_sum(a,b)
Returns the sum of the k-powerfree parts of integers <= n
or in the range a..b
:
say 2.powerfree_part_sum(100) # sum of squarefree part of n for n <= 100
say 3.powerfree_part_sum(50, 100) # sum of cubefree part of n for n in the range 50..100
powerfree_sigma
k.powerfree_sigma(n, j=1)
Returns the sum of the k-powerfree divisors of n
, each divisor raised to the power j
.
say 30.of { 2.powerfree_sigma(_) } # OEIS: A048250
say 30.of { 3.powerfree_sigma(_) } # OEIS: A073185
Equivalent with (but much faster):
n.divisors.grep { .is_powerfree(k) }.sum {|d| d**j }
powerfree_sigma0
k.powerfree_sigma0(n)
Returns the number of the k-powerfree divisors of n
.
say 30.of { 3.powerfree_sigma0(_) } # OEIS: A073184
powerfree_sum
k.powerfree_sum(n)
k.powerfree_sum(a,b)
Returns the sum of k-powerfree numbers <= n
or in the range a..b
:
say 2.powerfree_sum(100) # sum of squarefree numbers <= 100
say 3.powerfree_sum(50, 100) # sum of cubefree numbers in the range 50..100
powerfree_udivisors
k.powerfree_udivisors(n)
Returns an array with the k-powerfree unitary divisors of n
.
say 2.powerfree_udivisors(5040) # squarefree unitary divisors of 5040
say 3.powerfree_udivisors(5040) # cubefree unitary divisors of 5040
Equivalent with (but much faster):
n.udivisors.grep { .is_powerfree(k) }
k.powerfree_divisors(n).grep {|d| gcd(n/d, d) == 1 }
powerfree_usigma
k.powerfree_usigma(n, j=1)
Returns the sum of the k-powerfree unitary divisors of n
, each divisor raised to the power j
.
say 20.of { 2.powerfree_usigma(_) } # OEIS: A092261
say 20.of { 2.powerfree_usigma(_, 2) } # OEIS: A091306
Equivalent with (but much faster):
n.udivisors.grep { .is_powerfree(k) }.sum {|d| d**j }
powerfree_usigma0
k.powerfree_usigma0(n)
Returns the number of the k-powerfree unitary divisors of n
.
say 20.of { 2.powerfree_usigma0(_) } # OEIS: A056671
powerful
k.powerful(n)
k.powerful(a,b)
Returns an array with the k-powerful (or k-full) numbers <= n
, or in the range a..b
.
say 2.powerful(100) #=> 2-powerful numbers <= 100
say 2.powerful(50, 100) #=> 2-powerful numbers in the range 50..100
powerful_count
k.powerful_count(n)
k.powerful_count(a,b)
Returns the number of k-powerful (or k-full) numbers <= n
, or in the range a..b
.
say 2.powerful_count(100) #=> count of 2-powerful numbers <= 100
say 2.powerful_count(50, 100) #=> count of 2-powerful numbers in the range 50..100
powerful_sum
k.powerful_sum(n)
k.powerful_sum(a,b)
Returns the sum of k-powerful (or k-full) numbers <= n
, or in the range a..b
.
say 2.powerful_sum(100) #=> sum of 2-powerful numbers <= 100
say 2.powerful_sum(50, 100) #=> sum of 2-powerful numbers in the range 50..100
power_sigma
k.power_sigma(n, j=1)
Returns the sum of the k-th power divisors of n
, each divisor raised to the power j
.
say 30.of { 2.power_sigma(_) } # OEIS: A035316
say 30.of { 3.power_sigma(_) } # OEIS: A113061
Equivalent with (but much faster):
n.divisors.grep { .is_power(k) }.sum {|d| d**j }
power_sigma0
k.power_sigma0(n)
Returns the number of the k-th power divisors of n
.
say 30.of { 2.power_sigma0(_) } # OEIS: A046951
power_sum
k.power_sum(n)
k.power_sum(a,b)
Returns the sum of k-th power positive integers <= n
, or in the range a..b
.
power_udivisors
k.power_udivisors(n)
Returns an array with the k-th power unitary divisors of n
.
say 2.power_udivisors(15!) #=> [1, 49, 729, 35721]
say 3.power_udivisors(15!) #=> [1, 125, 729, 91125]
Equivalent with:
n.udivisors.grep { .is_power(k) }
Aliases: power_unitary_divisors, unitary_power_divisors
power_usigma
k.power_usigma(n, j=1)
Returns the sum of the k-th power unitary divisors of n
, each divisor raised to the power j
.
Equivalent with (but much faster):
n.udivisors.grep { .is_power(k) }.sum {|d| d**j }
power_usigma0
k.power_usigma0(n)
Returns the number of the k-th power unitary divisors of n
.
say 30.of { 2.power_usigma0(_) } # OEIS: A056624
pp1_factor
n.pp1_factor(B)
Williams' p+1 factorization method.
The product of the factors will give back n
. However, some factors may be composite.
Aliases: pplus1_factor
pp_divisors
pp_divisors(n)
Returns an array with the perfect power divisors of n
.
say 5040.pp_divisors #=> [1, 4, 8, 9, 16, 36, 144]
Equivalent with:
n.divisors.grep { .is_perfect_power }
Aliases: perfect_power_divisors
pp_udivisors
pp_udivisors(n)
Returns an array with the perfect power unitary divisors of n
, such that each divisor d
is a perfect power and gcd(n/d, d) = 1
.
say 15!.pp_udivisors #=> [1, 49, 125, 729, 2048, 35721, 91125]
Equivalent with:
n.udivisors.grep { .is_perfect_power }
Aliases: perfect_power_udivisors, perfect_power_unitary_divisors
prev_almost_prime
n.prev_almost_prime(k=2)
Returns the previous k-almost prime smaller than n
.
prev_composite
prev_composite(n)
Returns the previous composite number smaller than n
.
prev_composites
n.prev_composites(start)
Returns an array with n
consecutive decreasing composite numbers starting from start
.
say 5.prev_composites(10) #=> [10, 9, 8, 6, 4]
say 5.prev_composites(97) #=> [96, 95, 94, 93, 92]
prev_cubefree
n.prev_cubefree
Returns the previous cubefree number smaller than n
.
prev_cubefull
n.prev_cubefull
Returns the previous cubefull or (3-full) number smaller than n
.
prev_noncubefree
n.prev_noncubefree
Returns the previous noncubefree number smaller than n
.
prev_nonpowerfree
n.prev_nonpowerfree(k)
Returns the previous k-nonpowerfree number smaller than n
.
prev_nonsquarefree
n.prev_nonsquarefree
Returns the previous nonsquarefree number smaller than n
.
prev_omega_prime
n.prev_omega_prime(k=2)
Returns the previous k-omega prime smaller than n
.
prev_perfect_power
prev_perfect_power(n)
prev_perfect_power(n,k)
Returns the previous perfect power smaller than n
.
say prev_perfect_power(1e6) #=> 998001
When k
is given, it returns the previous k-perfect-power smaller than n
.
say prev_perfect_power(1e6,3) #=> 970299
prev_pow
n.prev_pow(b)
Returns the previous perfect power smaller than n
, with base b
. Returns NaN when n
is <= 1.
say 65.prev_pow(2) #=> 64
say 64.prev_pow(2) #=> 32
Aliases: prev_power
prev_powerfree
n.prev_powerfree(k=2)
Returns the previous k-powerfree number smaller than n
.
prev_powerful
n.prev_powerful(k=2)
Returns the previous k-powerful (or k-full) number smaller than n
.
prev_prime
n.prev_prime
Returns the previous prime smaller than n
.
prev_prime_power
n.prev_prime_power
Returns the previous prime power smaller than n
.
prev_primes
n.prev_primes(start)
Returns an array with n
consecutive decreasing prime numbers starting from start
.
say 5.prev_primes(100) #=> [97, 89, 83, 79, 73]
prev_semiprime
n.prev_semiprime
Returns the previous semiprime smaller than n
.
prev_squarefree
n.prev_squarefree
Returns the previous squarefree number smaller than n
.
prev_squarefree_almost_prime
n.prev_squarefree_almost_prime(k=2)
Returns the previous squarefree k-almost prime smaller than n
.
prev_squarefree_semiprime
n.prev_squarefree_semiprime
Returns the previous squarefree semiprime smaller than n
.
prev_squarefull
n.prev_squarefull
Returns the previous squarefull (or 2-full) number smaller than n
.
primality_pretest
n.primality_pretest
The method returns true when n
passes the internal primality pretest (when n
is large enough and it has no small factors).
prime
prime(n)
Returns the n-th prime number.
say prime(100) # 100th prime: 541
say prime(1000) # 1000th prime: 7919
Aliases: nth_prime
prime_divisors
prime_divisors(n)
Returns the unique prime factors of n
.
prime_lower
n.prime_lower
Lower bound for the n-th prime.
Aliases: nth_prime_lower
primepi
pi(n)
primepi(n)
primepi(a,b)
Returns the count of primes <= n
, or in the range a..b
.
Aliases: prime_count, count_primes
primepi_lower
n.primepi_lower
Lower bound for prime_count(n)
.
Aliases: prime_count_lower
primepi_upper
n.primepi_upper
Upper bound for prime_count(n)
.
Aliases: prime_count_upper
prime_power
n.prime_power
Returns the exponent k
if n
is a power of the form n = p^k
for some prime p
. Returns 1 otherwise.
say prime_power(15) #=> 1
say prime_power(43**5) #=> 5
prime_power_count
prime_power_count(n)
prime_power_count(a,b)
Returns the count of prime powers <= n
, or in the range a..b
.
say prime_power_count(1e15) # number of prime powers <= 10^15
say prime_power_count(1e6, 1e8) # number of prime powers in [10^6, 10^8]
prime_power_count_lower
prime_power_count_lower(n)
Lower bound for prime_power_count(n)
.
prime_power_count_upper
prime_power_count_upper(n)
Upper bound for prime_power_count(n)
.
prime_power_divisors
n.prime_power_divisors
Returns the prime power divisors of n
.
say prime_power_divisors(5040) #=> [2, 3, 4, 5, 7, 8, 9, 16]
Equivalent with:
n.divisors.grep{.is_prime_power}
prime_power_lower
prime_power_lower(n)
Lower bound for the n-th prime power.
Aliases: nth_prime_power_lower
prime_powers
prime_powers(n)
prime_powers(a,b)
Returns an array with the prime powers <= n
, or in the range a..b
.
say prime_powers(100) # prime powers <= 100
say prime_powers(50, 100) # prime powers in the range [50, 100]
prime_power_sigma
n.prime_power_sigma(k=1)
Sum of the prime power divisors of n
, each divisor raised to the k-th power.
say prime_power_sigma(10!) #=> 667
say prime_power_sigma(10!, 2) #=> 95459
Equivalent with:
n.prime_power_divisors.sum {|d| d**k }
prime_power_sigma0
prime_power_sigma0(n)
Returns the count of prime power divisors of n
.
Equivalent with:
bigomega(n)
prime_power_sum
prime_power_sum(n)
prime_power_sum(a,b)
Returns the sum of prime powers <= n
, or in the range a..b
.
Aliases: prime_powers_sum
prime_power_udivisors
prime_power_udivisors(n)
Returns the unitary prime power divisors of n
.
say prime_power_udivisors(10!) #=> [7, 25, 81, 256]
The product of the unitary prime power divisors of a number, is the number itself.
This method is equivalent with:
n.factor_map {|p,k| p**k }.sort
Aliases: prime_power_unitary_divisors, unitary_prime_power_divisors
prime_power_upper
prime_power_upper(n)
Upper bound for the n-th prime power.
Aliases: nth_prime_power_upper
prime_power_usigma
Number.prime_power_usigma(k=1)
Returns the sum of the unitary prime power divisors of n
, each divisor raised to power k
.
say prime_power_usigma(10!) #=> 369 (== 7 + 25 + 81 + 256)
say prime_power_usigma(10!, 2) #=> 72771 (== 7^2 + 25^2 + 81^2 + 256^2)
Equivalent with:
n.factor_map {|p,e| p**(e * k) }.sum
prime_power_usigma0
prime_power_usigma0(n)
Returns the count of unitary prime power divisors of n
.
Equivalent with:
omega(n)
prime_root
n.prime_root
Returns the prime p
if n
can be expressed as n = p^k
for some prime number p
and an integer k
. Returns n
otherwise.
say prime_root(15) #=> 15
say prime_root(43**5) #=> 43
primes
primes(n)
primes(a,b)
Returns an array with the prime numbers <= n
, or in the range a..b
.
prime_sigma
n.prime_sigma(k=1)
Sum of the unique prime divisors of n
, each divisor raised to the k-th power.
say prime_sigma(100!) #=> 1060
say prime_sigma(100!, 2) #=> 65796
prime_sigma0
prime_sigma0(n)
Returns the count of prime divisors of n
.
Equivalent with:
omega(n)
prime_sum
prime_sum(n)
prime_sum(a,b,k=1)
Sum of the prime numbers <= n
, or in the range a..b
, each prime raised to the k-th power.
Aliases: primes_sum, sum_primes
prime_udivisors
n.prime_udivisors
Returns the unique unitary prime factors of n
.
Aliases: prime_unitary_divisors, unitary_prime_divisors
prime_upper
n.prime_upper
Upper bound for the n-th prime.
Aliases: nth_prime_upper
prime_usigma
n.prime_usigma(k=1)
Sum of the unique unitary prime divisors of n
, each divisor raised to the k-th power.
say prime_usigma(100!) #=> 732
say prime_usigma(100!, 2) #=> 55330
prime_usigma0
prime_usigma0(n)
The number of unique unitary prime divisors of n
.
primitive_part
n.primitive_part(f)
Returns the primitive part of f(n)
, for n
> 0
, such that:
a(n) = primitive part of f(n)
f(n) = Product_{d|n} a(d)
Example:
func f(n) { n.fib }
func a(n) { n.primitive_part(f) }
say 20.of { a(_) }
say 20.of { f(_) }
say 20.of { .divisors.prod {|d| a(d) } }
primorial
x.primorial
Returns the
primorial_deflation
n.primorial_deflation
Primorial deflation of n
, satisfying:
primorial_inflation(primorial_deflation(n)) = n
Defined as:
primorial_deflation(n) = A319626(n)/A319627(n)
primorial_inflation
n.primorial_inflation
Primorial inflation of n
.
Defined as:
primorial_inflation(n) = n.factor.prod {|p| primorial(p) }
primorial_inflation(n) = A108951(n)
The method also accepts n
to be a fraction, which is computed as:
primorial_inflation(a/b) = primorial_inflation(a)/primorial_inflation(b)
proper_divisors
n.proper_divisors
Return an array with the divisors of n
less than n
.
say proper_divisors(6) #=> [1, 2, 3]
proper_sigma0
n.proper_sigma0
Returns the number of proper divisors of n
.
say proper_sigma0(6) #=> 3
Aliases: proper_divisor_count
psi
n.psi(k=1)
dedekind_psi(n,k=1)
Dedekind psi function.
say 10.of { .dedekind_psi } #=> [0, 1, 3, 4, 6, 6, 12, 8, 12, 12]
say 10.of { .dedekind_psi(2) } #=> [0, 1, 5, 10, 20, 26, 50, 50, 80, 90]
Aliases: dedekind_psi
pyramidal
n.pyramidal(k)
Returns the n-th k-gonal pyramidal number.
say 15.of {|n| pyramidal(n, 3) } # tetrahedral numbers
say 15.of {|n| pyramidal(n, 5) } # pentagonal pyramidal numbers
pyramidal_root
n.pyramidal_root(k)
Returns the k-gonal pyramidal root of n
. Also defined for complex numbers.
say pyramidal_root(pyramidal(1234, 3), 3) #=> 1234
qnr
qnr(n)
Returns the least quadratic nonresidue of n
.
say qnr(17676352761153241) #=> 37
say qnr(172138573277896681) #=> 41
Aliases: quadratic_nonresidue
qs_factor
qs_factor(n)
Pomerance's Quadratic Sieve factorization method (SIMPQS).
The product of the factors will give back n
. However, some factors may be composite.
quadratic_congruence
quadratic_congruence(a,b,c,m)
Returns an array with all the positive solutions for x
to the following quadratic congruence:
a*x^2 + b*x + c == 0 (mod m)
where a,b,c
are rational values and m
is a positive integer.
Example:
say quadratic_congruence(3,4,5,124) #=> [47, 55, 109, 117]
Aliases: modular_quadratic_formula
quadratic_formula
quadratic_formula(a,b,c)
Returns a list of solutions (x_1, x_2)
to the quadratic equation: a*x^2 + b*x + c = 0
, defined as:
(-b ± sqrt(b^2 - 4ac)) / (2a)
Example:
say [quadratic_formula(13, -42, -34)] #=> [3.9011...., -0.6704...]
quadratic_formulaQ
quadratic_formulaQ(a,b,c)
Returns a list of Quadratic objects, which are solutions (x_1, x_2)
to the quadratic equation: a*x^2 + b*x + c = 0
.
say [quadratic_formulaQ(3,4,5)]
Outputs:
[Quadratic(-2/3, 1/6, -44), Quadratic(-2/3, -1/6, -44)]
rad
rad(n)
Returns the radical of n
, which is the largest squarefree divisor of n
.
say rad(2**5 * 3**9) #=> 6
Equivalent to:
n.factor.uniq.prod
rad2deg
rad2deg(x)
Convert radians to degrees.
say rad2deg(Num.pi) #=> 180
ramanujan_sum
ramanujan_sum(n,q)
The Ramanujan sum function, defined as:
c_q(n) = μ(q/gcd(n,q)) * φ(q) / φ(q/gcd(n,q))
Example:
say 20.of {|q| ramanujan_sum(2, q) } #=> OEIS: A086831
ramanujan_tau
ramanujan_tau(n)
Ramanujan's tau function.
rand
rand(n)
rand(a,b)
Returns a pseudorandom floating-point in the interval [0,n)
, or in the interval [a,b)
.
random_bytes
n.random_bytes
Returns an array with n
random values between 0 and 255.
random_maurer_nbit_prime
random_maurer_nbit_prime(n)
Generate a random n-bit Marurer prime.
Aliases: random_nbit_maurer_prime
random_nbit_prime
random_nbit_prime(n)
Returns a random n-bit prime.
say random_nbit_prime(100) # 100-bit random prime
random_nbit_safe_prime
random_nbit_safe_prime(n)
Returns a random n-bit safe-prime.
say random_nbit_safe_prime(512) #=> 512-bit safe prime
Provided by Math::Prime::Util::GMP >= 0.52.
random_nbit_strong_prime
random_nbit_strong_prime(n)
Generate a random n-bit strong prime number.
Aliases: random_strong_nbit_prime
random_ndigit_prime
random_ndigit_prime(n)
Returns a random n-digit prime.
say random_ndigit_prime(100) # 100-digit random prime
random_prime
random_prime(n)
random_prime(a,b)
Returns a random prime <= n
, or in the range a..b
.
say random_prime(100) # random prime in range [2, 100]
say random_prime(100, 1000) # random prime in range [100, 1000]
random_string
n.random_string
Returns a string with n
random characters (bytes).
range
range(n)
range(a,b)
range(a,b,step)
Creates a new RangeNumber object.
say range(10) #=> RangeNum(0, 9, 1)
say range(1, 10) #=> RangeNum(1, 10, 1)
say range(1, 10, 2) #=> RangeNum(1, 10, 2)
rat
x.rat
Convert x
to a rational number. Returns NaN
when this conversion is not possible.
Aliases: to_r, to_rat
rat_approx
x.rat_approx
Given a real number x
, it returns a very good (sometimes exact) rational approximation to n
, computed with continued fractions.
say rat_approx(3.14).as_frac #=> 22/7
say rat_approx(zeta(-5)).as_frac #=> -1/252
Returns NaN
when x
is not a real number.
idiv_round
idiv_round(a,b)
Integer division of integers a
and b
, rounded towards nearest integer.
When a
and b
are integers, this is equivalent with:
floor(a/b + 1/2)
Aliases: rdd
re
re(z)
Returns the real part of a complex number z
.
Aliases: real
reals
reals(z)
Returns a list with the real and imaginary parts of z
.
remdiv
n.remdiv(k)
Removes all occurrences of the divisor k
from integer n
.
Equivalent with:
n / k**valuation(n,k)
Aliases: remove
rho_factor
n.rho_factor
n.rho_factor(tries)
Pollard rho factorization method.
The product of the factors will give back n
. However, some factors may be composite.
rising_factorial
rising_factorial(n,k)
Rising factorial: n^(k) = n * (n + 1) * ... * (n + k - 1)
, defined as:
binomial(n + k - 1, k) * k!
For negative values of k
, rising factorial is defined as:
rising_factorial(n, -k) = 1/rising_factorial(n - k, k)
root
root(n,k)
The k-th root of n
, defined as:
n**(1/k)
roots_of_unity
roots_of_unity(n)
Returns an array with the complex n-th roots of 1.
rotate
rotate(n, k, b=10)
Rotate the digits of n
to the left when k
is positive or to the right otherwise, in a given base b
, or base 10 when no base is given.
say rotate(12345, 2) #=> 34512
say rotate(12345, -1) #=> 51234
rough_count
k.rough_count(n)
k.rough_count(a,b)
Returns the count of k-rough numbers <= n
, or in the range a..b
.
say 97.rough_count(1e6) #=> 122005
say 23.rough_count(1e9) #=> 171024023
Also works with arbitrarily large n:
say 43.rough_count(1e34) #=> 1450936704022016442012254601096989
rough_divisors
k.rough_divisors(n)
Returns an array with the divisors of n
that are k-rough.
Equivalent with (but more efficient):
n.divisors.grep { .is_rough(k) }
rough_part
k.rough_part(n)
It returns the k-rough part of n
that contains all the prime factors p|n
such that p
>= k
.
say 15.of {|n| 3.rough_part(n!) } #=> OEIS: A049606
round
round(x,k=0)
Rounds x
to the k-th decimal place.
A negative argument rounds that many digits after the decimal point, while a positive argument rounds that many digits before the decimal point.
say round(1234.567) #=> 1235
say round(1234.567, 2) #=> 1200
say round(3.123+4.567i, -2) #=> 3.12+4.57*i
Aliases: roundf
run
run(a,b)
Given two arguments, it returns the second one.
sec
sec(x)
Trigonometric secant function.
secant_number
secant_number(n)
Return the n-th secant/zig number. (OEIS: A000364)
sech
sech(x)
Hyperbolic secant function.
seed
seed(n)
Re-seed the rand()
function. The value for n
can be any arbitrary large integer.
semiprime
semiprime(n)
Returns the n-th semiprime number.
say 10.of {|k| semiprime(10**k) } #=> OEIS: A114125
Aliases: nth_semiprime
semiprime_count
semiprime_count(n)
semiprime_count(a,b)
Counts the number of semiprimes <= n
(OEIS: A072000), or in the range a..b
.
say 20.of {|k| semiprime_count(2**k) }
semiprimes
semiprimes(n)
semiprimes(a,b)
Returns an array with the semiprimes <= n
, or in the range a..b
.
say semiprimes(100) # semiprimes <= 100
say semiprimes(50, 100) # semiprimes in the range [50, 100]
semiprime_sum
semiprime_sum(n)
semiprime_sum(a,b)
Returns the sum of semiprimes <= n
, or in the range a..b
.
Aliases: semiprimes_sum
setbit
setbit(n,k)
Set the k-th bit of integer n
to 1.
say setbit(0b1000, 0).as_bin #=> 1001
say setbit(0b1000, 2).as_bin #=> 1100
sgn
sgn(x)
Returns the sign of x.
Defined as:
x / abs(x)
Aliases: sign
sin
sin(x)
Trigonometric sine function.
sin_cos
sin_cos(x)
Returns a list with the values (sin(x), cos(x))
.
sinh
sinh(x)
Hyperbolic sine function.
smod
x.smod(m)
Returns the residual mod m
such that it is within half of the modulus.
say smod(1, 6) #=> 1
say smod(4, 6) #=> -2
smooth_count
k.smooth_count(n)
k.smooth_count(a,b)
Returns the count of k-smooth numbers <= n
, or in the range a..b
.
say 30.of {|n| 13.smooth_count(10**n) } #=> OEIS: A106629
smooth_divisors
k.smooth_divisors(n)
Returns an array with the divisors of n
that are k-smooth.
Equivalent with (but more efficient):
n.divisors.grep { .is_smooth(k) }
smooth_numbers
smooth_numbers(limit, [p1,p2,...])
smooth_numbers(limit, [p1,p2,...], {|n,p| ... })
Returns an array containing all the smooth numbers that factorize over the given array of primes.
say smooth_numbers(100, [2,3,5]) # 5-smooth numbers <= 100
An optional block can be provided, which is called with two arguments, n
and p
, where p
is the current prime and n
is a smooth number that is a multiple of p
. If the block returns true, then the number n
will be included in the returned array.
# 5-smooth numbers <= 100 that are squarefree
say smooth_numbers(100, [2,3,5], {|n,p| n.valuation(p) < 2 })
# 5-smooth numbers <= 100 that are cubefree
say smooth_numbers(100, [2,3,5], {|n,p| n.valuation(p) < 3 })
smooth_part
k.smooth_part(n)
It efficiently returns the largest divisor of n
that is k-smooth.
say 20.of {|n| 3.smooth_part(n!) } #=> OEIS: A118381
solve_lcg
solve_lcg(n, r, m)
Return the smallest solution for x
to the following linear congruence:
n*x == r (mod m)
Example:
say solve_lcg(143, 44, 231) #=> 10
Return NaN
when no solution exists (i.e.: when r
is not divisible by gcd(n, m)
).
Aliases: solve_linear_congruence
solve_pell
solve_pell(d, k=1)
Find the smallest pair of integers (x,y)
that satisfy the Pell equation: x^2 - d*y^2 = k
.
say [solve_pell(863)] #=> [18524026608, 630565199]
say [solve_pell(953, -1)] #=> [2746864744, 88979677]
Return (nil,nil)
when a solution does not exist.
solve_quadratic_form
solve_quadratic_form(d, n)
Given a positive integer n
and a positive integer d
, returns an array with [x,y]
solutions to the equation:
x^2 + d*y^2 = n
Example:
say solve_quadratic_form(13, 97) #=> []
say solve_quadratic_form(18, 43*97) #=> [[61, 5], [11, 15]]
Not all solutions may be returned. Returns an empty array if there are no solutions.
sopf
sopf(n)
Sum of the distinct primes dividing n
.
say 30.of { .sopf } #=> OEIS: A008472
sopfr
sopfr(n)
Sum of the primes dividing n
(with repetition).
say 30.of { .sopfr } #=> OEIS: A001414
special_factor
n.special_factor(tries=1)
Tries to find special factors of n
, using various special-factorization methods, including trial division, p-1 method, p+1 method, HOLF method, Fermat method, Pell method, Miller-Rabin method and the Lucas-Miller method.
An additional optional argument can be given to increase the number of tries by the given factor. For example, tries = 2
will double the number of tries.
The method returns an array with the factors of n
:
say special_factor((3**120 + 1) * (5**240 - 1))
The product of the factors will give back n
. However, some factors may be composite.
Aliases: special_factors
sqr
sqr(x)
Returns the square of x
. Equivalent with x*x
.
Aliases: square
sqrt
sqrt(x)
Returns the square root of x
. Equivalent with x**(1/2)
.
sqrt_cfrac
n.sqrt_cfrac
n.sqrt_cfrac(k)
Returns the expansion of the continued fraction for square root of n
.
When an additional argument k
is specified, it includes only the first k
terms from the expansion period.
say 28.sqrt_cfrac #=> [5, 3, 2, 3, 10]
say 28.sqrt_cfrac(2) #=> [5, 3, 2]
say 12345678910.sqrt_cfrac(10) #=> [111111, 9, 26, 1, 2, 3, 1, 1, 2, 8, 1]
sqrt_cfrac_period
n.sqrt_cfrac_period
Returns the period of the expansion of the continued fraction for square root of n
.
say 28.sqrt_cfrac_period #=> [3, 2, 3, 10]
sqrt_cfrac_period_each
n.sqrt_cfrac_period_each { ... }
n.sqrt_cfrac_period_each({ ... }, max_iter)
Iterate over the period of the expansion of the continued fraction for square root of n
.
28.sqrt_cfrac_period_each {|r| say r }
sqrt_cfrac_period_len
n.sqrt_cfrac_period_len
Returns the length of the period of continued fraction for square root of n
. (OEIS: A003285)
sqrtmod
sqrtmod(a,m)
Modular square root of a
, returning a solution r
, such that r^2 = a (mod m)
.
say sqrtmod(544, 800) #=> 512
say sqrtmod(436, 1752) #=> 1010
sqrtQ
sqrtQ(n)
Returns a Quadratic object, representing sqrt(n)
.
square_divisors
square_divisors(n)
Returns the square divisors of n
.
say 5040.square_divisors #=> [1, 4, 9, 16, 36, 144]
Equivalent with:
n.divisors.grep { .is_square }
squarefree
squarefree(n)
squarefree(a,b)
Returns an array with the squarefree numbers <= n
, or in the range a..b
.
# Squarefree numbers in the interval [100, 200]
say squarefree(100, 200)
# Squarefree numbers <= 100
say squarefree(100)
squarefree_almost_primes
k.squarefree_almost_primes(n)
k.squarefree_almost_primes(a,b)
Returns an array with the squarefree k-almost primes <= n
, or in the range a..b
.
say 2.squarefree_almost_primes(100) #=> squarefree semiprimes <= 100
say 2.squarefree_almost_primes(50, 100) #=> squarefree semiprimes in the range 50..100
say 3.squarefree_almost_primes(100) #=> squarefree 3-almost primes <= 100
say 3.squarefree_almost_primes(50, 100) #=> squarefree 3-almost primes in the range 50..100
squarefree_almost_prime_sum
k.squarefree_almost_prime_sum(n)
k.squarefree_almost_prime_sum(a,b)
Returns the sum of squarefree k-almost primes <= n
, or in the range a..b
.
say 1.squarefree_almost_prime_sum(1000) # sum of primes <= 1000
say 2.squarefree_almost_prime_sum(50, 1000) # sum of squarefree semiprimes in range 50..1000
squarefree_count
squarefree_count(n)
squarefree_count(a,b)
Returns the count of squarefree integers <= n
, or in the range a..b
.
# The number of squarefree integers between 10^5 and 10^6
say squarefree_count(10**5, 10**6) # 547132
# The number of squarefree integers <= 2^40
say squarefree_count(2**40) # 668422917419
Aliases: square_free_count
squarefree_divisors
squarefree_divisors(n)
Returns an array with the squarefree divisors of n
.
say squarefree_divisors(120) #=> [1, 2, 3, 5, 6, 10, 15, 30]
squarefree_fermat_psp
k.squarefree_fermat_psp(base, n)
k.squarefree_fermat_psp(base, a, b)
Returns an array with all the squarefree Fermat pseudoprimes to the given base
that are <= n
or in the range a..b
and have exactly k
prime factors.
say 3.squarefree_fermat_psp(2, 10000) # squarefree 3-Fermat psp to base 2
say 4.squarefree_fermat_psp(2, 10000, 100000) # squarefree 4-Fermat psp to base 2 in range
squarefree_almost_prime_count
k.squarefree_almost_prime_count(n)
k.squarefree_almost_prime_count(a,b)
Returns the count of squarefree k-almost primes <= n
, or in the range a..b
.
say 1.squarefree_almost_prime_count(1000) # count of primes <= 1000
say 2.squarefree_almost_prime_count(50, 1000) # count of squarefree semiprimes in range 50..1000
Aliases: squarefree_almost_primepi, squarefree_pi_k
squarefree_semiprime_count
squarefree_semiprime_count(n)
squarefree_semiprime_count(a,b)
Counts the number of squarefree semiprimes <= n
(OEIS: A072613), or in the range a..b
.
say 10.of {|k| squarefree_semiprime_count(10**k) } # OEIS: A036351
Aliases: squarefree_semiprimes_count
squarefree_semiprimes
squarefree_semiprimes(n)
squarefree_semiprimes(a,b)
Returns an array with the squarefree semiprimes <= n
, or in the range a..b
.
say squarefree_semiprimes(100) # squarefree semiprimes <= 100
say squarefree_semiprimes(50, 100) # squarefree semiprimes in the range [50, 100]
squarefree_semiprime_sum
squarefree_semiprime_sum(n)
squarefree_semiprime_sum(a,b)
Returns the sum of squarefree semiprimes <= n
, or in the range a..b
.
Aliases: squarefree_semiprimes_sum
squarefree_sigma
squarefree_sigma(n,k=1)
Sum of the squarefree divisors of n
, each divisor raised to power k
.
say squarefree_sigma(5040) #=> 576
say squarefree_sigma(5040, 2) #=> 65000
squarefree_strong_fermat_psp
k.squarefree_strong_fermat_psp(base, n)
k.squarefree_strong_fermat_psp(base, a, b)
Returns an array with all the squarefree strong Fermat pseudoprimes to the given base
that are <= n
or in the range a..b
and have exactly k
prime factors.
say 3.squarefree_strong_fermat_psp(2, 1e6) # squarefree strong 3-Fermat psp to base 2 <= 1e6
say 4.squarefree_strong_fermat_psp(2, 1e7, 1e8) # squarefree strong 4-Fermat psp to base 2, in range 1e7..1e8
squarefree_sum
squarefree_sum(n)
squarefree_sum(a,b)
Returns the sum of squarefree numbers <= n
or in the range a..b
. (OEIS: A066779)
say squarefree_sum(1e12) #=> 303963551353876732927386
say squarefree_sum(1e13) #=> 30396355090144154315002969
squarefree_udivisors
squarefree_udivisors(n)
Returns the unitary squarefree divisors of n
.
say squarefree_udivisors(5040) #=> [1, 5, 7, 35]
squarefree_usigma
n.squarefree_usigma(k=1)
Sum of the unitary squarefree divisors of n
, each divisor raised to power k
.
say 5040.squarefree_usigma #=> 48
say 5040.squarefree_usigma(2) #=> 1300
squarefree_usigma0
squarefree_usigma0(n)
Returns the number of unitary squarefree divisors of n
.
say squarefree_usigma0(5040) #=> 4
squarefull
squarefull(n)
squarefull(a,b)
Returns an array with the squarefull numbers <= n
, or in the range a..b
.
squarefull_count
squarefull_count(n)
squarefull_count(a,b)
Returns the count of squarefull numbers <= n
, or in the range a..b
.
squarefull_sum
squarefull_sum(n)
squarefull_sum(a,b)
Returns the sum of squarefull numbers <= n
, or in the range a..b
.
square_sigma
n.square_sigma(k=1)
Sum of the square divisors of n
, each divisor raised to the power k
.
say 5040.square_sigma #=> 210
say 5040.square_sigma(2) #=> 22386
Equivalent with:
n.square_divisors.sum {|d| d**k }
square_sigma0
square_sigma0(n)
Returns the count of square divisors of n
.
squares_r
squares_r(n, k=2)
The sum of squares function r_k(n)
returns the number of ways of representing n
as a sum of k
squares.
say 30.of { .squares_r(2) } # OEIS: A004018
say 30.of { .squares_r(3) } # OEIS: A005875
say 30.of { .squares_r(4) } # OEIS: A000118
Aliases: sum_of_squares_count
square_udivisors
square_udivisors(n)
Returns the unitary square divisors of n
, such that each divisor d
is a square and gcd(n/d, d) = 1
.
say 5040.square_udivisors #=> [1, 9, 16, 144]
square_usigma
n.square_usigma(k=1)
Sum of the unitary square divisors of n
, each divisor raised to power k
.
say square_usigma(5040) #=> 170
say square_usigma(5040, 2) #=> 21074
Equivalent with:
n.square_udivisors.sum {|d| d**k }
square_usigma0
square_usigma0(n)
Returns the count of unitary square divisors of n
.
squfof_factor
n.squfof_factor(tries=1e4)
Shanks' SQUFOF method.
The product of the factors will give back n
. However, some factors may be composite.
stirling
stirling(n,k)
Stirling numbers of the first kind.
Aliases: stirling1
stirling2
stirling2(n,k)
Stirling numbers of the second kind.
stirling3
stirling3(n,k)
Stirling numbers of the third kind (also known as Lah numbers).
strong_fermat_psp
k.strong_fermat_psp(base, n)
k.strong_fermat_psp(base, a, b)
Returns an array with all the strong Fermat pseudoprimes to the given base
that are <= n
or in the range a..b
and have k
distinct prime factors.
say 3.strong_fermat_psp(2, 1e6) # 3-omega strong Fermat psp to base 2
say 4.strong_fermat_psp(2, 1e6, 1e7) # 4-omega strong Fermat psp to base 2 in range
subfactorial
subfactorial(n,k=0)
Number of derangements of a set with n
elements having exactly k
fixed points. Also known as the rencontres numbers.
say 20.of { .subfactorial } #=> OEIS: A000166
say 20.of { .subfactorial(2) } #=> OEIS: A000387
submod
submod(a,b,m)
Modular integer subtraction: (a-b) % m
.
say submod(43, 97, 127) #=> (43-97)%127
submulmod
submulmod(a, b, c, m)
Modular operation: (a - b*c) % m
.
subsets
n.subsets
n.subsets(k)
n.subsets { ... }
n.subsets(k, { ... })
Returns an array with the subsets of the integers in the range 0..n-1
, or iterates over the k-subsets when a block is given.
say 5.subsets # all k-subsets of 0..4
say 5.subsets(2) # all 2-subsets of 0..4
5.subsets {|*a| say a } # iterate over all k-subsets of 0..4
5.subsets(2, {|*a| say a }) # iterate over all 2-subsets of 0..4
sum_of_squares
sum_of_squares(n)
Returns an array of [a,b]
pairs, with a
<= b
, containing all the positive solutions to the equation:
n = a^2 + b^2
Example:
say sum_of_squares(99025)
Output:
[[41, 312], [48, 311], [95, 300], [104, 297], [183, 256], [220, 225]]
sum_remainders
sum_remainders(n, v)
Returns the following sum: Sum_{k=1..n} v % k
, computed in O(sqrt(v))
steps.
say 20.of {|n| sum_remainders(n, n) } #=> OEIS: A004125
say 20.of {|n| sum_remainders(n, n.prime) } #=> OEIS: A099726
Negative values of v
are also supported.
superfactorial
superfactorial(n)
Returns the product of first n
factorials.
say 10.of { .superfactorial } #=> OEIS: A000178
superprimorial
superprimorial(n)
Returns the product of first n
primorials.
say 10.of { .superprimorial } #=> OEIS: A006939
tan
tan(x)
Trigonometric tangent function.
tangent_number
tangent_number(n)
Returns the n-th tangent/zag number. (OEIS: A000182).
tanh
tanh(x)
Hyperbolic tangent function.
times
n.times {|k| ... }
Call a given block of code n
times with k = 0,1,2,...,n-1.
5.times {|k| say "k = #{k}" }
to_n
x.to_n
Fixed-point function: returns x
.
Aliases: to_num
to_poly
x.to_poly
Converts x
to a Polynomial object.
to_s
x.to_s
Converts x
to a String object.
Aliases: to_str
totient
phi(n,k=1)
totient(n,k=1)
Euler's totient function.
For k>1, it returns the generalized Jordan's totient J_k(n)
.
Aliases: euler_phi, eulerphi, euler_totient
totient_range
totient_range(a, b)
Returns an array with the totient values for the range a..b
.
say totient_range(7, 17) #=> [6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16]
idiv_trunc
idiv_trunc(a,b)
Integer division of integers a
and b
, rounded towards 0.
When a
and b
are integers, this is equivalent with:
trunc(a/b)
Aliases: trd
trial_factor
n.trial_factor(limit)
Trial division.
The product of the factors will give back n
. However, some factors may be composite.
tuples
n.tuples(k)
n.tuples(k, { ... })
Returns an array with the k-tuples of the integers in the range 0..n-1
, or iterates over the k-tuples when a block is given.
5.tuples(2, {|*a| say a })
Aliases: variations
tuples_with_repetition
n.tuples_with_repetition(k)
n.tuples_with_repetition(k, { ... })
Returns an array with the k-tuples with repetition of the integers in the range 0..n-1
, or iterates over the k-tuples with repetition when a block is given.
5.tuples_with_repetition(2, {|*a| say a })
Aliases: variations_with_repetition
udivisors
udivisors(n)
Returns an array with the unitary divisors of n
.
say 120.udivisors #=> [1, 3, 5, 8, 15, 24, 40, 120]
These are divisors d
of n
that satisfy:
gcd(n/d, d) = 1
Aliases: unitary_divisors
uphi
uphi(n,k=1)
The unitary totient function. (OEIS: A047994)
urand
urand(n)
urand(a, b)
Given a positive integer n
, returns a cryptographically-secure pseudorandom unsigned integer smaller than n
.
say urand(100) # pseudorandom integer in [0,99]
When two arguments are given, returns a uniform pseudorandom unsigned integer in the range [a,b]
(inclusive on both ends).
say urand(100, 110) # pseudorandom integer in [100, 110]
Both arguments must be nonnegative. If a
is greater than b
, then will return a pseudorandom integer in the range [b,a]
.
The underlying CSPRNG is ISAAC-32.
Aliases: urandomm
usigma
usigma(n, k=1)
Returns the sum of the unitary divisors of n
, each divisor raised to the power k
.
usigma0
usigma0(n)
Returns the count of unitary divisor of n
.
Equivalently, the count of squarefree divisors of n
.
say usigma0(5040) #=> 16
Aliases: squarefree_sigma0
valuation
n.valuation(k)
Returns the number of times n
is divisible by k
.
say valuation(2**32, 4) # prints: 16
zero
Num.zero
Returns the number 0.
znlog
znlog(a, g, m)
Returns the integer k
that solves the congruence: a = g^k (mod m)
.
Returns NaN
if a solution is not found.
znorder
znorder(a,m)
The smallest positive integer k
such that powmod(a, k, m) == 1
.
Return NaN
if a
is not coprime to m
.
Aliases: multiplicative_order
znprimroot
znprimroot(n)
The smallest primitive root of (Z/nZ)^*.