2026-04-19 observation 5 min read

exp(−x) and the Five-Operator Barrier

The negative exponential appears in almost every physics law. It is blocked for 1-node construction in EML and four related operators. DEML is the operator that breaks through.

Correction (2026-09-13): the table defined EMN as exp(x) − ln(−y). On this site EMN is ln(y) − exp(x), the negation of EML (the census, /theorems T24 and the glossary); exp(x) − ln(−y) is EMLn, operator F2 on /framework. Neither gives exp(−x) in one node, so the verdict stands, and the table now checks both. The post also said EML alone contains exp(−x) at depth 3. No EML tree of depth at most 3 over {1, x} comes within 0.33 of it. The check is printed below.

Why exp(−x) matters

exp(−x) is not an exotic function. It is the backbone of physics:

Under the EML operator eml(x, y) = exp(x) − ln(y), constructing exp(−x) in a single node requires presenting −x as input. But −x is not available from the grammar starting at {1} without spending nodes to negate first.

The five-operator check

We checked the five operators in the EML family, plus EMLn, for 1-node exp(−x) construction:

Operator Definition 1-node exp(−x)?
EML exp(x) − ln(y) blocked
EDL exp(x) / ln(y) blocked
EXL exp(x) · ln(y) blocked
EAL exp(x) + ln(y) blocked
EMN ln(y) − exp(x) blocked
EMLn (F2) exp(x) − ln(−y) blocked
DEML exp(−x) − ln(y) ✓ one node

DEML: the complementary operator

deml(x, y) = exp(−x) − ln(y). Setting y = 1:

deml(x, 1) = exp(−x) − ln(1) = exp(−x) − 0 = exp(−x)

One node. Every decay law in physics expressible in a single EML-family operation.

DEML and EML are complementary operators. EML handles the forward exponential; DEML handles the decay direction. Together they cover the full exponential family without requiring negation as a separate node.

Expressiveness vs. efficiency

DEML adds efficiency, not expressiveness. By the published universality result (T01) some finite EML tree equals exp(−x), but none is small: no EML tree of depth at most 3 over {1, x} comes within 0.33 of it on [0.5, 3], and no smaller tree is written down. DEML gives it in one node. This is the motivation for the BEST routing system — choosing the cheapest operator for each primitive, rather than forcing everything through EML.

Reproduce

Every 1-node tree over the leaves 1 and x for each operator in the table, and every EML tree of depth at most 3, compared with exp(−x) on 26 points of [0.5, 3]:

import itertools, numpy as np                         # pip install numpy
np.seterr(all='ignore')
x = np.linspace(0.5, 3.0, 26); target = np.exp(-x)
ops = {'EML  exp(x) - ln(y)': lambda a, b: np.exp(a) - np.log(b), 'EDL  exp(x) / ln(y)': lambda a, b: np.exp(a) / np.log(b),
       'EXL  exp(x) * ln(y)': lambda a, b: np.exp(a) * np.log(b), 'EAL  exp(x) + ln(y)': lambda a, b: np.exp(a) + np.log(b),
       'EMN  ln(y) - exp(x)': lambda a, b: np.log(b) - np.exp(a), 'EMLn exp(x) - ln(-y)': lambda a, b: np.exp(a) - np.log(-b),
       'DEML exp(-x) - ln(y)': lambda a, b: np.exp(-a) - np.log(b)}
leaves = {'1': np.ones_like(x), 'x': x}
for name, f in ops.items():                            # every 1-node tree over the leaves 1 and x
    errs = [np.max(np.abs(f(a, b) - target)) for a in leaves.values() for b in leaves.values()]
    errs = [e for e in errs if np.isfinite(e)]
    print(f'{name}: best 1-node max error', f'{min(errs):.3g}' if errs else 'undefined')
pool = dict(leaves); seen = {tuple(np.round(v, 9)) for v in pool.values()}
for depth in range(3):                                 # EML trees of depth <= 3 over {1, x}
    for (ta, a), (tb, b) in itertools.product(list(pool.items()), repeat=2):
        v = np.exp(a) - np.log(b); k = tuple(np.round(v, 9))
        if np.all(np.isfinite(v)) and k not in seen:
            seen.add(k); pool[f'eml({ta},{tb})'] = v
err, tree = min((float(np.max(np.abs(v - target))), t) for t, v in pool.items())
print(f'EML trees of depth <= 3: {len(pool)} distinct; best max error {err:.3g}, by {tree}')

Output:

EML  exp(x) - ln(y): best 1-node max error 2.67
EDL  exp(x) / ln(y): best 1-node max error undefined
EXL  exp(x) * ln(y): best 1-node max error 0.607
EAL  exp(x) + ln(y): best 1-node max error 2.67
EMN  ln(y) - exp(x): best 1-node max error 3.32
EMLn exp(x) - ln(-y): best 1-node max error undefined
DEML exp(-x) - ln(y): best 1-node max error 0
EML trees of depth <= 3: 936 distinct; best max error 0.339, by eml(x,eml(eml(x,1),eml(1,x)))

Cite this work

Monogate Research (2026). "exp(−x) and the Five-Operator Barrier." monogate research blog. https://monogate.org/blog/negative-exponent

License

CC BY 4.0 — free to share and adapt with attribution. · Code: pip install monogate · Paper: arXiv:2603.21852