Then in LinkedIn: Write article → click into the body → paste (Ctrl+V). Headings, links and images come with it. The title usually pastes as the first line — cut it into LinkedIn's title field. back to the article

The EV Formula Is an Exact Production Function Trainers Solved by Accident

Pokémon's public stat formula is a closed-form production function with a fixed budget and hard caps. A Lagrangian solved on Garchomp's own numbers lands exactly where two live Smogon spreads sit — and exposes the one retired spread that wastes a stat point.

The Pokémon Economics Papers, Series PI, No. 2 — this article is the paper's summary; the full text (PDF): https://absolutedigitalpublishers.com/papers/pokemon-economics-pi10-ev-formula-production-function.pdf

A handheld game console propped on a stand on a desk, its screen mid-refresh on a six-row stat readout, three of six numeric values already settled and three still blank

Six numbers a formula already determined before the screen finished drawing them — the same closed-form arithmetic this article works out by hand. — Image prompt and art direction by Brecht Corbeel; generation pending.

Abstract

The public Pokémon stat formula — floor((2·Base+IV+floor(EV/4))·Level/100+5)·Nature — is a fully specified production function: a scarce 510-point budget, a 252-point per-stat ceiling, and a rounding rule that makes most single effort points worthless on their own. This article derives the formula's exact marginal-product structure, proves the hard ceiling on how many stat points that budget can ever buy, solves a constrained-optimization problem for a real Pokémon's own base stats, and checks the result against Smogon University's currently maintained competitive spreads and one retired, unreviewed one — reporting exactly where the community's instinct matches the math, and the one place it doesn't.

A Solved Spread Looks Like Instinct Until You Check What It Is Optimizing

Pull the current Smogon University competitive set for Garchomp in Generation 9 OU and one of the two listed spreads reads: Jolly nature, 252 Attack, 4 Special Defense, 252 Speed [7]. Nothing about that spread announces itself as the output of an optimization problem. It reads like habit — max the stat you hit with, max the stat that lets you hit first, throw the leftover four points somewhere that will not go to waste. Every serious competitive player treats spreads like this as intuition sharpened by years of ladder games, not as arithmetic. My claim is narrower and checkable: it is arithmetic, whether or not anyone doing it ever wrote the arithmetic down. The number that decides a Pokémon’s Attack, Speed, or any other stat is generated by one public, fully specified formula, that formula is a production function in the economist’s exact sense — a scarce input converted into an output through a fixed technical rule — and a Pokémon’s 510-point effort-value budget is spent against real, computable constraints: a 252-point ceiling on any one stat, a rounding rule that swallows most individual points for free, and non-obvious jumps where the rule pays out double. Solve the resulting constrained-optimization problem on Garchomp’s own published base stats for an offensive objective, and the solution is not a nearby approximation to what Smogon publishes. It is the same two numbers. Solve the same style of problem for a defensive objective and a second, currently maintained Garchomp spread also lands exactly on the discrete ceiling the arithmetic predicts. Go back one generation to an older, explicitly unreviewed Garchomp spread, run the identical count, and it comes up one point short — a real, checkable inefficiency sitting in Smogon’s own archive. Three data points, one species, one formula, and exactly one of the three is wrong. That is the shape of the rest of this article.

The Public Stat Formula Already Is a Production Function

Since Generation III, every non-HP stat in a modern Pokémon game is produced by one rule: take twice the species’ base stat, add its individual value (an inherited number from 0 to 31, effectively fixed for a competitively bred Pokémon [4]), add the floor of its invested effort value divided by four, scale by level over 100 and round down, add five, then multiply by a nature coefficient of 0.9, 1.0, or 1.1 and round down again [1]:

S = \left\lfloor \left( \left\lfloor (2B+I+\lfloor E/4 \rfloor) \cdot \frac{L}{100} \right\rfloor + 5 \right) \cdot N \right\rfloor

HP uses the same inner term but a different outer shell, adding the Pokémon’s level plus ten instead of multiplying by a nature:

\text{HP} = \left\lfloor (2B+I+\lfloor E/4 \rfloor) \cdot \frac{L}{100} \right\rfloor + L + 10

