Symbraix

The user guide

Mathematics, at hand.

Get started, find a function, or follow a worked example. One guide for light and dark, on any screen.

Symbraix 0.7 · November 2026

Contents

01 / WHY WE BUILT IT

A small window for serious mathematics

We created Symbraix because a quick calculation should not require opening a programming environment, loading packages, or setting up an analysis notebook. We wanted mathematical depth without the overhead.

Symbraix stays alongside the work. A single expression can evaluate a trigonometric identity or a complex number; the same workspace can hold vectors, matrices, uncertainties, symbolic algebra, plots, and numerical tensor operations. We can revisit an earlier result without losing the context in which it was obtained.

Our ambition is broader than a calculator, but our interface remains deliberately modest. Symbraix is a focused scientific scratchpad for researchers, engineers, students, and anyone who thinks in equations.

Minimal to operate. Capable enough to explore. Transparent about what has and has not been validated.
Illustrative Symbraix interface concept

Concept artwork: a design illustration of the intended workflow, not a screenshot of the current TestFlight build.

Back to contents and search ↑

02 / GET STARTED

Your first calculation

Open Symbraix. Type an expression in the lower editor, then press Return. Every successful statement becomes an item in the scrollable worksheet above.

vec(1,2,3,4) + vec(1,2,3,4)

Expected result or note: Result: [2, 4, 6, 8]

Definitions and evaluations can share one submission. Statements are separated by semicolons or new lines; semicolons inside square brackets remain matrix row separators.

x=4; y=7; x+y**2

Expected result or note: Results: 4, 7, 53

Shift-Return inserts a line without evaluating. Up/Down recall earlier commands at editor boundaries, while Option-Up/Option-Down explicitly cycle command history. Existing results are labelled Out[n]; out(n) reuses their full stored values.

ControlPurpose
New / Command-NBegin a fresh calculation worksheet
Open / Command-OOpen a previously saved chain file
Save / Command-SSave the current chain, including results
Settings / Command-,Set input and output text sizes independently
Keep on TopKeep the calculator visible beside other apps

The examples in this guide use a readable input syntax and are not a promise of arbitrary Python compatibility.

Back to contents and search ↑

03 / EXPRESSIONS

Scientific notation and variables

Expressions are deterministic. Names store results, not live formulas; later reassignment does not rewrite old entries. Built-in functions use radians unless they explicitly specify degrees.

q=2; p=3
z=(q+i*p)/sqrt(2)
z*conj(z)

Expected result or note: Result: 6.5

NotationInterpretation
^ and **Exponentiation; 2^3^2 evaluates as 512
i or jImaginary unit, i*i = -1
pi, e, tauMathematical constants
sin, cos, tan, expElementwise numerical functions
ln, log2, log_10Logarithms by base
ansMost recent successful result
out(n)Saved full-precision worksheet result

A malformed statement leaves its input available for correction. The worksheet and variable state of that submission are rolled back together, avoiding partially applied calculations.

Precision: ordinary real and complex numerical values use 64-bit floating point. Extra printed digits do not imply extra accuracy.
z=q+ip2z = (q + i p) / sqrt(2)

Back to contents and search ↑

04 / LINEAR ALGEBRA

Vectors, complex numbers and matrices

Array operations follow a NumPy-like distinction: * is elementwise multiplication and @ is matrix multiplication. The transpose is not the complex adjoint.

A=[1,2;3,4]
A*A
A@A
det(A)
inv(A)

Expected result or note: [[1,4],[9,16]] · [[7,10],[15,22]] · -2 · [[-2,1],[1.5,-0.5]]

Complex operations extend through vectors and matrices, including multiplication, conjugation and supported scientific functions. For inner products, dot(a,b) is bilinear, whereas vdot(a,b) conjugates its first argument.

u=[1+i,2]
vdot(u,u)
transpose(A)
adjoint(A)

Expected result or note: 6 · ordinary transpose · conjugate transpose

Matrix multiplication as an explicit contraction, not elementwise arithmetic.Matrix multiplication as an explicit contraction, not elementwise arithmetic.
Matrix multiplication as an explicit contraction, not elementwise arithmetic.

Some numerical factorization operations have size limits. The algebra engine is not a general matrix-function or arbitrary-precision package.

Back to contents and search ↑

05 / UNITS & ERRORS

Quantities that know what they mean

Dimensional compatibility is checked when quantities are added or converted. Measurements carry standard uncertainties through supported operations using first-order derivative propagation.

length=measure(2,0.01,"m")
width=measure(30,0.2,"cm")
convert(length*width,"m^2")

Expected result or note: 0.6 +/- 0.005 m^2

Reusing a measurement retains its identity and therefore its correlation. Two separately constructed measurements are independent unless an explicit correlation is provided.

a=measure(2,0.1,"m")
sigma(a-a)
sigma(a+a)

Expected result or note: 0 · 0.2

Uncertainty is a joint geometric object when input errors are correlated.Uncertainty is a joint geometric object when input errors are correlated.
Uncertainty is a joint geometric object when input errors are correlated.
First-order propagation is an approximation, especially near singularities or for strongly nonlinear functions. This version does not provide general uncertain tensor or Monte Carlo calculations.

Back to contents and search ↑

06 / SYMBOLIC

A practical layer of algebra

Symbolic expressions are constructed explicitly. This avoids confusing a misspelled numerical name with a new mathematical indeterminate. The supported manipulations are intentionally conservative.

simplify("2*x+3*x")
expand("(x+1)^2")
differentiate("x^3+2*x","x")
evaluate("x^2+1","x",[1,2,3])

Expected result or note: 5*x · expanded polynomial · 3*x^2+2 · [2,5,10]

The symbolic system handles a defined subset of simplification, expansion, substitution, differentiation and low-degree polynomial analysis. It does not automatically prove identities that depend on complex branches, positive-definiteness, or unspoken assumptions.

Treat an algebraic rewrite as a transformation with hypotheses, not a cosmetic simplification.

General-purpose symbolic tensor canonicalization, arbitrary symbolic integration and metric variation remain development goals rather than capabilities of the current beta.

Back to contents and search ↑

07 / PLOTTING

From expression to picture

Define data in the same worksheet, then plot it directly. The plot captures the data as they were calculated; later changes to a variable do not alter the earlier result.

t=linspace(0,8,401)
omega=4; zeta=0.08
x=exp(-zeta*omega*t)*cos(omega*sqrt(1-zeta^2)*t)
plot(t,x,"Damped response")
An illustrative damped oscillator with its analytical envelope. See the engineering example.An illustrative damped oscillator with its analytical envelope. See the engineering example.
An illustrative damped oscillator with its analytical envelope. See the engineering example.

Line/scatter display, multiple curves and SVG figure export are supported in the underlying beta source. Plotting is sampled, not guaranteed to detect every discontinuity between samples.

Back to contents and search ↑

08 / TENSORS

Tensor values and index metadata

Array rank alone is not enough for geometric tensor algebra. Our typed numerical tensor layer records index variance (upper/lower), conjugation kind (barred/unbarred), and a named carrier space.

Text notationInterpretation
^aUpper, unbarred index
_aLower, unbarred index
^~aUpper, barred index
_~aLower, barred index
h=metric([1,0;0,1],"V","hermitian")
u=indexed([1+i,2],"^a","V")
tinner(u,u,h)

Expected result or note: 6

Other operations include component extraction, slot permutations, transposes, raising/lowering with explicit forms, compatible contraction, and numerical frame changes. Barred indices are not merely a synonym for covariant indices.

