docs← Back to article

Markdown for LLMs

Computer algebra: the textbook-steps run

The source Markdown for this article. Copy it into your assistant or download it as a text file.

Download this articlePlain text ↗
# Computer algebra: the textbook-steps run

Computer algebra systems cover far more mathematics than this comparison:
their scope is not in question here. This page is about applying textbook
rules step by step and about what certifies the answer. For the broader
question of what tools change for a model solving science tasks, see
[Science tasks: models with and without tools](/comparisons/science-with-and-without-tools/).

**Result:** a bank of 129 checked rows — derivative, integral, limit and
ODE rows (`dr-1-*`, `di-1-*`, `li-1-*`, `od-1-*`) — was recounted on
2 October 2026. SymPy 1.14.0 and Wolfram 15.0.1 (for Linux x86, 64-bit)
agree on all 129; Arxo, checking the presented steps, records zero false
accepts and zero silent refusals on expected cases. On top of the bank,
15 textbook cases C01–C15 from OpenStax Calculus (editions pinned in the
package sources) were mapped against both references: C01–C05 were
executed by the Arxo case package (6 of 6 tests pass, including the
related by-parts case C13r); the remaining cases sit on the stated model
boundary, except C14, where the two references disagree. The numbers
belong to SymPy 1.14.0, Wolfram build 15.0.1, and `law` 0.1.1.

## The task and the reference

The expectations come from a printed textbook, OpenStax Calculus, not from
either implementation: each case states the rule to apply (power rule,
sine derivative, power antiderivative, net change, a special limit,
series, corner cases) and the value the textbook requires. SymPy 1.14.0
serves as the main reference; Wolfram 15.0.1 serves as the second
reference, called fresh 15 times for the C01–C15 mapping (one probe plus
14 case calls, no cache reuse). The Arxo side applies the pinned textbook
formulations through the packages `openstax.calculus_derivatives`,
`openstax.calculus_integrals`, `openstax.calculus_limits` and
`openstax.calculus_series`. Public pages of the references are at
[SymPy](https://www.sympy.org/) and the
[Wolfram Language](https://www.wolfram.com/language/).

## What "agreement" means here

Three outcome classes are used. A case matches when both sides give the
textbook value, possibly in different but equivalent forms (factored or
expanded, an unevaluated-input refusal against an explicit infinity where
both mean divergence). A case is not comparable when the two sides answer
different questions by construction (a rule the catalog does not state).
C14 alone is a mismatch between a reference and the textbook, described
below. An honest refusal — no value with a stated reason — is its own
class, not a failure.

## Results

Bank: 129 of 129 rows agree between SymPy 1.14.0 and Wolfram 15.0.1;
Arxo false accepts 0 of 129. Cases C01–C05 below are a subset of those
rows and were additionally executed by the Arxo case package.

| Case | Expectation (OpenStax) | SymPy 1.14.0 | Wolfram 15.0.1 | Arxo | Outcome |
|---|---|---|---|---|---|
| C01 | 3x squared | 3x squared (bank `dr-1-0000`) | confirmed 1/1 in bank | PASS, power rule justifies (executed) | match |
| C02 | cos x | cos x (bank `dr-1-0018`) | confirmed 1/1 in bank | PASS, sine rule justifies (executed) | match |
| C03 | x cubed over 3 plus constant | x cubed over 3 (bank `di-1-0000`) | confirmed 1/1 in bank | PASS, power antiderivative justifies (executed) | match |
| C04 | one half | one half | one half | PASS, net change justifies the definite integral (executed, exact case) | match |
| C05 | 1 | 1 (bank `li-1-0024`) | 1 in bank | PASS, special-limit rule justifies (executed; mapping note in force) | match, with note |
| C06 | diverges | infinity | input returned unevaluated | outside the model (no case of this shape) | match in substance, forms differ |
| C07 | 1/a for positive real part of a; otherwise not established | piecewise: 1/a under condition, else the integral form | conditional form with Re(a) > 0; with a > 0 gives 1/a | outside the model (the catalog states no conditional branches) | match (the two conditions are equivalent) |
| C08 | pi squared over 6 | pi squared over 6 | Pi squared over 6 | outside the model (no series family in the case bank) | match |
| C09 | diverges | infinity | sum returned unevaluated | outside the model (as C06) | match in substance, forms differ |
| C10 | does not exist (corner point) | no value (not-a-number at zero; a complex form, not a value) | derivative left unevaluated | outside the model (no corner-point rule) | match (neither side gives a value) |
| C11 | (x-1)(x+1) | factored form; expansion returns the input | the same product, factors ordered differently | polynomial-factor shoulder, not executed here | match |
| C12 | 2 pi i k | integer-indexed set of values | integer-parameter form | outside the model (no solver package) | match (forms equivalent) |
| C13 | e to x times (sin x minus cos x) over 2 | equal value, expanded | equal value | exact case not executed; related by-parts case C13r PASS | match (values equal; the decomposition choice belongs to the student) |
| C14 | 1/(1-r) for \|r\| < 1; otherwise not established | piecewise with the \|r\| < 1 condition | the bare formula without the condition; at r = 1/2 gives 2 | outside the model (as C08) | mismatch between Wolfram and the textbook |
| C15 | diverges | infinity | input returned unevaluated | outside the model (as C06) | match in substance, forms differ |

## Where the two systems behave differently

One case, C14, the geometric series: SymPy 1.14.0 returns the sum guarded
by the condition \|r\| < 1, which is what the textbook requires; Wolfram
15.0.1 returns the bare closed form without the condition. At r = 1/2 both
references give 2, so the difference only matters where the condition
decides the answer. In a bank pipeline such a case would leave the
expected set and enter reference disagreement — 1 of 9 mapped cases here,
with the other 8 agreeing in substance, including honest refusals in
different forms (C06, C09, C10, C15).

A second, quieter difference is form, not value: where the textbook
expects divergence, SymPy writes infinity while Wolfram returns the input
unevaluated (C06, C09, C15); where no value exists, SymPy surfaces
not-a-number or a complex form while Wolfram leaves the derivative
unevaluated (C10). The contract counts these as agreement in substance.

## Where the model stops

Series (C08, C14), improper integrals (C06, C09, C15), parametric cases
with assumption branches (C07), the corner point (C10) and complex roots
(C12) sit outside the checked catalog: where the catalog states no rule,
Arxo answers "not established" with the reason instead of a value. That
silence with a reason is a property of the package, stated in advance —
the same property the bank measures on its negative controls. One further
limit belongs to all three sides equally: no side ships an independent
certificate with its answer. The bank answers are verdict records, and
the cross-check is Wolfram times SymPy independently, 129 of 129 — not a
proof object either side could hand over.

## Reproducing the run

Pin the bank at its recorded commit and recount the five per-family
answer files (`wolfram`, `sympy`, `expected` lines) against each other;
that comparison is the only execution this run adds, and it uses the
plain interpreter without the bank tooling. Pin the Arxo side: `law`
0.1.1 with the OpenStax packages named above; the C01–C05 and C13r cases
execute as package tests (6 of 6 pass). Pin the mapping calls: SymPy
1.14.0 locally, Wolfram build 15.0.1, 15 fresh calls in total. Each mapped
answer is filed verbatim with its case identifier and reference version,
so any row of the table can be rechecked case by case.