"The binary operator defined by \(\text{eml}(a, b) = \exp(a) - \ln(b)\) satisfies \(\text{eml}(x, 1) = \exp(x)\) for every complex number x."

mathematics · generated 2026-04-16 · v1.18.0
PROVED pure computation — no citations
Verified by computation — no external sources required.
Verified by Proof Engine — an open-source tool that verifies claims using cited sources and executable code. Reasoning transparent and auditable.
methodology · github · re-run this proof · submit your own

The identity holds exactly — not approximately, not in a limit, but as a straightforward algebraic fact.

What Was Claimed?

Someone defined a new two-input operator called "eml" that takes two numbers and returns the exponential of the first minus the natural logarithm of the second: eml(a, b) = exp(a) - ln(b). The claim is that when the second input is fixed at 1, this operator simply returns the exponential of the first input. In other words, eml(x, 1) = exp(x) for every complex number x.

This is the kind of identity that looks obvious once you see the trick — but the trick needs to be verified rigorously, especially when the claim extends to all complex numbers, where the logarithm has branch cuts and other subtleties.

What Did We Find?

The entire proof hinges on one fact: the natural logarithm of 1 is zero. When you plug b = 1 into the operator definition, you get eml(x, 1) = exp(x) - ln(1) = exp(x) - 0 = exp(x). That is the complete argument.

We verified this in two independent ways. First, using symbolic algebra (SymPy), we confirmed that ln(1) evaluates to exactly 0, and that the expression exp(x) - ln(1) - exp(x) simplifies to exactly 0 for a symbolic variable x. This is not a numerical approximation — the computer algebra system proves the identity holds in closed form.

Second, as a cross-check, we evaluated the operator numerically at five representative complex numbers: zero, a positive real number, a negative real number, a purely imaginary number (iπ), and a general complex number (2 + 3i). At every point, the difference between eml(x, 1) and exp(x) was exactly zero — not merely small, but identically zero to machine precision.

We also investigated whether the complex logarithm could introduce any surprises. The logarithm has branch cuts in the complex plane, but the point z = 1 sits safely on the positive real axis, far from any branch cut. Every standard branch of the complex logarithm gives ln(1) = 0.

What Should You Keep In Mind?

The identity is specific to b = 1. The operator eml(a, b) is not defined at b = 0 (since ln(0) is undefined), and for other values of b it does not simplify to exp(a). The proof says nothing about the operator's behavior at other values of its second argument.

The result is an algebraic certainty within the standard mathematical framework — it cannot be overturned by new data or different parameter choices. It is as definitive as proofs get.

How Was This Verified?

This claim was verified using the proof-engine framework, which requires every step to be executed by code rather than asserted by the AI. The symbolic derivation was performed by SymPy and independently cross-checked with numerical evaluation. The result being verified was originally established in A. Odrzywołek, "All elementary functions from a single binary operator" (arXiv:2603.21852, 2026); this proof was developed independently using different methods. For the full formal breakdown, see the structured proof report. For verification details including computation traces and adversarial checks, see the full verification audit. To reproduce the proof yourself, re-run the proof script.

What could challenge this verdict?

Three adversarial checks were investigated:

  1. Branch ambiguity of the complex logarithm. The principal branch Log(z) = ln|z| + i·Arg(z) gives Log(1) = 0. Since z = 1 lies on the positive real axis, far from the branch cut along the negative real axis, there is no branch ambiguity. All standard branches of the logarithm agree at z = 1.

  2. Well-definedness of the operator. The operator eml(a, b) has a singularity at b = 0 (ln(0) is undefined), but the claim fixes b = 1. The exponential function exp(x) is entire (defined for all complex x), and subtracting the constant ln(1) = 0 preserves this. The operator is well-defined for every complex x.

  3. Numerical precision. The symbolic computation uses SymPy's exact algebra engine, not floating-point arithmetic. The residual is symbolically zero — not approximately zero. The numerical cross-check is supplementary; the proof does not depend on it.

detailed evidence

Detailed Evidence

Evidence Summary

ID Fact Verified
A1 ln(1) = 0 (symbolic verification) Computed: True (ln(1) = 0 confirmed)
A2 eml(x, 1) - exp(x) = 0 (symbolic simplification) Computed: True (residual identically 0)
A3 Numerical spot-check at 5 complex points Computed: True (max residual = 0.00e+00)

Proof Logic