This layer checks numerical indexed components. It does not yet automatically perform abstract dummy-index renaming, Bianchi canonicalization, covariant derivative identities, or full symbolic curvature calculus.

Back to contents and search ↑

09 / SOURCE EXAMPLE

From Hamiltonian structure to complex variables

Dean (2026), Hamilton's equations in unitary form, Eq. (8), begins with the antisymmetric 2×2 tensor that organizes a coordinate-momentum pair. A direct numerical check is:

J=[0,1;-1,0]
J@J
J@[2,3]

Expected result or note: [[-1,0],[0,-1]] · [3,-2]

For H=(q^2+p^2)/2, the flow generated by J traces an orbit in phase space.For H=(q^2+p^2)/2, the flow generated by J traces an orbit in phase space.
For H=(q^2+p^2)/2, the flow generated by J traces an orbit in phase space.

The matrix identity J² = −I explains the appearance of eigenvalues ±i. The manuscript's Eq. (13) defines complex variables from q and p; an executable scalar version is z=(q+i*p)/sqrt(2).

Source: Dean (2026), pp. 4–6, Eqs. (8), (11)–(16). Numerical checks supported; full symbolic derivation not claimed.

J2=−IJ squared equals minus the identity matrix

Back to contents and search ↑

10 / SCHOUTEN NOTATION

Barred indices are geometric information

Dean (2026), p. 5, draws on J. A. Schouten's hybrid-index notation to place conjugation on the index rather than only the component symbol. This is distinct from upper-versus-lower variance. Symbraix therefore records these as separate slot attributes.

h=metric([1,0;0,1],"V","hermitian")
u=indexed([1+i,2],"^a","V")
tinner(u,u,h)

Expected result or note: 6

The example above illustrates a standard positive Hermitian form. It is not an assertion that the special transformed tensor in the manuscript's Eq. (14) is identical to the identity Hermitian form.

Convention check for research replication: Eq. (14) of the supplied manuscript displays diagonal entries −i and +i while calling the displayed matrix Hermitian. Under the usual conjugate-transpose convention, that diagonal matrix is skew-Hermitian. Symbraix should retain the source exactly, record the convention question, and avoid silently changing signs.

Sources: Dean (2026), pp. 5–6, Eqs. (13)–(16); Schouten (1954), as cited in that article.

Back to contents and search ↑

11 / SOURCE EXAMPLE

Gauge kinematics from the dissertation

Dean's 1999 dissertation, Appendix C, develops a rotational gauge connection and its relation to motion in a rotating frame. The printed connection matrix in Eq. (C.9) is antisymmetric.

For a particular angular-velocity choice, the following is a straightforward component test following the sign convention displayed in that equation:

W=[0,3,-2;-3,0,1;2,-1,0]
transpose(W)+W
W@[1,0,0]

Expected result or note: Zero matrix · [0,-3,2]

This verifies antisymmetry and matrix-vector action, not the gauge-transformation law or a variational identity. Reproducing Eq. (C.10), the covariant derivative and full local SO(3) kinematics symbolically would require the extended tensor-field engine.

Source: Dean (1999), Appendix C, pp. 166–168, Eqs. (C.5)–(C.13). Numerical component adaptation.

Back to contents and search ↑

12 / DIFFERENTIAL GEOMETRY

A metric on the sphere

On a unit sphere with coordinates (θ, φ), the standard two-dimensional metric is diag(1, sin²θ). Symbraix can evaluate its numerical components and inverse at a selected point.

theta=pi/3
g=[1,0;0,sin(theta)^2]
det(g)
inv(g)

Expected result or note: 0.75 · [[1,0],[0,1.333333...]]

Metric coordinates on a sphere: latitude/longitude directions have different length factors.Metric coordinates on a sphere: latitude/longitude directions have different length factors.
Metric coordinates on a sphere: latitude/longitude directions have different length factors.

For a sphere of radius R, the Gaussian curvature K = 1/R² is a mathematical reference result. Automatically deriving the Christoffel symbols and curvature from an arbitrary symbolic metric is not a verified Build 8 feature.

Reference: Standard sphere metric. The related geometric motivation appears in Dean (1999), Chs. 2–4; this specific sphere example is an independently authored teaching example.

g=[100sin2θ]Sphere metric: g = diag(1, sin(theta)^2)

Back to contents and search ↑

13 / ENGINEERING

A damped control response

A second-order underdamped system has a response with an exponentially decreasing envelope and a damped natural frequency. A vectorized workflow makes it easy to inspect its sensitivity to parameters.

omega=4; zeta=0.08
t=linspace(0,8,401)
wd=omega*sqrt(1-zeta^2)
x=exp(-zeta*omega*t)*cos(wd*t)
plot(t,x,"Damped response")
Analytical damped response. Natural frequency 4 rad/s; damping ratio 0.08.Analytical damped response. Natural frequency 4 rad/s; damping ratio 0.08.
Analytical damped response. Natural frequency 4 rad/s; damping ratio 0.08.

Unit-aware quantities and correlated measurements can be used separately for calibration. A complete symbolic transfer-function or robust-control toolbox is outside this initial beta.

Back to contents and search ↑

14 / PHYSICS

Dynamics in complex phase space

The complex coordinate z = (q+ip)/√2 in Dean (2026), Eq. (13), joins a real phase-space pair for a chosen normalization. For a harmonic oscillator, the motion takes the form z(t)=z(0)e^(−iωt) in Eq. (28).

omega=2; t=linspace(0,2*pi,501)
z0=1+0.5*i
z=z0*exp(-i*omega*t)
plot(real(z),imag(z),"Complex trajectory")
Real phase-plane orbit for an ideal oscillator; the complex trajectory is the same motion in another representation.Real phase-plane orbit for an ideal oscillator; the complex trajectory is the same motion in another representation.
Real phase-plane orbit for an ideal oscillator; the complex trajectory is the same motion in another representation.

This example exercises complex vectorization and 2D plotting. It does not, by itself, establish invariance under arbitrary canonical transformations or symbolic Poisson-bracket identities.

Source: Dean (2026), Section VI, pp. 8–9, Eqs. (25)–(29).

Back to contents and search ↑

15 / INFORMATION THEORY

Entropy in one line

The binary Shannon entropy measures uncertainty in a Bernoulli variable with probability p, in bits:

H2(p)=−plog2p−(1−p)log2(1−p)H₂(p) = −p log₂ p − (1−p) log₂(1−p)

The calculator can evaluate the expression elementwise. Avoid p=0 or 1 with direct logarithms and evaluate the limiting values separately.

p=linspace(0.01,0.99,199)
H=-(p*log2(p)+(1-p)*log2(1-p))
plot(p,H,"Binary entropy")

Expected result or note: At p=0.5, H = 1 bit

Binary entropy peaks at p = 1/2, where H₂ = 1 bit.Binary entropy peaks at p = 1/2, where H₂ = 1 bit.
Binary entropy peaks at p = 1/2, where H₂ = 1 bit.

This is a useful example of mathematical depth without a specialized statistics or communications interface. More elaborate channel-coding and inference algorithms are outside the release scope.

Reference: Shannon (1948), A Mathematical Theory of Communication, Bell System Technical Journal.

Back to contents and search ↑

16 / NUMERICAL INTEGRITY

Know the limits of a result

Symbraix uses standard floating-point computations for most numerical values. It aims for deterministic and explainable behavior, but it is not a certified arbitrary-precision or interval-arithmetic system.