At level 100 — the level Smogon’s singles tiers, including the OU tier this article draws its spreads from, are actually played at — the level term collapses to a clean multiplication by one, so every floor operation inside the level scaling vanishes and the formula reduces to simple integer arithmetic: raw score equals twice the base stat plus the IV plus the floor of EV over four, plus five, times the nature coefficient. That collapse is not incidental to this article; it is why the whole problem is exactly solvable rather than merely well-approximated. A trainer is not tuning a continuous dial. A trainer is allocating a strictly rationed resource — at most 510 points total, at most 252 in any single stat since Generation VI [2] — against a fixed, integer-valued conversion rate, in six independent lines, one of which the nature coefficient tilts by exactly ten percent in one direction and discounts by exactly ten percent in another [3]. Two Pokémon-standard six-stat lines, one budget, hard per-line ceilings, an unambiguous conversion technology: that is a textbook constrained-allocation problem, not a metaphor borrowed from economics to dress up a hobby.

The 252-point ceiling itself carries a small, exact piece of history worth pausing on, because it shows the formula’s designers running into their own discreteness. From Generation III through Generation V the per-stat ceiling was 255, not 252; Generation VI lowered it, and any Pokémon carrying 253 or more in a stat when moved forward into a Generation VI game has that value clipped down to 252 [2]. Two hundred fifty-five divided by four floors to sixty-three, identical to what 252 divided by four floors to — so the old ceiling never bought a single trainer a higher stat than the new one does. It only let a player spend three effort points, out of 510 that were never generous to begin with, on absolutely nothing. The 2013 change did not touch a single Pokémon’s maximum achievable stat. It deleted three guaranteed-dead points from the accounting, in exactly the place the floor operation had already made them dead. A related, now-resolved friction sat on the delivery side: from Generation III through Generation VII, the six EV-boosting vitamin items — HP Up, Protein, Iron, Calcium, Zinc, and Carbos, one per stat, ten effort points per dose — stopped working once a stat’s accumulated EVs passed 100, forcing the remaining 152 points on any maxed stat to come only from battling, until Generation VIII lifted that ceiling to the full 252 [5]. Two separate patches, seven generations apart, both aimed at the same rationed, discrete resource. Neither patch is a metaphor either.

A shelf of six labelled apothecary-style bottles standing in a row on the practice-room desk, one bottle's cap sticker partly peeled back to reveal a different printed number underneath

Figure 2. Six bottles, six stats, one sticker mid-peel: the 252-per-stat ceiling replaced a 255 ceiling in 2013, deleting exactly the three effort points the old number always wasted. — Image prompt and art direction by Brecht Corbeel; generation pending.

Between Every Fourth Effort Point, the Marginal Product Is Exactly Zero

Because the formula divides invested effort by four and floors the result, the function mapping effort points to stat points is not a slope. It is a staircase with sixty-three steps, each four points wide, rising by exactly one stat point per step for any stat whose nature coefficient is neutral. Attack on this same Garchomp — base Attack 130 [6] — with a neutral nature coefficient, moves from 296 at zero invested points to 359 at the full 252 — a raw score of 2·130+31+5 = 296 at zero, and 296+63 = 359 once all sixty-three steps are climbed. The marginal product of the 249th, 250th, and 251st effort point invested in Attack is, individually, zero; only the 252nd point on that step converts to a visible stat point. This is not a rhetorical flourish about diminishing returns. It is a literal, computable zero, the same zero for every one of the fifty-two-and-a-half spent-but-useless effort points a trainer would waste by investing in anything other than a clean multiple of four.

A boosted stat complicates the staircase in a way that has gone unremarked in most treatments of the mechanic. Nature multiplication applies its own independent floor on top of the EV floor, and because 1.1 is not an integer, that second floor does not always advance the visible stat by exactly one point per four-EV step the way a neutral stat does. Running Garchomp’s Speed formula with a Jolly nature (which raises Speed and lowers Special Attack [3]) across every one of its sixty-three steps and checking where the final, twice-floored value increases by two points instead of one in a single step turns up exactly six such steps in the entire 0-to-252 range: the steps landing at 40, 80, 120, 160, 200, and 240 invested Speed EVs each deliver a bonus stat point that the neighboring steps do not.