The claim defines a binary operator eml(a, b) = exp(a) - ln(b) and asserts that evaluating it at b = 1 yields exp(x) for every complex number x. The proof reduces to a single algebraic fact: ln(1) = 0.

Key identity (A1). The natural logarithm of 1 is 0. This holds for the principal branch of the complex logarithm: Log(z) = ln|z| + i·Arg(z), and since |1| = 1 and Arg(1) = 0, we get Log(1) = 0. SymPy confirms this symbolically.

Symbolic simplification (A2). Substituting b = 1 into the operator definition: eml(x, 1) = exp(x) - ln(1) = exp(x) - 0 = exp(x). The residual eml(x, 1) - exp(x) = exp(x) - ln(1) - exp(x) simplifies to exactly 0 for symbolic x (A2 depends on A1). This is an algebraic identity, not an approximation.

Numerical cross-check (A3). As an independent verification, the identity was evaluated numerically at five representative complex points: x = 0, 1, -3, iπ, and 2+3i. At every point, |eml(x, 1) - exp(x)| = 0.00 — exact agreement to machine precision. The symbolic result (A2) and numerical cross-check (A3) agree completely.

Conclusion

Verdict: PROVED. The identity eml(x, 1) = exp(x) holds for every complex number x. The proof rests on the algebraic fact that ln(1) = 0 (A1), which makes the residual eml(x, 1) - exp(x) identically zero (A2). Numerical evaluation at 5 complex points independently confirms exact agreement (A3).

audit trail

Claim Specification
Field Value
Subject Binary operator eml(a, b) = exp(a) - ln(b)
Property eml(x, 1) = exp(x) for all complex x
Operator ==
Threshold True
Operator Note The claim follows from ln(1) = 0, which holds in the principal branch of the complex logarithm. Substituting b = 1: eml(x, 1) = exp(x) - ln(1) = exp(x) - 0 = exp(x). This is an algebraic identity, not a limit or approximation. The proof verifies symbolically that exp(x) - ln(1) - exp(x) simplifies to 0 for symbolic x.

Source: proof.py JSON summary

Claim Interpretation

The claim defines a binary operator eml(a, b) = exp(a) - ln(b) and asserts that for every complex number x, eml(x, 1) = exp(x). This is a pure algebraic identity: substituting b = 1 gives exp(x) - ln(1), and since ln(1) = 0, the result is exp(x).

The formal interpretation uses exact equality (==) with threshold True. The operator_note documents the reasoning chain: ln(1) = 0 in the principal branch, substitution, and simplification. The proof verifies this symbolically via SymPy and numerically at representative complex points.

Formalization scope: The formal interpretation is a faithful 1:1 mapping of the natural-language claim. The operator eml is fully defined in the claim, the domain is all complex numbers, and the identity to verify is explicit. The only interpretive choice is using the principal branch of the complex logarithm, which is the standard convention and produces the unique value ln(1) = 0.

Attribution: This result was originally established in A. Odrzywołek, "All elementary functions from a single binary operator," arXiv:2603.21852 (2026). The proof presented here provides independent computational verification using symbolic algebra (SymPy) and numerical methods, and was developed without reference to the original proof.

Source: proof.py JSON summary

Computation Traces
  A1: ln(1) = 0: 0 == 0 = True
  A2: simplify(eml(x,1) - exp(x)) = 0: 0 == 0 = True
  x =            0  |eml(x,1) - exp(x)| = 0.00e+00
  x =            1  |eml(x,1) - exp(x)| = 0.00e+00
  x =           -3  |eml(x,1) - exp(x)| = 0.00e+00
  x = 3.141592653589793j  |eml(x,1) - exp(x)| = 0.00e+00
  x =       (2+3j)  |eml(x,1) - exp(x)| = 0.00e+00
  A3: numerical spot-checks at 5 complex points all < 1e-15: True == True = True
  All facts verified (symbolic + numerical): True == True = True

Source: proof.py inline output (execution trace)

Adversarial Checks

Check 1: Does ln(1) = 0 hold for the complex logarithm?

  • Question: Does ln(1) = 0 hold for the complex logarithm?
  • Verification performed: The principal branch of the complex logarithm is defined as Log(z) = ln|z| + iArg(z) where Arg is the principal argument in (-pi, pi]. For z = 1: |1| = 1, Arg(1) = 0, so Log(1) = ln(1) + i0 = 0. This holds regardless of branch cut conventions since z = 1 is on the positive real axis.
  • Finding: ln(1) = 0 holds universally for the principal branch of the complex logarithm. No branch ambiguity at z = 1.
  • Breaks proof: No