AreaCurrent boundary
Floating point64-bit real and complex values
Vector/matrix/tensorFinite numerical arrays with shape and resource limits
Symbolic manipulationRestricted algebra; no full CAS assumptions engine
Tensor algebraIndex-aware components; incomplete abstract tensor calculus
UncertaintyFirst-order scalar error propagation
PlotsSampled two-dimensional data; no adaptive guarantee

Retain the source expression, units, coordinate conventions, and error assumptions for any result used in design, publication, or safety-related work. Numerical comparisons should use stated tolerances, not equality of displayed decimal strings.

Important research boundary: the supplied dissertation's MathTensor workflows for curvature variations, Palatini equations and complete Einstein-Hilbert symbolic derivations are not verified as supported in this beta.

Back to contents and search ↑

17 / MANUAL & APP

Settings, appearance and saved work

Symbraix follows the system light/dark appearance. In the updated development source, Symbraix → Settings (Command-comma) contains independent font-size settings for input and worksheet results. These were still awaiting fresh interactive acceptance when the first macOS TestFlight Build 8 was uploaded.

New begins a calculation; Open restores a saved chain without reevaluating; Save writes the state of the worksheet and supported result values. Explicit file operations should not change appearance preferences.

This HTML Help system follows system appearance and includes the guide and detailed reference. In the updated app, choose Help → Symbraix Help to visit it, or Help → Quick Reference for a short offline reminder. The Light and Dark PDF manuals remain bundled in the updated application during this transition; existing installed builds change only when you update the app.

A web account is not required to use the local Mac calculator. Community registration and support-form submission, once activated, are separate optional website services.

Back to contents and search ↑

18 / SOURCES

Sources and reproducibility

Dean, Bruce H. (2026). Hamilton's equations in unitary form, manuscript dated September 17, 2026. Especially Secs. IV–VI and Eqs. (8), (11)–(16), (25)–(29). Supplied author manuscript.

Dean, Bruce Herold (1999). Variational Results and Solutions in Gauge Gravity and a Bifurcation Analysis of Black Hole Orbital Dynamics. Ph.D. dissertation, West Virginia University. Appendix A (MathTensor 2.2/Mathematica 3.0), Appendix C (gauge kinematics), Chapters 2–6.

Schouten, J. A. (1954). Ricci-Calculus, 2nd ed.; Tensor Analysis for Physicists, 2nd ed. Referenced in Dean (2026).

Christensen, S. M. and Parker, L. (1994). MathTensor: A System for Doing Tensor Analysis by Computer. Addison-Wesley. Referenced in Dean (1999).

Shannon, C. E. (1948). “A Mathematical Theory of Communication,” Bell System Technical Journal.

Examples adapted from the supplied papers are cited at the point of use. Independently authored educational examples are identified as such. Concept artwork does not imply that a pictured interface has been tested or distributed.

Symbraix 0.7.0 (8) documentation edition, November 2026. This guide accompanies a beta release; features may change before public distribution.

Back to contents and search ↑

Complete reference

The detailed reference below preserves the original 0.7 manual. Historical edition labels are retained; the worked examples and mathematical limits remain part of this guide.

Complete reference

User Guide

Version 0.7.0 | Candidate 08 (build 8) | November 2026

We are developing Symbraix to make advanced mathematical analysis fast, intuitive, and easily accessible. Our goal is a minimal workspace that stays beside your work, from quick everyday calculations to symbolic expressions, units, uncertainty, and advanced tensor-index calculations, without the setup and visual complexity of a general programming environment.

Your first calculation

Open Symbraix, click the expression field when you are ready to type, and enter:

vec(1,2,3,4) + vec(1,2,3,4)

Press Return. The result is:

[2, 4, 6, 8]

No Python installation, package manager, account, or internet connection is needed for calculations. This is a native Mac app window, not a WidgetKit extension.

Find what you need

  • Keep the calculator nearby and use the keyboard
  • Expressions, variables, and the scrolling worksheet
  • Complex numbers, vectors, and matrices
  • Linear algebra and scientific function reference
  • Precision, limits, privacy, and recovery
  • Units and dimensional consistency
  • Uncertainty and correlation
  • Basic symbolic algebra
  • Numerical tensor contractions
  • Plots and figure export
  • New, Open, and Save
  • Command recall and indexed tensor algebra

Keep it nearby

Keep on Top is on by default for this version. The calculator stays above ordinary app windows when you switch to another application. It does not have to be selected in the Dock to remain visible. Typing still goes to the application you have chosen; floating does not capture your keyboard.

Move it once

Drag the empty part of the top header, beside the Symbraix name. Resize from any edge or corner, including the upper edge and upper corners. The expression and result remain selectable. We remember the window position and restore it when you reopen the app. If a display is disconnected, the calculator is moved back into an available screen area.

The filled pin indicates Keep on Top. Click it, or use Window > Keep on Top, to allow other windows in front. Your choice is remembered. The window requests availability across desktop Spaces; full-screen applications, Stage Manager, and system overlays remain subject to macOS window management.

Text size in Settings

Choose Symbraix > Settings… or press Command-comma, including while typing an expression. The small native Settings window opens above the pinned calculator. Opening Settings again brings the same window forward. Closing it leaves Keep on Top unchanged.

Input font size changes the active multiline editor. Calculation display font size changes existing and future worksheet expressions and text answers, including vectors, matrices, units, uncertainty, symbolic and indexed tensor results. The controls are independent, accept 10–36 points, and take effect immediately. Use the numeric field (Return to commit) or the stepper. Tab moves between controls.

The defaults preserve the earlier appearance: input 17 pt and calculation display 22 pt. The display value is the main answer size; expressions and matrix answers retain their smaller relative sizing, with a 10 pt minimum. Font families and alignment stay the same. Toolbar buttons and plot labels do not grow.

Changing fonts preserves your unfinished text, selection, text undo history and stored values. It does not calculate again. Long input wraps and scrolls; wide answers scroll horizontally and multiline answers grow vertically. Both preferences survive quitting and reopening. New, Open and Save affect calculations, not these app preferences. Restore Defaults resets only the two text sizes, without clearing calculations or changing pinning or window geometry.

Resize at the visible boundary

Drag the visible top, bottom, left or right border to change one dimension, or a rounded corner to change both. The opposite edge or corner stays anchored, subject to the minimum usable size and available screen area. A directional resize cursor distinguishes the boundary from the header interior. Drag the empty interior header beside the name to move the whole window. These gestures work with Keep on Top on or off; the resized geometry is remembered.

Close, hide, or quit deliberately

Changing apps does not close the calculator. Standard Mac controls still let you close, hide, or minimize it intentionally. Window > Show Symbraix, Command-0, the Dock icon, or the menu-bar entry restores it. Command-Q quits the app. There is no automatic login launch.

Action Keyboard
Evaluate all statements in the input Return
Focus and select the expression Command-L
Force older / newer command recall Option-Up / Option-Down
Clear the current input, keep saved values Escape
Copy the full last successful result Command-Shift-C
Go to the latest calculation Command-Y
Show the calculator while Symbraix is active Command-0
Close / minimize the current window Command-W / Command-M
Settings Command-comma
Quit Symbraix Command-Q
Insert a new line without calculating Shift-Return
Move within input; recall at its boundaries Up / Down

These are app shortcuts, not system-wide hotkeys. Use the menu-bar entry when another app is active. The interface follows system light or dark appearance; Reduce Transparency uses a solid background.

