uiua-math

uiua-math

FFTConvolve

FFTConvolve module

Rank-polymorphic convolution using fast fourier transform


FFTConvolve~Full function

|2Output?Input1Input2

Full convolution wherever any overlap between the inputs exists

Source code
FullR=0type(×/×fft×0-1+)

FFTConvolve~Valid function

|2Output?Input1Input2

Convolution of only instances of complete overlap between inputs

Source code
ValidR=0type(-+1(×/×fft×0)-)

FFTConvolve~Same function

|2Output?Input1Input2

Convolution that maintains the largest of the input dimensions

Source code
Same(÷-)Full

FFTConvolve~Wrap function

|2Output?Input1Input2

Wrapping convolution producing the same shape as the largest input

Source code
WrapR=0type(×/×fft×0)

Data types

OdeConfig data boxed

Configuration parameters for the Ode‼ macro

ε
H
HMin
HMax

Index macros

Ode‼! index macro

TX?T₀X₀

More configurable version of Ode‼

The first of the three functions can be used to set optional arguments:

  • ε - error bound
  • HMin - minimum step size
  • HMax - maximum step size
  • H - initial step size The remaining two functions correspond to those of Ode‼.

Example: Changing simulation precision. This sets the simulation precision threshold to a larger value (meaning less precision, with a cheaper simulation).

g9.81 # Gravity
L1 # Pendulum length
μ0.5 # Damping coefficient

[0 12] # Initial position of 0 and velocity of 12
0 # Initial time of 0
Ode‼!(°ε 1e¯3|[|¯+˜×g μ÷L°]|<10)
Source code
Ode‼!OdeImpl‼^1^2 OdeConfig!(^0($"_New"˜@⊙-1)^!^0)

Ode‼ index macro

TX?T₀X₀

Numerical integrator

Takes two functions and two values.

  • The first function should take a time value and a state vector and output the derivative of the state vector.
  • The second function should take anywhere from 1 to 4 arguments and return 0 or 1 for whether to continue simulating. Based on how many inputs the second function takes, it will be passed:
  1. The current time
  2. The current state vector
  3. The array of all past times
  4. The array of all past state vectors

The two values should respectively be the initial time and the initial state vector.

Example: Simulating a damped pendulum. This simulates the motion of a damped pendulum that begins vertical with an initial angular velocity of 12 radians per second.

g9.81 # Gravity
L1 # Pendulum length
μ0.5 # Damping coefficient

[0 12] # Initial position of 0 and velocity of 12
0 # Initial time of 0
Ode‼([|¯+˜×g μ÷L°]|<10)

Uses Runge-Kutta-Fehlberg 4th-5th-order variable-step-size numerical integration.

Source code
Ode‼Ode‼!^0^1

OdeT‼ index macro

X?TX₀

More configurable version of OdeT!

The first of the two functions can be used to set optional arguments:

  • ε - error bound
  • HMin - minimum step size
  • HMax - maximum step size
  • H - initial step size The remaining function corresponds to that of OdeT!.

Example: Changing simulation precision. This sets the simulation precision threshold to a larger value (meaning less precision, with a cheaper simulation).

g9.81 # Gravity
L1 # Pendulum length
μ0.5 # Damping coefficient

[0 12] # Initial position of 0 and velocity of 12
×5 10 # Time from 0 to 10 at 5 samples per second
OdeT‼(°ε 1e¯3|[|¯+˜×g μ÷L°])
Source code
OdeT‼(
OdeConfig!C‼^0(
C‼^0C‼^0(/|/-|/)
Ode‼!(^0C‼^0°HMax|^1|<°)
)
(-˜1>)
˜÷˜-/-
(-×|°|)
)

OdeT! index macro

X?TX₀

Numerical integrator

Takes a function and two values. The function should take a time value and a state vector and output the derivative of the state vector. The two values should be as follows:

  1. A list of all times to output samples at
  2. The initial state vector, interpreted to be the state at time equal to the smallest value in the time value list

Example: Simulating a damped pendulum. This simulates the motion of a damped pendulum that begins vertical with an initial angular velocity of 12 radians per second.

g9.81 # Gravity
L1 # Pendulum length
μ0.5 # Damping coefficient

[0 12] # Initial position of 0 and velocity of 12
×5 10 # Time from 0 to 10 at 5 samples per second
OdeT![|¯+˜×g μ÷L°]

Uses Runge-Kutta-Fehlberg 4th-5th-order variable-step-size numerical integration.

Source code
OdeT!OdeT‼^

Monadic functions

Mean function

|1Output?Input

Arithmetic mean

Source code
Mean÷/+

GMean function

|1Output?Input

Geometric mean

Source code
GMean˜÷1/×

HMean function

|1Output?Input

Harmonic mean

Source code
HMean÷/+˜÷1

QMean function

|1Output?Input

Quadratic mean

Source code
QMean÷/+˙×

Median function

|1Output?Input

Median TODO: O(n) median algorithm?

Source code
Median÷2/+÷2-1

Var function

|1Output?Input

Variance

Source code
Var-˙×÷/+˙×