Six of Garchomp’s sixty-three Speed steps are worth double; the other fifty-seven are worth exactly one point, no more and no less, and the three intermediate points inside every one of those sixty-three steps are worth nothing on their own regardless of nature. None of this is folklore, and none of it required a data mine or a leaked internal document — it is arithmetic performed once, correctly, on a formula the game’s own community has documented in public for two decades [1].

A clipboard on a desk holding a printed page of the stat-calculation formula, a capped pen resting diagonally across the floor-division term, a pencilled circle around part of the expression left unfinished on one side

Figure 1. floor(EV/4): the whole discreteness of Pokémon's growth system lives inside one division sign that always rounds down. — Image prompt and art direction by Brecht Corbeel; generation pending.

The 510-Point Budget Can Never Buy More Than 127 Stat Points

The staircase structure has a direct consequence for how much of the 510-point budget can ever do anything at all. The number of stat points any single invested value E buys is \lfloor E/4 \rfloor, which equals (E - (E \bmod 4))/4. Summed across however many stats receive investment, total stat points bought equals (510 - R)/4, where R is the sum of each individual stat’s remainder modulo four. Since 510 itself leaves a remainder of 2 when divided by 4, R must also be congruent to 2 modulo 4 for every point of the 510-point budget to be accounted for — and the smallest non-negative value satisfying that congruence is R = 2. Plug that floor into the equation: the maximum number of stat points any spread of a full 510-point budget can ever buy is (510-2)/4 = 127, full stop, regardless of which six stats receive the investment or in what proportion. Spending the entire budget and ending up with fewer than 127 stat points bought is not a stylistic choice. It is a leak.

Both of Garchomp’s currently maintained Generation 9 OU spreads hit that ceiling exactly [7]. The Swords Dance set — 252 Attack, 4 Special Defense, 252 Speed — totals 508 invested points and buys 63+1+63 = 127 stat points, banking the mathematically unavoidable two-point remainder entirely inside the single four-point Special Defense allocation rather than scattering it. The defensive TankChomp set — 252 HP, 216 Defense, 40 Speed — also totals 508 and also buys 63+54+10 = 127 points, the identical ceiling reached through a completely different three-way split. Two independently written, independently reviewed sets, built around opposite goals, both land on the one number a closed-form count says is the best that 510 points can ever do. That is not two data points confirming a vague intuition. It is two independent, currently-maintained pieces of community output matching an exact integer this article derived from the formula alone, before either spread was checked against it.

A spiral notebook open to a hand-drawn step-function graph of stat points against invested effort points, a calculator beside it with a number mid-entry on its display, the graph's final step not yet drawn in

Figure 3. A staircase, not a slope: the plotted step function is what floor(EV/4) actually looks like once someone bothers to draw all sixty-three steps. — Image prompt and art direction by Brecht Corbeel; generation pending.

Solving the Lagrangian Puts Both Capped Stats Exactly Where Smogon Already Put Them

Hitting the 127-point ceiling says nothing yet about which stats should receive the investment — that answer depends on what the spread is actually for. For the Swords Dance set’s job, sweeping through a metagame’s Speed tiers with a boosted physical attack, I define a proposed measure I will call the sweep index: the product of a Pokémon’s final Attack stat and its final Speed stat. This is not an official in-game statistic; it is this article’s own construct, chosen because a physical sweeper that hits hard but moves last contributes nothing, a sweeper that moves first but hits softly contributes little, and a product (rather than a sum) captures that the two failure modes compound rather than merely add. Writing x for invested Attack EVs and y for invested Speed EVs and relaxing the two internal floors to their continuous approximation for tractability, Garchomp’s Jolly-natured sweep index becomes f(x,y) = (296+x/4)(264+0.275y), and maximizing it subject to a shared budget x+y=B through a Lagrangian

\mathcal{L}(x,y,\lambda) = (296+\tfrac{x}{4})(264+0.275y) - \lambda(x+y-B)

produces first-order conditions \tfrac{1}{4}(264+0.275y) = \lambda = 0.275\,(296+\tfrac{x}{4}), which reduce, after clearing terms, to a single tangency condition independent of the budget size:

y - x = 224