Expressions and variables

Enter assignments and expressions in order. Separate statements with semicolons or new lines. Return evaluates the current input; Shift-Return inserts a new line. The following can be entered separately or together:

Input Result
x = 7 7
y = 4 4
x + y 11
x + y = ? 11
z = x + i*y 7 + 4*i
z^2 = ? 33 + 56*i

The optional suffix = ? (or simply ?) asks for evaluation. It is not an equation solver. An assignment such as x = 7 stores a value; an expression such as x + 4 = 7 does not solve for x.

Names store values, not live formulas

Names are case-sensitive. Use names such as x, velocity, or sample_2, beginning with a letter or underscore. Constants, function names, i, j, and ans are reserved. There can be up to 64 named variables. Reassigning an existing name replaces its value. Legacy saved variables that share a newly added function name remain usable; the variable name and a function call such as det(A) are distinct.

For example, after x = 7 and y = x + 1, y is 8. Changing x to 20 does not change y until you evaluate its assignment again. Recalling history reevaluates the expression using current variables, not the old values.

Operators and constants

Syntax Meaning
+ - * / Addition, subtraction, explicit multiplication, division
^ or ** Power, not bitwise XOR; 232 is 512
-2^2 and (-2)^2 -4 and 4, respectively
% Real-number remainder with the divisor's sign
pi, e, tau, eps Pi, Euler's number, 2*pi, binary64 epsilon
ans The last successful result, including assignments

Write 2pi or 3i, not 2pi or 3i. Use a decimal point and commas between arguments, independent of region settings. Scientific notation such as 1e-6 is supported. If any statement fails, no statement from that submission changes variables, ans, or the worksheet. Correct the highlighted input and evaluate again.

A scrolling calculation worksheet

The worksheet above the input keeps expressions and results in order. Scroll it to review earlier calculations. The input below it is a separate, scrollable multiline editor. It grows to seven lines and then scrolls; resize the window for more working space.

Define, calculate, continue

Type this on one line and press Return:

x = 4; y = 7; x+y**2

The worksheet records three results: 4, 7, and 53. The input clears after success and keeps keyboard focus, ready for the next calculation. Alternatively, use Shift-Return between statements and Return once to evaluate the whole input.

Reuse an earlier answer

Each new result is labeled Out[n]. Click that label to insert out(n) at the input cursor, or type the reference yourself. It uses the stored value, not the rounded screen text. On a new session, the example above gives Out[3] = 53; out(3)*2 then returns 106. Use the actual number shown in your worksheet.

The reuse-arrow recalls an expression for evaluation with current variables. Out[n] instead inserts the saved value, including its uncertainty correlations. Copy Result produces reusable text for ordinary values. Copying a measurement creates an independent measurement when pasted; use Out[n] or Save when identity matters.

Separators and errors

Semicolons inside brackets remain matrix row separators: A=[1,2;3,4]; A@A is two statements. New lines inside brackets or parentheses are whitespace; keep a semicolon between matrix rows. Wrap a long expression in parentheses to continue it over several lines.

A failed submission keeps your input and reports the offending statement and location. None of its assignments or results is saved. Earlier successful work remains unchanged. Blank lines and trailing semicolons are accepted; a trailing semicolon does not suppress output. This is a sequential worksheet, not a reactive spreadsheet.

A submission supports up to 128 statements and shares one work budget. The worksheet retains up to 1,000 entries and 200,000 result elements, removing the oldest entries first. Result numbers are never reassigned while a session continues; an evicted out(n) reports an unavailable-result error. Assign important results to named variables.

Complex arithmetic

The constants i and j both represent the imaginary unit. They cannot be reassigned. Real and imaginary components each use 64-bit floating-point arithmetic.

Input Result
i*i -1
z = 2 + 3*i 2 + 3*i
z^2 -5 + 12*i
conj(z) 2 - 3*i
z*conj(z) 13
real(z) / imag(z) 0.666666666666667
sqrt(-1) i
complex(2,3) 2 + 3*i

Components, magnitude, and phase

real(z) and imag(z) extract components. conj(z) (or conjugate(z)) takes the conjugate. abs(z) is the magnitude, and arg(z) (or phase(z)) is the phase in radians. phase(0) is defined as 0 in Symbraix. complex(a,b) constructs a + i*b from real inputs and broadcasts over vectors and matrices.

Branches are a deliberate convention

Complex square roots, logarithms, non-integer powers, and inverse functions return a principal value, not every possible value. For example, ln(-1) returns approximately pii and sqrt(-4) returns 2i. A negative real input can therefore produce a complex answer instead of a domain error.

Use an explicit small positive or negative imaginary component to approach either side of a branch cut. Exactly zero imaginary components are normalized to real values; signed-zero branch-side distinctions are not preserved in stored results. Tiny nonzero components are not silently discarded.

Integer powers use repeated multiplication, so i^2 is exactly -1. Expressions such as exp(i*pi) can retain a tiny imaginary rounding residual. cbrt(-8) returns the real cube root, -2; a genuinely complex input uses a principal cube-root value.

Complex numbers are not ordered. min, max, minimum, maximum, floor, ceil, round, sign, and % require real inputs. Select abs, real, or imag first when that is the operation you intend.

Vectors and broadcasting

Use vec(1,2,3), vector(1,2,3), array(1,2,3), or [1,2,3]. Elements can be real or complex. A vector is rank one. When it broadcasts against a matrix, it aligns with the matrix columns. Use reshape(v,n,1) to make an explicit column matrix.

Input Result
[1,2,3] + [1,2,3] [2, 4, 6]
[1,2,3]*2 + 1 [3, 5, 7]
sqrt([1,4,9]) [1, 2, 3]
[1+i,2-i] + i [1 + 2*i, 2]
[1,2,3] * [4,5,6] [4, 10, 18]
dot([1,2,3],[4,5,6]) 32
norm([3*i,4]) 5
linspace(0,1,5) [0, 0.25, 0.5, 0.75, 1]
arange(1,5) [1, 2, 3, 4]

Elementwise is the default

Arithmetic and ordinary scientific functions act on each element. A scalar or a length-one vector expands across the other vector. Otherwise lengths must match. Empty vectors are supported where the operation is defined. A shape error explains incompatible lengths.

Two different inner products

dot(a,b), or a @ b, sums a[k]b[k] without conjugation. vdot(a,b) sums conj(a[k])b[k]. Both require equal-length vectors and do not broadcast. This follows the NumPy distinction, not MATLAB's default complex dot convention.

a = [1+i, 2]
dot(a,a)     -> 4 + 2*i
vdot(a,a)    -> 6

Access and combine elements

Indexing starts at zero: [10,20,30][0] is 10 and [10,20,30][-1] is 30. concat joins vectors. diff returns successive differences; cumsum returns running sums. cross accepts two three-element vectors. Matrix rows and entries are described on the next page. Slices are not supported.

Matrices and elementwise calculations

Use [1,2;3,4] or [[1,2],[3,4]] for a two-row, two-column matrix. Inside brackets, semicolons separate rows and commas separate entries. Outside brackets, semicolons separate statements. All rows must have the same nonzero length. mat([1,2],[3,4]) is another spelling. Each entry may be real or complex.

Input Result
A = [1,2;3,4] [[1, 2], [3, 4]]
A + 10 [[11, 12], [13, 14]]
A * A [[1, 4], [9, 16]]
A @ A [[7, 10], [15, 22]]
A^2 [[1, 4], [9, 16]]
[i,2*i;3*i,4*i]^2 [[-1, -4], [-9, -16]]
sqrt([1,-1;4,-4]) [[1, i], [2, 2*i]]