Stdev function

|1Output?Input

Standard deviation

Source code
StdevVar

Sin function

|1Output?Input

Sine

Source code
Sin

Cos function

|1Output?Input

Cosine

Source code
Cos˜-η

Tan function

|1Output?Input

Tangent

Source code
Tan(÷°|1)

Csc function

|1Output?Input

Cosecant

Source code
CscSin

Sec function

|1Output?Input

Secant

Source code
SecCos

Cot function

|1Output?Input

Cotangent

Source code
CotTan˜-η

Sinh function

|1Output?Input

Hyperbolic Sine

Source code
Sinh(÷-¯|°+˙×+)

Cosh function

|1Output?Input

Hyperbolic Cosine

Source code
Cosh(÷+¯|°+˙×-)

Tanh function

|1Output?Input

Hyperbolic Tangent

Source code
Tanh(÷+-1×|÷°÷˜-+1)

Csch function

|1Output?Input

Hyperbolic Cosecant

Source code
CschSinh

Sech function

|1Output?Input

Hyperbolic Secant

Source code
SechCosh

Coth function

|1Output?Input

Hyperbolic Cotangent

Source code
CothTanh

MDet function

|1Output?Input

Matrix Determinant

Source code
MDetGaussEliminate‼(¯/)× 01

Mgje function

|1Output?Input

Perform Gauss-Jordan elimination

Source code
Mgje˜1>1e¯12 (
(÷(-×0÷)°)>1e¯12
)

MInv function

|1Output?Input

Matrix Inverse

Source code
MInv|1 ((÷2) Mgje("Matrix has no inverse"0) ˜˙=°|MInv)

Fact function

|1Output?Input

Pervasive factorial

Source code
Fact/×°+10

Gamma function

|1Output?Input

Gamma function Γ(z)

Source code
Gamma(
-1/2 (
-1
# From https://en.wikipedia.org/wiki/Lanczos_approximation
°[
0.9999999999999999
1975.3739023578853
¯4397.382392792243
3462.6328459862716
¯1156.9851431631168
154.53815050252774
¯6.253671612368916
0.034642762454736804
¯7.477617197444297e¯7
6.304125382185226e¯8
¯2.7405717035683877e¯8
4.048694881756761e¯9
]
/+÷1+˜¤
)
××× τ ¯ + 8 # g
)

Divisors function

|1Output?N

Divisors of N (including 1 and N) The values are in increasing order and distinct.

Source code
Divisors°÷ =0÷ +1

Erf function

|1Output?Input

Error function

Source code
Erf(
# From https://www.johndcook.com/blog/cpp_erf
˜÷1+1×0.3275911 (˜e¯˙×) ±
[1.061405429 ¯1.453152027 1.421413741
¯0.284496736 0.254829592
]0
׬×(×+)¤
)

PSet function

|1Output?Input

Powerset of a list

Source code
PSet˜2¤

Dyadic functions

MCof function

|2.2Output1Output2?Input1Input2

Matrix Cofactors

Source code
MCof¯˙2°MSquarify(MDet MSquarify¤¬°)¤0°=

Dot function

|2Output?Input1Input2

Dot product

Source code
Dot/+×

Cross function

|2Output?Input1Input2

Cross product

Source code
Cross2-(×2)F

Mmp function

|2Output?AB

Matrix product

Computes AB

Source code
Mmp|2 (Dot|Mgje)

Mvp function

|2Output?MV

Matrix-vector product

Computes MV where V is represented as a 1D list of numbers

Source code
Mvp|2 (Dot|Mgje)

Mpow function

|2Output?PM

Matrix power

Source code
MpowMmp(F˙=°)

Qqp function

|2Output?PQ

Quaternion product

Computes PQ for quaternion arrays P and Q.

Semi-pervasive; the last axis of the inputs must be of length 4, and will be interpreted as the input quaternions’ real, i, j, and k.

# Computes (1+2i+3j+4k)(1+3i+5j+7k) and (2+4i+6j+8k)(5+6i+7j+8k)
Qqp [1_2_3_4 2_4_6_8] [1_3_5_7 5_6_7_8]
## ╭─
## ╷ ¯48 6 6 12
## ¯120 24 60 48
## ╯
Source code
Qqp/+-1×±QqpMask×°

RQuat function

|2Output?θU

Create 3D rotation quaternions.

Expects an angle array θ and a unit vector axis array U.

Semi-pervasive; the unit vector array must have one extra trailing axis compared to the angle array, and that axis must be length 3.

For each angle-vector pair, computes cos(θ/2) + Usin(θ/2).

# Creates two rotation quaternions:
# - η radians about 0_0_1
# - π radians about 3/5_4/5_0
RQuat η_π [0_0_1 3/5_4/5_0]

To use rotation quaternions created by RQuat to rotate 3D vectors, see QRot.

Source code
RQuat°˜×°÷2

QRot function

|2Output?QV

Rotate a 3D vector array using a quaternion array.

To create rotation quaternions to use with QRot, see RQuat.

Expects a quaternion array Q and a 3D vector array V.