Check 2: Is the operator well-defined for all complex x?

  • Question: Is the operator well-defined for all complex x?
  • Verification performed: eml(x, 1) = exp(x) - ln(1). The exponential function exp(x) is entire (defined for all complex x). ln(1) = 0 is a constant. The subtraction of a constant from an entire function is entire. The only concern would be if b = 0 (since ln(0) is undefined), but the claim fixes b = 1.
  • Finding: eml(x, 1) is well-defined for every complex x. The operator eml(a, b) has a singularity at b = 0, but the claim only evaluates at b = 1.
  • Breaks proof: No

Check 3: Could numerical precision mask a nonzero residual?

  • Question: Could numerical precision mask a nonzero residual?
  • Verification performed: The symbolic computation uses SymPy's exact symbolic engine, not floating-point arithmetic. simplify(exp(x) - ln(1) - exp(x)) returns exactly 0, not an approximation. The numerical cross-check is supplementary — the proof rests on the symbolic result.
  • Finding: The symbolic residual is exactly 0 — no numerical precision issue can affect it. Numerical cross-checks confirm agreement to machine epsilon.
  • Breaks proof: No

Source: proof.py JSON summary

Quality Checks
  • Rule 1: N/A — pure computation, no empirical facts
  • Rule 2: N/A — pure computation, no empirical facts
  • Rule 3: N/A — proof is not time-sensitive; date.today() used only in generator metadata
  • Rule 4: CLAIM_FORMAL with operator_note present; documents the ln(1) = 0 reduction and principal branch convention
  • Rule 5: 3 adversarial checks: complex logarithm branch, well-definedness, numerical precision
  • Rule 6: N/A — pure computation, no empirical facts. Cross-check uses mathematically independent method (numerical evaluation vs. symbolic algebra)
  • Rule 7: All computations via SymPy (symbolic) and cmath (numerical); no hard-coded constants
  • validate_proof.py result: PASS — 16/16 checks passed, 0 issues, 0 warnings

Source: author analysis

references & relationships

Related work — context, sources, supplements

Used by — other proofs on this site that build on this one