Keep elementwise and matrix operations distinct

The operators +, -, *, /, ^ and ** act entry by entry. This keeps the vector rules consistent. Use @ or matmul(A,B) for a matrix product, and mpow(A,n) for an integer matrix power. A^-1 is entrywise reciprocal, not the inverse; use inv(A). sin(A) and exp(A) are entrywise functions, not matrix sine or matrix exponential.

Broadcast by shape, not by guesswork

Shapes align at their trailing dimension. A matrix with two columns can add [10,20] to each row. A column matrix [[10],[20]] adds 10 to the first row and 20 to the second. A dimension may expand only when its length is 1. For row-specific factors, write reshape([10,20],2,1). Mismatched dimensions produce an error.

Select, reshape, and copy

A[0,1] selects row 0, column 1. A[1] selects the second row; A[-1,-1] selects the last entry. row(A,r) and col(A,c) return vectors. shape(A), rows(A), and cols(A) inspect dimensions. reshape and flatten use row-major order. The screen displays matrix rows separately; Copy Result returns a complete nested-array expression.

Linear algebra

Matrix multiplication accepts matrix-matrix, matrix-vector, and vector-matrix inputs with matching inner dimensions. A pair of vectors produces an unconjugated dot product. Scalars use *, not @. All these operations support complex entries.

Input Result
det([1,2;3,4]) -2
inv([1,2;3,4]) [[-2, 1], [1.5, -0.5]]
solve([3,1;1,2],[9,8]) [2, 3]
mpow([1,2;3,4],2) [[7, 10], [15, 22]]
rank([1,2;2,4]) 1
norm([3*i,0;0,4]) 5
trace([1,2;3,4]) 5
vdot([i,0;0,1],[i,0;0,1]) 2

Transpose is not the conjugate transpose

transpose(A) swaps rows and columns without conjugating. adjoint(A), also named ctranspose(A), conjugates as it transposes. conj(A) conjugates entries without transposing. vdot(A,B) flattens both arrays and conjugates the first; it requires equal total element counts. A rank-one vector remains rank one under transpose. Reshape it to a row or column matrix when orientation matters.

Solve first; invert only when you need the inverse

solve(A,b) solves A @ x = b for a square, nonsingular A. The right-hand side may be a vector or a matrix of multiple columns. Use it instead of inv(A) @ b when the solution is your goal. A singular system reports an error; this version does not solve rectangular least-squares problems.

det, inv, solve, rank, and mpow limit dense dimensions to 128. Near-singular pivot warnings are heuristic, not a condition-number estimate. rank uses pivoted elimination and an optional absolute tolerance, not an SVD. The default tolerance is max(rows,cols)epsmax(abs(entries)). Check residuals and problem conditioning before relying on sensitive results.

Other tools include eye/identity, zeros(r,c), ones(r,c), diag, outer, kron, hstack, and vstack. hstack/vstack require matrix arguments; reshape vectors explicitly. mpow accepts integer exponents, including negative values for invertible matrices. Work limits can reject a long compound calculation even when each matrix fits.

Function reference

Unless specified otherwise, ordinary mathematical functions accept a scalar or apply element by element to a vector or matrix, including complex entries. Function names are lowercase. Higher-rank arrays, measured quantities, and symbols have the explicit supported operations described in pages 13-17.

Family Functions and conventions
Trigonometry sin, cos, tan; asin, acos, atan. Inputs and inverse-function outputs use radians. sind, cosd, tand use degrees for their inputs.
Hyperbolic sinh, cosh, tanh; asinh, acosh, atanh.
Roots and powers sqrt, cbrt, pow(x,y). The operators ^ and ** also raise to a power.
Exponentials and logs exp, expm1; ln, log, log_e; log10, log_10; log2; log1p. log(x,base) selects a base. expm1(x) and log1p(x) are designed for accuracy near zero.
Complex components complex(real,imag), real, imag, conj or conjugate, abs, arg or phase.
Real-only tools floor, ceil, round, sign, atan2(y,x), hypot(x,y), minimum(a,b), maximum(a,b). round uses ties to even; round(2.5) is 2.
Angle conversion radians and degrees multiply by the corresponding conversion factor.
Vector construction vec, vector, array; zeros(n), ones(n); arange(stop), arange(start,stop), arange(start,stop,step); linspace(start,stop,count); concat(v1,v2,...).
Vector reductions sum, mean, prod, len, norm; min and max require real entries. Matrix reductions cover every entry; len(A) returns the row count. norm(A) is Frobenius, not spectral.
Vector operations dot, vdot, cross, diff, cumsum. For vectors, @ is bilinear dot; when a matrix is present, @ performs matrix multiplication. diff and cumsum remain vector-only.

Sequence boundaries

arange excludes its stop value; its step cannot be zero. linspace includes both endpoints when count is at least 2; count 1 returns only the start and count 0 returns an empty vector. Floating-point steps may produce surprising boundaries; use linspace when endpoint inclusion matters.

sum([]) is 0, prod([]) is 1, and norm([]) is 0. mean, min, and max require at least one element. Zero to the zero power is defined as 1. Division by zero and logarithms of zero report an error rather than an infinity.

Additional scientific tools

These functions extend the numerical calculator without adding a keypad or changing its expression-first workflow. Elementwise functions also accept complex matrices when their mathematical domain allows it.

Family Functions and conventions
Combinatorics factorial / fact for integers 0 through 170; comb(n,k) and perm(n,k), with 0 <= k <= n <= 100000. Results are floating-point, not arbitrary-precision integers.
Integer arithmetic gcd(a,b), lcm(a,b). Integer input magnitudes must be at most 2^53; lcm rejects results outside that exact range.
Statistics variance / var, std, rms, median, quantile, sort. Matrix entries are flattened. variance/std accept an optional ddof, default 0; use 1 for sample normalization.
Complex statistics variance and std use squared magnitudes of deviations. rms uses magnitudes. median, quantile, and sort require real input; choose real, imag, or abs explicitly for complex data.
Extra trigonometry sec, csc, cot; asind, acosd, atand return degrees. sinc(z) means sin(piz)/(piz), with sinc(0)=1. percent(x) divides by 100.
Programmer tools bitand, bitor, bitxor, bitnot, shl and shr use unsigned 32-bit integers. Shifts accept counts 0 through 31; left shift wraps within 32 bits. Results display in decimal.
Input Result
comb(10,3) 120
median([1,8,2,4]) 3
var([1,2,3],1) 1
0xff + 0b10 + 0o10 265
bitand(0xff,0x0f) 15

Quantiles use linear interpolation on sorted entries, with probabilities from 0 to 1. sort returns a flat sorted vector. Base-prefixed literals use 0x (hexadecimal), 0b (binary), or 0o (octal). Literal integer values must fit within the exact binary64 range. ^ always means power, never bitwise XOR.

Precision and safe boundaries

Numerical components use IEEE-754 binary64, about 15 to 16 significant decimal digits. Symbolic coefficients can instead be exact checked 64-bit rational numbers, not arbitrary-precision integers. The screen normally shows 15 significant digits; numerical Copy Result uses a round-trip representation.

Small contributions can disappear

2^53 + 1

At this scale, adjacent representable values are no longer one unit apart. The result can round back to 2^53. Warnings flag some large-value, lost-contribution, and underflow cases, but they are not complete error bounds. Extra printed digits do not recover lost accuracy.