Semi-pervasive; the input arrays should have matching shapes aside from the final axis, which should be of lengths 4 and 3 respectively.

For each quaternion-vector pair, computes Q * V * Q’.

RQuat η 0_0_1 # Create a rotation by η radians about 0_0_1
QRot ¤[3_2_0 1_3_2] # Use the quaternion to rotate 3_2_0 and 1_3_2

QRot can be used with ⍜ to undo the rotations afterward.

Source code
QRot(QRotImpl|QRotImpl(1°)¯)

GCD function

|2Output?Input1Input2

Greatest common divisor

Ignores sign

Source code
GCD±

LCM function

|2Output?Input1Input2

Least common multiple

Ignores sign

Source code
LCM÷GCD×

Base function

|2Output?Input1Input2

Encode an array of numbers into digits of a given base

Analogous to for base 2; the least significant digit is first.

Base allows multiple bases as input.

# Encodes 6 in base 2, 7 in base 3, 8 in base 4, and 9 in base 5.
Base [2_3 4_5] [6_7 8_9]
## ╭─
## ╷ 0 1 1
## ╷ 1 2 0
##
## 0 2 0
## 4 1 0
## ╯

You can use ⌝Base to decode from a base/bases.

# Decodes 6 in base 2, 7 in base 3, 8 in base 4, and 9 in base 5.
Base [2_3 4_5] [[0_1_1 1_2_0] [0_2_0 4_1_0]]
## ╭─
## ╷ 6 7
## 8 9
## ╯
Source code
Base(
(¤÷)¤/+1˜[]
| /+פ°)

ModInv function

|2Output?NM

Inverse of N modulo M (M if nonexistent)

Source code
ModInv˜1˜×

ModOrd function

|2Output?NM

Multiplicative order of N modulo M

Source code
ModOrd1=1˜

CFrac function

|2Output?NX

Convert a number X to a continued fraction to N terms.

Use °CFrac to convert to a number from a continued fraction.

Source code
CFrac((÷1)|/(+˜÷1))

BoxMuller function

|2.2Output1Output2?Input1Input2

Box-Muller transform

Converts uniformly distributed pairs of input values to standard normally distributed pairs of output values

Source code
BoxMuller×°×τFׯ2°¬

Gaussian function

|2Output?SizeStandardDeviation

Generate a 2 dimensional square Gaussian kernel

Source code
Gaussian÷/+¯÷2˙ט÷˙-÷2-1

GeomPmf function

|2Output?pX

Geometric distribution

Probability of X failures before the first success of repeated trials with success probability p

Source code
GeomPmf×(˜¬)

GeomCmf function

|2Output?pX

Cumulative geometric distribution

Probability of X or fewer failures before the first success of repeated trials with success probability p

Source code
GeomCmf¬˜(+1)

PoissonPmf function

|2Output?λX

Poisson distribution

Probability of X occurrences of an unlikely event over many trials with expected value λ

Source code
PoissonPmf÷×(Fact|˜|¯)

PoissonCmf function

|2Output?λX

Cumulative Poisson distribution

Probability of X or fewer occurrences of an unlikely event over many trials with expected value λ

Source code
PoissonCmf/+PoissonPmf¤(+1)

Triadic functions

DistRand function

|3Indices?DistributionShapeSeed

Seeded random indices from a distribution array

Given a seed, a shape, and a probability distribution array of any rank containing positive numbers, DistRand normalizes the distribution if necessary so it sums to 1, then returns an array of deep indices into the distribution arrays, chosen randomly weighted by the distribution. The generated random indices will fill the shape given to the function. If the distribution array is rank 1, the output will have the shape given. If the distribution array is rank >1, the output will have a shape equal to the shape given suffixed with the rank of the distribution array.

# Generate random indices in the shape 2_3 with a seed of 8
DistRand [0.1 0.4 0.3 0.2] 2_3 8
## ╭─
## ╷ 1 2 3
## 2 1 2
## ╯
Source code
DistRand˜(>)¤gen\+÷/+

BinomPmf function

|3Output?pnX

Binomial distribution

Probability that n Bernoulli trials each with success probability p will amount to X successes

Source code
BinomPmf××(>|˜|-¬) F

BinomCmf function

|3Output?pnX

Cumulative binomial distribution

Probability that n Bernoulli trials each with success probability p will amount to X or fewer successes

NOTE: This function only accepts scalars for X. Use each or rows if multiple X values are desired

Source code
BinomCmf/+BinomPmf¤(+1)

NormalPdf function

|3Output?σμX

Normal distribution

Probability density of a gaussian/bell curve with mean μ and standard deviation σ

Source code
NormalPdf÷(×τ|÷2¯˙×÷-)

NormalCdf function

|3Output?σμX

Cumulative normal distribution

Probability that a normally distributed random variable with mean μ and standard deviation σ is less than X

Source code
NormalCdf÷2+1Erf÷×2-

Quad function

|3Output?ABC

Po-Shen quadratic solver

Returns roots as a list

Outputs complex-typed numbers only if the roots are complex

Source code
QuadR˜-+F±˜-˙×F¯÷÷