The unconstrained-by-caps answer, in other words, wants Garchomp’s invested Speed to run 224 points ahead of its invested Attack — a gap wider than the entire 252-point ceiling on either stat individually. That single number is the whole explanation for why the observed spread looks like a blunt “max both” instinct rather than a delicate balance: a 224-point desired gap cannot fit inside a box only 252 points wide on a side, so the interior tangency point is infeasible, and because both partial derivatives stay strictly positive everywhere in the feasible region — 83.325 for Attack and 98.725 for Speed, evaluated at the corner itself — the true optimum is not a compromise but the corner: x^\ast = y^\ast = 252, both stats pinned to their individual ceilings, precisely because the model would keep demanding more of each if the ceiling did not exist. That corner is the exact allocation Smogon’s Swords Dance spread uses, arrived at independently by a community of players optimizing by feel rather than by Lagrangian [7].

The gap between the two naive strategies a trainer might reach for instead and this corner is not small. Dumping the entire budget into Attack alone (252 Attack, 0 Speed) yields a sweep index of 359 \times 264 = 94{,}776; splitting the 510-point budget evenly across all six stats (85 EVs each) yields Attack 317, Speed 287, and a sweep index of 317 \times 287 = 90{,}979. The corner solution’s 359 \times 333 = 119{,}547 beats the first naive baseline by 26.1 percent and the second by 31.4 percent on this article’s own measure — a real, computed gap, not a rhetorical one.

Once both offensive stats sit at their ceiling, the model has nothing left to say about the remaining 4 to 6 points a 510-point budget still has room for — both partial derivatives with respect to Attack and Speed remain positive at the corner, meaning the two-variable model would keep spending on them forever if the ceiling allowed it, and is simply silent on where leftover points outside those two variables should go. Real spreads resolve that silence with information this toy objective never had. Smogon’s own text for the defensive TankChomp set states plainly that “the given EV spread allows Garchomp to outspeed Raging Bolt” [9] — its 40 invested Speed points are not decorative; they clear one specific, named rival’s Speed stat, a constraint external to any two-stat product and invisible to a model that only knows base stats and a nature chart.

A small chalkboard propped against the shelf, a constrained optimization equation written across it in chalk, two of its variables circled together while a final term trails off mid-line uncompleted

Figure 4. The circled pair is where the tangency condition asks for more room than a 252-point ceiling allows — the corner solution a real spread already occupies. — Image prompt and art direction by Brecht Corbeel; generation pending.

Where the Model Breaks: A Corner Only Exists When the Gap Outgrows the Box

The corner solution is not a universal law about Pokémon spreads; it is a consequence of one specific number, 224, being larger than one specific box width, 252. Nothing about the sweep-index construction guarantees that relationship for every objective a trainer might optimize. A defensive pairing built the same way — the product of final HP and final Defense, say, for a wall whose job is simply to survive as many hits as possible rather than to out-speed anything — would generate its own tangency condition from its own pair of base stats and its own nature multipliers, and there is no general reason that gap has to exceed 252 the way Attack-and-Speed’s does for this particular Pokémon under this particular nature. This is a Speculative claim in the strict sense this publication uses that word: I have not solved the bulk-objective case here, and the honest failure condition is explicit — if a real, currently maintained bulk spread turns up that caps two defensive stats simultaneously without an equivalently wide implied gap forcing it there, or conversely settles on an interior, uncapped split for two stats whose implied gap this method would predict as corner-forcing, this specific mechanism (a Lagrangian tangency wider than the box) is not what is driving the outcome, and something else — a discrete damage-roll threshold, most likely — is doing the real work instead. The formula is exact; which objective a given real spread is actually solving for is not something this article observes directly, only infers from the numbers that come out the other end.

The One Published Garchomp Spread That Actually Wastes a Point