Likewise, sqrt(8)^42/100 is roughly 9.22e16. Adding several units to a value this large cannot be represented reliably by binary64. Reformulate the calculation or use a validated higher-precision tool when those units matter.

Finite results and understandable errors

Overflow, division by zero, undefined names, incompatible array shapes, invalid syntax, and exceeded resource limits show an error near the input. Edit the expression and try again. Your previous successful values are preserved. Expressions cannot execute Python, shell commands, file operations, or arbitrary code.

Limit Value
Input length per submission 16,384 characters
Vector / matrix size 100,000 total elements; matrices non-empty
Named variables 64
Elements across stored variables 500,000
Retained worksheet 1,000 entries / 200,000 result elements
Serialized saved session 16,000,000 bytes
Dense factorization dimensions At most 128 rows and 128 columns
Per-submission work budget 10,000,000 charged work units

Parser-depth and work limits prevent unbounded calculation. A storage warning means the latest state was not saved. Reduce stored data before relying on relaunch recovery.

What this version does not do

This version does not provide a full computer algebra system, symbolic integration or tensor geometry, arbitrary-precision arithmetic, RPN, user-defined function declarations, general nonlinear solving, or Python/MATLAB execution. Units and uncertainty are real-scalar features; plots are two-dimensional sampled snapshots.

Sessions, privacy, and recovery

Local by design

We save variables, the last result, the worksheet, and the unfinished input locally. Out[n] references survive normal relaunch. Older preview-only history can be reevaluated for reusable values. Save and Open preserve separate snapshots in files you choose; opening does not execute their expressions.

Symbraix has no account system, advertising, analytics SDK, cloud sync, or calculation network service. Apple manages purchases and any operating-system diagnostics you choose to share. Copy Result uses the system clipboard only when requested; other apps and system clipboard features may access copied content.

Clear or remove your calculations

Choose New in the header or File menu, or press Command-N. Confirm when the chain is not empty. This clears variables, ans, results, numbering, errors, and the input draft. It keeps window and appearance preferences. The reset cannot be undone and does not erase exported files, clipboard data, or your backups.

To remove the app, first clear the session if you also want the saved calculations removed, then quit and move the application to Trash using Finder. Removing the app alone may leave its local data and preferences for a later reinstall. No separate self-uninstaller is included.

Troubleshooting

What you notice What to do
The calculator is not visible. Use the menu-bar entry, Dock icon, or Window > Show Symbraix. Turn Keep on Top back on if you disabled it. Explicit Hide, Close, or Minimize still hides the window.
A result looks truncated. Scroll the result. Vectors preview up to 64 elements; matrices preview up to 6 rows and 8 columns. Copy Result includes every entry at full stored precision. A large copied literal may exceed the 16,384-character input limit.
A saved session cannot be loaded. The existing file is left untouched. Do not clear it if you need to recover its contents. Preserve your local data before seeking support; New explicitly replaces it.
A result differs after history recall. History recalls the expression, not a snapshot of all its former variables. Pressing Return uses the variables currently stored.
I need reference help offline. Open Help > Symbraix User Guide or Help > Examples & Reference. Privacy Policy is also available from Help.

Text editing uses standard Mac selection, Copy/Paste, Undo, and Redo. Undo applies to editing, not completed calculations or New. Save a useful chain before resetting it. Remove sensitive calculations before sharing a chain or support report.

Units and dimensional consistency

Use quantity(value,"unit") for an exact unit-aware value. Use measure(value,standardUncertainty,"unit") for a measurement. Unit names are quoted, case-sensitive, and separate from variable names. These are real-scalar quantities, not arrays of units or complex measurements.

Input Result
convert(quantity(2,"m"),"cm") 200 cm
quantity(1,"m")+quantity(25,"cm") 1.25 m
quantity(6,"m")/quantity(2,"s") 3 m*s^(-1)
convert(quantity(90,"deg"),"rad") 1.5707963267949 rad

Construct units explicitly

Write products, quotients, and powers inside the quotes: "kg*m/s^2", "m^2", or "m/s". SI base units, SI prefixes, and common derived units such as N, Pa, J, W, Hz, V, ohm, and T are recognized. Selected practical units include min, h, day, L, in, ft, yd, mi, lb, oz, bar, atm, and eV. Use u for the micro prefix.

force = quantity(2,"kg") * quantity(3,"m/s^2")
convert(force,"N")

The result is 6 N. Multiplication and division calculate in canonical SI units; convert chooses a compatible display unit. Addition retains the left-hand display unit. Adding a length to a time is an error, not an implicit conversion.

Extract values deliberately

valueof(q) returns the nominal number in the displayed unit and removes its unit information. nominal(q) keeps the units but removes uncertainty. sigma(q) returns the numerical standard uncertainty in the displayed unit; stdunc(q) keeps those units. Converting a display unit does not change the underlying quantity.

Angles use rad or deg; trigonometric quantity functions convert to their dimensionless SI argument. Offset temperatures such as Celsius and Fahrenheit are intentionally rejected. Use K; automatic offset-versus-interval temperature arithmetic is not implemented. Parentheses can group unit products; implicit products are not supported.

Uncertainty and correlation

The second argument of measure is a standard uncertainty, not a percentage, guaranteed error bound, or confidence interval. The engine propagates first-order derivatives and preserves shared uncertainty sources. Two separate measure calls create independent sources.

Input Result
a=measure(2,0.1,"m"); a+a 4 +/- 0.2 m
sigma(a-a) 0
b=correlated(3,0.2,a,0.5,"m"); correlation(a,b) 0.5
sigma(measure(2,0.1)-measure(2,0.1)) 0.14142135623731

A measured area

length = measure(2,0.01,"m")
width = measure(30,0.2,"cm")
convert(length*width,"m^2")

This gives 0.6 +/- 0.005 m^2. The two measurements are independent here. Reusing the same variable is different from entering a second measurement with the same numerical value.

Keep the dependency, not just the printed answer

Assignments, Out[n], normal relaunch, and Save/Open preserve source identity and therefore correlation. Copying a measurement to plain text and pasting it creates a new independent measure call. Use an Out[n] reference when the original measurement is intended.

correlated(value,sigma,reference,rho,"unit") constructs a measurement with the specified correlation to a reference, for -1 <= rho <= 1. covariance(a,b) retains product units; correlation(a,b) is dimensionless. The source model supports up to 128 independent sources, not arbitrary covariance-matrix input.

Know where linearization stops

Uncertainty is approximated by a local first-order expansion, including covariance. It can be misleading for strongly nonlinear functions, large uncertainties, or near singularities. Warnings are safeguards, not complete validity tests. No Monte Carlo, second-order correction, or distribution-specific coverage probability is computed.

Supported measured operations include arithmetic, fixed real powers, sqrt, abs, trigonometric and hyperbolic functions, exp, and logarithms where their real domains and derivatives are defined. Unsupported functions or nondifferentiable operating points report an error instead of silently dropping uncertainty.

Basic symbolic algebra

Quote an expression to keep it symbolic, or construct it with sym. Undefined unquoted names still report an error, so a typing mistake does not silently create a symbol. Symbolic expressions resolve current numerical variables only when evaluate is called.

Input Result
simplify("2*x+3*x") 5*x
expand("(x+1)^2") (2*x + x^2 + 1)
factor("x^2-1","x") (x + 1)*(x - 1)
differentiate("x^3+2*x","x") (3*x^2 + 2)
evaluate("x^2+1","x",[1,2,3]) [2, 5, 10]
roots("x^2-5*x+6","x") [2, 3]