Cite this proof
Proof Engine. (2026). Claim Verification: “The binary operator defined by eml(a, b) = (a) - (b) satisfies eml(x, 1) = (x) for every complex number x.” — Proved. https://doi.org/10.5281/zenodo.19635614
Proof Engine. "Claim Verification: “The binary operator defined by eml(a, b) = (a) - (b) satisfies eml(x, 1) = (x) for every complex number x.” — Proved." 2026. https://doi.org/10.5281/zenodo.19635614.
@misc{proofengine_the_binary_operator_defined_by_text_eml_a_b_exp_a_ln_b_satisfies_text_eml_x_1,
  title   = {Claim Verification: “The binary operator defined by eml(a, b) = (a) - (b) satisfies eml(x, 1) = (x) for every complex number x.” — Proved},
  author  = {{Proof Engine}},
  year    = {2026},
  url     = {https://proofengine.info/proofs/the-binary-operator-defined-by-text-eml-a-b-exp-a-ln-b-satisfies-text-eml-x-1/},
  note    = {Verdict: PROVED. Generated by proof-engine v1.18.0},
  doi     = {10.5281/zenodo.19635614},
}
TY  - DATA
TI  - Claim Verification: “The binary operator defined by eml(a, b) = (a) - (b) satisfies eml(x, 1) = (x) for every complex number x.” — Proved
AU  - Proof Engine
PY  - 2026
UR  - https://proofengine.info/proofs/the-binary-operator-defined-by-text-eml-a-b-exp-a-ln-b-satisfies-text-eml-x-1/
N1  - Verdict: PROVED. Generated by proof-engine v1.18.0
DO  - 10.5281/zenodo.19635614
ER  -
View proof source 244 lines · 8.4 KB

This is the exact proof.py that was deposited to Zenodo and runs when you re-execute via Binder. Every fact in the verdict above traces to code below.

"""
Proof: eml(x, 1) = exp(x) for every complex number x
Generated: 2026-04-16
"""
import os
import sys

PROOF_ENGINE_ROOT = os.environ.get("PROOF_ENGINE_ROOT")
if not PROOF_ENGINE_ROOT:
    _d = os.path.dirname(os.path.abspath(__file__))
    while _d != os.path.dirname(_d):
        if os.path.isdir(os.path.join(_d, "proof-engine", "skills", "proof-engine", "scripts")):
            PROOF_ENGINE_ROOT = os.path.join(_d, "proof-engine", "skills", "proof-engine")
            break
        _d = os.path.dirname(_d)
    if not PROOF_ENGINE_ROOT:
        raise RuntimeError("PROOF_ENGINE_ROOT not set and skill dir not found via walk-up from proof.py")
sys.path.insert(0, PROOF_ENGINE_ROOT)

from datetime import date
from sympy import Symbol, exp, ln, simplify, I, pi, Rational, zoo, oo

from scripts.computations import compare
from scripts.proof_summary import ProofSummaryBuilder

# ============================================================================
# 1. CLAIM INTERPRETATION (Rule 4)
# ============================================================================

CLAIM_NATURAL = (
    r"The binary operator defined by \(\text{eml}(a, b) = \exp(a) - \ln(b)\) "
    r"satisfies \(\text{eml}(x, 1) = \exp(x)\) for every complex number x."
)

CLAIM_FORMAL = {
    "subject": "Binary operator eml(a, b) = exp(a) - ln(b)",
    "property": "eml(x, 1) = exp(x) for all complex x",
    "operator": "==",
    "operator_note": (
        "The claim follows from ln(1) = 0, which holds in the principal branch "
        "of the complex logarithm. Substituting b = 1: eml(x, 1) = exp(x) - ln(1) "
        "= exp(x) - 0 = exp(x). This is an algebraic identity, not a limit or "
        "approximation. The proof verifies symbolically that "
        "exp(x) - ln(1) - exp(x) simplifies to 0 for symbolic x."
    ),
    "threshold": True,
    "is_time_sensitive": False,
}

# 2. FACT REGISTRY — A-types only for pure math
FACT_REGISTRY = {
    "A1": {
        "label": "ln(1) = 0 (symbolic verification)",
        "method": None,
        "result": None,
    },
    "A2": {
        "label": "eml(x, 1) - exp(x) = 0 (symbolic simplification)",
        "method": None,
        "result": None,
    },
    "A3": {
        "label": "Numerical spot-check at 5 complex points",
        "method": None,
        "result": None,
    },
}

# ============================================================================
# 3. COMPUTATION — primary method: symbolic simplification
# ============================================================================

x = Symbol("x")

# A1: Verify ln(1) = 0 symbolically
ln_1 = ln(1)
A1_verified = compare(
    ln_1, "==", 0,
    label="A1: ln(1) = 0",
)

# A2: Verify eml(x, 1) - exp(x) simplifies to 0 for symbolic x
eml_x_1 = exp(x) - ln(1)
residual = simplify(eml_x_1 - exp(x))
A2_verified = compare(
    residual, "==", 0,
    label="A2: simplify(eml(x,1) - exp(x)) = 0",
)

# ============================================================================
# 4. CROSS-CHECKS — numerical evaluation at specific complex points (Rule 6)
# ============================================================================

import cmath

test_points = [
    0,                   # zero
    1,                   # positive real
    -3,                  # negative real
    1j * cmath.pi,       # purely imaginary (i*pi)
    2 + 3j,              # general complex
]

numerical_results = []
for z in test_points:
    eml_val = cmath.exp(z) - cmath.log(1)
    exp_val = cmath.exp(z)
    diff = abs(eml_val - exp_val)
    numerical_results.append((z, diff))
    print(f"  x = {z:>12}  |eml(x,1) - exp(x)| = {diff:.2e}")

all_numerical = all(d < 1e-15 for _, d in numerical_results)
A3_verified = compare(
    all_numerical, "==", True,
    label="A3: numerical spot-checks at 5 complex points all < 1e-15",
)

# ============================================================================
# 5. ADVERSARIAL CHECKS (Rule 5)
# ============================================================================

adversarial_checks = [
    {
        "question": "Does ln(1) = 0 hold for the complex logarithm?",
        "verification_performed": (
            "The principal branch of the complex logarithm is defined as "
            "Log(z) = ln|z| + i*Arg(z) where Arg is the principal argument "
            "in (-pi, pi]. For z = 1: |1| = 1, Arg(1) = 0, so "
            "Log(1) = ln(1) + i*0 = 0. This holds regardless of branch "
            "cut conventions since z = 1 is on the positive real axis."
        ),
        "finding": (
            "ln(1) = 0 holds universally for the principal branch of the "
            "complex logarithm. No branch ambiguity at z = 1."
        ),
        "breaks_proof": False,
    },
    {
        "question": "Is the operator well-defined for all complex x?",
        "verification_performed": (
            "eml(x, 1) = exp(x) - ln(1). The exponential function exp(x) "
            "is entire (defined for all complex x). ln(1) = 0 is a constant. "
            "The subtraction of a constant from an entire function is entire. "
            "The only concern would be if b = 0 (since ln(0) is undefined), "
            "but the claim fixes b = 1."
        ),
        "finding": (
            "eml(x, 1) is well-defined for every complex x. The operator "
            "eml(a, b) has a singularity at b = 0, but the claim only "
            "evaluates at b = 1."
        ),
        "breaks_proof": False,
    },
    {
        "question": "Could numerical precision mask a nonzero residual?",
        "verification_performed": (
            "The symbolic computation uses SymPy's exact symbolic engine, "
            "not floating-point arithmetic. simplify(exp(x) - ln(1) - exp(x)) "
            "returns exactly 0, not an approximation. The numerical cross-check "
            "is supplementary — the proof rests on the symbolic result."
        ),
        "finding": (
            "The symbolic residual is exactly 0 — no numerical precision "
            "issue can affect it. Numerical cross-checks confirm agreement "
            "to machine epsilon."
        ),
        "breaks_proof": False,
    },
]

# ============================================================================
# 6. VERDICT AND STRUCTURED OUTPUT
# ============================================================================

if __name__ == "__main__":
    all_verified = A1_verified and A2_verified and A3_verified
    claim_holds = compare(
        all_verified, "==", CLAIM_FORMAL["threshold"],
        label="All facts verified (symbolic + numerical)",
    )

    any_breaks = any(ac.get("breaks_proof") for ac in adversarial_checks)
    if any_breaks:
        verdict = "UNDETERMINED"
    else:
        verdict = "PROVED" if claim_holds else "DISPROVED"

    print(f"\nVERDICT: {verdict}")

    builder = ProofSummaryBuilder(CLAIM_NATURAL, CLAIM_FORMAL)

    builder.add_computed_fact(
        "A1",
        label=FACT_REGISTRY["A1"]["label"],
        method="SymPy symbolic evaluation of ln(1); verify equals 0",
        result="Confirmed: ln(1) = 0",
    )
    builder.add_computed_fact(
        "A2",
        label=FACT_REGISTRY["A2"]["label"],
        method=(
            "SymPy symbolic simplification of exp(x) - ln(1) - exp(x); "
            "verify result is identically 0 for symbolic x"
        ),
        result="Confirmed: residual = 0",
        depends_on=["A1"],
    )
    builder.add_computed_fact(
        "A3",
        label=FACT_REGISTRY["A3"]["label"],
        method=(
            "Numerical evaluation of |eml(x,1) - exp(x)| at x = 0, 1, -3, "
            "i*pi, 2+3i using Python cmath; verify all < 1e-15"
        ),
        result=f"Confirmed: max residual = {max(d for _, d in numerical_results):.2e}",
    )

    builder.add_cross_check(
        description=(
            "Symbolic (A2) vs numerical (A3): symbolic proves identity exactly; "
            "numerical confirms at 5 representative complex points"
        ),
        fact_ids=["A2", "A3"],
        agreement=A2_verified and A3_verified,
    )

    for ac in adversarial_checks:
        builder.add_adversarial_check(
            question=ac["question"],
            verification_performed=ac["verification_performed"],
            finding=ac["finding"],
            breaks_proof=ac["breaks_proof"],
        )

    builder.set_verdict(verdict)
    builder.set_key_results(
        ln_1_equals_zero=A1_verified,
        symbolic_residual_zero=A2_verified,
        numerical_crosscheck_passed=A3_verified,
        claim_holds=claim_holds,
    )

    builder.emit()

↓ download proof.py · view on Zenodo (immutable)

Re-execute this proof

The verdict above is cached from when this proof was minted. To re-run the exact proof.py shown in "View proof source" and see the verdict recomputed live, launch it in your browser — no install required.

Re-execute the exact bytes deposited at Zenodo.

Re-execute in Binder runs in your browser · ~60s · no install

First run takes longer while Binder builds the container image; subsequent runs are cached.

machine-readable formats

Jupyter Notebook interactive re-verification W3C PROV-JSON provenance trace RO-Crate 1.1 research object package
Downloads & raw data

found this useful? ★ star on github