The theorem that 510 points can buy at most 127 stat points is only interesting if it is possible to fail it, and the pkmn/smogon archive of Smogon’s own historical movesets [8] turns up exactly one Garchomp spread, out of every generation and every competitive tier checked, that does. A Generation 5 Monotype set titled “Defensive Entry Hazard Support (Dragon)” runs 252 HP, 162 Defense, and 94 Speed — 508 total points invested, the same total as both of the currently maintained Generation 9 sets above. But \lfloor 252/4 \rfloor + \lfloor 162/4 \rfloor + \lfloor 94/4 \rfloor = 63+40+23 = 126, one stat point short of the 127-point ceiling the same 508-point total achieves everywhere else this article checked. The two points inside its 162 Defense allocation and the two points inside its 94 Speed allocation are each, individually, one short of their own next four-point step; shifting either allocation by two — 164 Defense and 92 Speed, or 160 Defense and 96 Speed, both still summing to 508 — recovers the full 127 points for free, with no change to the total budget spent and no tradeoff against anything else the set is trying to do.

The archive itself explains why this particular spread never went through the review that caught the same error nowhere else. Smogon University’s own written entry for that set carries a standing disclaimer rather than an analysis: “This is a sample set. We aren’t working on BW Monotype analyses at the moment” [10]. A sample set is explicitly a placeholder, not a reviewed competitive recommendation — it never passed through the writer-and-quality-check process that the actively maintained Generation 9 OU page credits by name for its own sets [9]. The formula does not know or care whether a given number was reviewed. It simply floors whatever is typed into it. Where a maintained review process exists, this article’s closed-form count and the community’s own output agree exactly, twice. Where that process lapses — an old tier, a sample entry, a generation nobody is actively curating — the same formula immediately exposes a real, quantified point of waste that had apparently gone unnoticed since it was written.

A printed strategy-dex page pinned to a corkboard above the desk, a red-pen circle drawn around one effort-value number on the page, the circle open on one side rather than closed

Figure 5. The one published spread this article's own count flags as short a point: a red circle not yet closed around the number that gives it away. — Image prompt and art direction by Brecht Corbeel; generation pending.

Folklore and Optimization Produce the Same Spread Until Someone Checks

None of this required treating Pokémon’s competitive scene as a metaphor for economics, and none of it required inventing a model loose enough to fit whatever number happened to come out. The stat formula is public, exact, and has not meaningfully changed in its core arithmetic since Generation III [1]; a scarce, capped budget converted through that arithmetic is a production function whether or not anyone allocating it ever names it that; and a production function with hard per-line ceilings and a demonstrably wide implied trade-off ratio has a corner solution, computable in advance, that either matches what a community of players independently converged on or it does not. For Garchomp specifically, on the two objectives this article could pin down precisely enough to solve, it matches twice, exactly, against currently maintained output a review process actively checks. Where that review process is switched off — an archived tier nobody is updating — the same closed-form count finds the one place, in every generation and tier this article checked, where the community’s instinct and the arithmetic quietly parted ways. If “trainers solved this by accident” is a real claim rather than a compliment, this is what it should look like when checked: not a vague resemblance, but two matches and one named, quantified, two-point miss, sitting in the same species’ own history.

Sources

  1. Bulbapedia contributors. Statistic (Generation III onward stat-calculation formula). Bulbapedia (2026).
  2. Bulbapedia contributors. Effort values. Bulbapedia (2026).
  3. Bulbapedia contributors. Nature. Bulbapedia (2026).
  4. Bulbapedia contributors. Individual values. Bulbapedia (2026).
  5. Bulbapedia contributors. Vitamin (EV-boosting items). Bulbapedia (2026).
  6. PokeAPI contributors. Garchomp — base stat resource. PokeAPI (2026).
  7. Smogon University contributors. Generation 9 OU moveset data (Garchomp: TankChomp, Swords Dance). Smogon University, via the pkmn/smogon Strategy Dex data API (2026).
  8. Smogon University contributors. Generation 5 moveset data (Garchomp: BW Monotype Defensive Entry Hazard Support). Smogon University, via the pkmn/smogon Strategy Dex data API (2026).
  9. Smogon University contributors. Generation 9 OU written analysis (Garchomp). Smogon University, via the pkmn/smogon Strategy Dex data API (2026).
  10. Smogon University contributors. BW Monotype written analysis (Garchomp) — sample-set disclaimer. Smogon University, via the pkmn/smogon Strategy Dex data API (2026).

Originally published at https://absolutedigitalpublishers.com/articles/the-ev-formula-is-an-exact-production-function-trainers-solved-by-accident.