Build, substitute, evaluate

s = sym("x^2 + y")
s = substitute(s,"y",3)
evaluate(s,"x",2)

The final result is 7. sym("x") is a reusable symbolic value. Numerical evaluation accepts scalar or array bindings and the existing complex conventions. A symbolic value cannot recursively serve as its own numerical binding.

Exact coefficients, bounded scope

Decimal coefficients typed inside a quoted symbolic expression become exact rational coefficients when they fit checked 64-bit integers. This is not arbitrary precision. Passing an already evaluated numerical scalar preserves its floating-point representation instead. Overflow and expression-size limits report errors.

The subset supports combining polynomial terms, expansion, restricted univariate factoring, substitution, and differentiation of supported elementary functions. factor extracts integer roots from -100 through 100 for polynomials of degree up to 8; it can leave an unfactored residual. roots solves linear or quadratic polynomials numerically, including complex roots, not general equations.

The system avoids unconditional x/x cancellation and does not replace sqrt(x^2) with x. Original domains still apply after a transformation, and displayed warnings flag domain-sensitive expressions. This is not a full algebra system, assumption solver, symbolic matrix package, or integration engine.

Numerical tensor contractions

tensor(data,shape) reshapes numerical entries into a dense row-major array. Ranks 3 through 6 extend the same real/complex values used by vectors and matrices; rank 1 and rank 2 keep their ordinary representations. Arrays contain at most 100,000 entries.

Tn = tensor(arange(8),[2,2,2])
einsum("ijk,k->ij",Tn,[1,2])

The contraction produces [[2, 8], [14, 20]]. Each quoted label names an axis; labels omitted from the explicit output are summed. Index labels are separate from the calculator constant i.

Input Result
A=[1,2;3,4]; einsum("ij,jk->ik",A,A) [[7, 10], [15, 22]]
einsum("ii->",A) 5
einsum("i,j->ij",[1,2],[3,4]) [[3, 4], [6, 8]]
u=[1+i,2]; einsum("i,i->",conj(u),u) 6

Explicit rules, no hidden tensor mode

An einsum expression requires ->, up to eight inputs, and one ASCII letter per axis. Repeated labels must have equal sizes, including repeated labels on the same operand. There is no ellipsis, implicit index broadcasting, automatic conjugation, or implicit metric. Write conj explicitly for a Hermitian contraction.

Elementwise arithmetic and supported scientific functions broadcast along trailing dimensions in the usual array sense. shape(Tn) inspects dimensions; flatten(Tn) returns a vector. permute(Tn,[2,0,1]) reorders axes. reshape accepts an explicit shape vector. A full index such as Tn[1,0,1] returns one entry; a prefix index returns the remaining subarray. Negative indices are supported; slices are not.

Numerical arrays, not geometric tensors

These untyped commands contract stored numbers without assigning index variance or barred kind. For explicit geometric index types, metrics, raising/lowering and changes of frame, use the indexed commands on pages 20-22. General abstract tensor calculus remains outside this version.

Use einsum for higher-rank contractions, not @. For a reduction unsupported directly on a higher-rank tensor, flatten it explicitly. Contractions are work-budgeted and may reject large operations even when the individual arrays fit in memory.

Plot a calculation

A plot is a saved worksheet result, not a continuously running graph. It keeps the sampled numbers at the moment of evaluation. Changing a variable later does not change an earlier plot. The visible plot can be collapsed when you need space for calculations.

Plot arrays you have already calculated

t = linspace(0,10,500)
y = exp(-0.3*t)*cos(2*pi*t)
plot(t,y,"Damped oscillation")

plot draws lines; scatter draws points; logplot starts with a logarithmic y axis. A matrix y supplies one curve per row, with up to eight curves. The x vector and each row must have matching lengths, from 2 through 10,000 samples.

Sample a symbolic expression

plot(sym("sin(x)"),"x",-pi,pi,401)

This form samples a supported symbolic expression on a uniform grid. The count is optional (401 by default, 2-2,000 allowed). Nonreal or domain-invalid samples become gaps. Unknown variables, unsupported functions, and exhausted work limits remain errors.

Complex plane and axis controls

theta = linspace(0,2*pi,500)
z = exp(i*theta)
plot(real(z),imag(z),"Unit circle")

Enable Equal scale to give equal distances on the linear axes equal screen lengths. Log X and Log Y are separate controls; equal scale is unavailable while either is logarithmic. Nonpositive log samples are omitted with a visible count. Complex values are never silently reduced to their real parts: choose real, imag, abs, or arg explicitly.

Copy or export the figure

Copy SVG places the figure on the clipboard. Export saves an SVG file in the location you choose. SVG is a vector format suitable for resizing; the current plot data and selected axes are used. Exported files are not erased by New.

Sampling cannot guarantee that a narrow feature or discontinuity is detected. A pole exactly on a sample can create a gap, but a pole between samples can still be connected. Inspect the function and choose a suitable domain and sampling density. There is no adaptive plotting, 3D plotting, unit-aware axis conversion, or uncertainty-band plot in this version.

New, Open, and Save

The current chain autosaves locally. Save gives you a separate, explicitly named snapshot; Open replaces the active chain after confirmation. There is one active chain, not a multi-document workspace.

Action Behavior
New / Command-N Clear the active chain, after confirmation when nonempty.
Save / Command-S Choose a file for a complete snapshot.
Open / Command-O Choose a saved chain and confirm replacement.
Cancel any file panel Keep the current calculation unchanged.

What is preserved

Saved JSON contains variables, full retained result values, expressions, result identifiers, plot data, unit metadata, uncertainty source identities, and the unfinished draft. Opening restores these values without executing their source expressions. A malformed, oversized, or incompatible file reports an error without replacing the active chain. The current open-file limit is 16 MB.

Window position, pinning, and appearance belong to the app, not the chain file. New resets variables, ans, worksheet entries, result numbering, errors, and the input draft; the next result is Out[1]. It does not reset the window or delete saved files. There is no undo for New, so save important work first.

Privacy and portability

Saved chains are readable JSON, not encrypted documents. Their calculations may be sensitive. Share them deliberately and keep your own backups. File access is limited to the app container and files you choose through the system panels; no account or network service is needed.

Candidate 07 restores earlier compatible sessions. Chains with indexed tensors and metrics require Candidate 06 or a later compatible version. Older candidates cannot read those new value types. Complete-command history is preserved; older sessions recover the individual history entries they actually saved.

A few deliberate limits

Symbolic expressions are limited to 512 nodes; expansion is limited to 256 terms. General symbolic integer powers are bounded to magnitude 32, and expansion to nonnegative powers through 16. Measurement propagation supports 128 independent sources. Stored worksheet entries share the existing aggregate limits, so save important intermediate work before old entries are evicted.

Calculations are transactional: an error in a batch commits no assignments, values, or plots from that batch. This is a reproducible numerical scratchpad with explicit advanced commands, not a general scripting language or a complete replacement for a numerical programming environment.

Recall complete commands

Press Up in an empty or single-line input to retrieve the last successful submission. Repeated Up steps backward. Down steps forward and, after the newest command, restores the unfinished draft you were editing.

x = 4; y = 7; x+y**2

After this gives 53, Up retrieves the whole line, not only x+y**2. A multiline submission is recalled as one block as well. Evaluation still uses the current variables, so a repeated command may give a different result.

Keep multiline editing natural

Within a multiline draft, ordinary Up and Down move the caret. At the first logical line, Up recalls an older command; at the last logical line, Down recalls a newer command. A whole-field selection also permits recall. A partial selection retains ordinary selection movement. Soft-wrapped segments belong to the same logical line.

Action Result
Up at the top / Down at the bottom Recall older / newer submissions
Option-Up / Option-Down Force recall regardless of caret line
Shift-Return Insert a new line without evaluating
Return Evaluate the entire current input
Down beyond the newest command Restore the saved unfinished draft

What history remembers

We keep up to 256 successful command submissions, subject to a combined text limit. Failed submissions do not become history. New clears it. Save/Open preserves it. Older saved sessions did not retain original submission boundaries, so they restore only the individual entries they actually contain.

Indexed tensors and metrics

A numerical array does not, by itself, say how its axes transform. Use indexed to attach ordered index types. Each slot records a space/frame, upper or lower variance, and barred or unbarred kind. Tensors remain numerical: this section does not declare abstract symbolic tensor fields.

v = indexed([3,2],"^a")

Here ^ means contravariant (upper); _ means covariant (lower). The default space/frame is V. Write _~a for a barred lower slot. A signature such as "^a:V _b:W" makes distinct spaces explicit. Matching dimension is not enough to identify two spaces.

A Lorentz-signature example

Input Result
g=metric([-1,0;0,1]);v=indexed([3,2],"^a");components(lower(v,0,g)) [-3, 2]
contract("a,a->",v,lower(v,0,g)) -5
components(raise(lower(v,0,g),0,g)) [3, 2]

Axes are numbered from zero. A symmetric bilinear metric may be indefinite. The constructor checks symmetry, dimensions and nonsingularity; it does not impose positive definiteness.

Contractions do not guess

contract pairs one upper and one lower occurrence of each dummy label, in the same space/frame and bar kind. Free labels occur once and must appear in the output. An extra or mismatched label reports an error. No metric is silently inserted. The argument labels select axes in order; slot metadata supplies the geometric types.

For raw component operations, use components(T) explicitly and then the ordinary array functions or einsum. Tensor multiplication uses tproduct; typed addition requires identical ordered slot types. Nonlinear elementwise functions do not silently preserve a geometric tensor type.

Hybrid indices and Hermitian metrics

A bar and an upper/lower position mean different things. Following the distinction used in Schouten-style complex tensor notation, barred and unbarred slots belong to conjugate kinds. A barred upper slot is still contravariant.

v = indexed([1+i,2],"^a")
conj(v)

conj conjugates the components and changes ^a to ^~a. It does not lower the index. Calling conj twice returns the original component values and slot kinds.

State the metric convention explicitly

A Hermitian metric in our syntax has ordered slots (_~a, _b), corresponding to the matrix H in conjugate(u)^T H v. Its inverse has upper slots (^a, ^~b). H must equal its conjugate transpose and be nonsingular, but may be indefinite.

Input Result
h=metric([2,i;-i,3],"V","hermitian");v=indexed([1+i,2],"^a");tinner(v,v,h) 20
components(lower(v,0,h)) [2 + 4*i, 7 - i]
components(raise(lower(v,0,h),0,h)) [1 + i, 2]

Metric duality is not conjugation

With a bilinear metric, raising or lowering changes variance but preserves bar kind. The conjugate metric acts on barred slots. With our Hermitian convention, raising or lowering changes variance and bar kind; it does not independently conjugate the input components. tinner explicitly conjugates its first operand for a Hermitian metric, and not for a bilinear metric.

Neither a component transpose nor a conjugate transpose should be mistaken for raising or lowering an index. Use permute or transpose to reorder typed slots, conj to conjugate, and raise/lower for metric duality.

Change frames and preserve types

changebasis(T,M,"V","W") defines upper components in the new frame by v_new = M v_old. Lower components transform by inverse(transpose(M)). Barred slots use the complex-conjugated corresponding map. Every affected slot is transformed; the target frame is distinct from the source.

Input Result
v=indexed([1,2],"^a");components(changebasis(v,[2,1;0,1],"V","W")) [4, 2]
w=indexed([1,2],"_a");components(changebasis(w,[2,1;0,1],"V","W")) [0.5, 1.5]
Tn=indexed([1,2;4,8],"_a _b");components(symmetrize(Tn)) [[1, 3], [3, 8]]
components(antisymmetrize(Tn)) [[0, -1], [1, 0]]

symmetrize and antisymmetrize average over permutations with the appropriate sign. Choose axes explicitly with a second vector argument. Selected slots must share dimension, space/frame, variance and barred kind. These are component projections, not an abstract tensor canonicalizer.

Command reference

indexed, components, signature, metric, metrictensor, inversemetric, raise, lower, contract, tproduct, tinner, changebasis, symmetrize and antisymmetrize. conj, transpose and permute also preserve the appropriate typed metadata.

Scope and saved work

Typed tensors support at most six slots and share the numerical engine limits. Metrics and basis maps use the dense linear-algebra limits. Values and types survive normal session restoration and Save/Open. Full abstract dummy-index canonicalization, symbolic tensor fields, covariant derivatives, connection coefficients and curvature are not yet commands in this version.

Research references and development goals

Typed tensors support at most six slots and share the numerical engine limits. Metrics and basis maps use the dense linear-algebra limits. Values and types survive normal session restoration and Save/Open. Full abstract dummy-index canonicalization, symbolic tensor fields, covariant derivatives, connection coefficients and curvature are not yet commands in this version.

Our research examples and tensor-development requirements draw on the following works supplied by Bruce H. Dean. They are references for mathematical conventions and future verification, not a claim that every calculation in either work has been reproduced in Symbraix.

Hamilton's equations in unitary form

Bruce H. Dean. Hamilton’s equations in unitary form. Manuscript dated September 17, 2026. Supplied as H1-SSRN.pdf, 13 pages. Section IV introduces the complex phase-space variables and Schouten’s barred-index notation. Sections V and VI provide transformation and harmonic-oscillator examples.

The paper cites J. A. Schouten, Ricci-Calculus, 2nd edition (Springer-Verlag, Berlin, 1954), p. 51, and Tensor Analysis for Physicists, 2nd edition (Clarendon Press, Oxford, 1954; Dover reprint, 1989), pp. 240–244 and 250. These identify the notation sources; the current calculator uses explicit keyboard signatures for upper/lower and barred/unbarred slots.

Gauge gravity and orbital dynamics

Bruce Herold Dean. Variational Results and Solutions in Gauge Gravity and a Bifurcation Analysis of Black Hole Orbital Dynamics. Ph.D. dissertation, West Virginia University, 1999. Supplied as 859.1.dissertation.pdf, 232 PDF pages. Chapters 2–4 and Appendices A, B and E establish tensor and variational targets. Chapters 5–6 and Appendix G establish orbital-dynamics targets.

The dissertation records Mathematica 3.0 and MathTensor 2.2 for its specialized tensor work. Symbraix does not bundle those products or translate their proprietary implementation. Its current typed tensors perform numerical component operations; general abstract canonicalization, tensor fields, covariant derivatives, curvature and variational calculus remain development work.

Verification discipline

A reproduced result must identify the source equation, index order, sign and conjugation conventions, the Symbraix input, and the expected output. Source-derived statements and independently verified calculations must remain distinguishable. Unresolved convention questions must be recorded, not silently reconciled.