Skip to content
ponderance / anmol
← Marginalia

math · origami

The largest ball I can fold from 1856 sheets

A counting problem that looks like calculus, turns out to be number theory, and quietly charges you quadratically for roundness.

2026-06-22

I had 1856 sheets of paper and a simple-sounding question: what’s the biggest round ball I can fold, and what would another 1000 sheets buy me? It became the most satisfying wrong-turn-then-right-turn of the whole thread.

The setup is N=30TbudgetN = 30T \le \text{budget}, so for 1856 sheets, T61T \le 61, i.e. b2+bc+c261b^2 + bc + c^2 \le 61. My instinct was calculus: treat it as an optimization, differentiate, find the critical points. That instinct produces real math, a genuinely pretty page of it, and the wrong answer.

The trap is that the curve b2+bc+c2=61b^2 + bc + c^2 = 61 isn’t a constraint you optimize TT over. It is a level set of TT. Every point on it has T=61T = 61 by definition, so there is nothing to maximize along it.11 Implicit differentiation gives dc/db=(2b+c)/(b+2c)dc/db = -(2b+c)/(b+2c), which is 00 at c=2bc = -2b and vertical at c=b/2c = -b/2. Those are the tilted ellipse’s extreme points, real geometry, just unrelated to counting units. I was trying to maximize the very quantity that draws the curve.

The real problem is discrete. I don’t want a point on the ellipse; I want the integer lattice point inside it with the largest TT. That’s a number-theory question: find the largest value that b2+bc+c2b^2 + bc + c^2 actually achieves (a Loeschian number) at or below budget/30\lfloor \text{budget}/30 \rfloor, then read off its (b,c)(b,c). There’s no clean formula, because Loeschian membership depends on prime factorization, but the search is only a couple of steps:

import math

def representation(T):
    for c in range(math.isqrt(T) + 1):
        disc = 4*T - 3*c*c
        if disc < 0:
            break
        s = math.isqrt(disc)
        if s*s == disc and (s - c) % 2 == 0 and (s - c) // 2 >= c:
            return ((s - c) // 2, c)
    return None

def largest_ball(sheets):
    T = sheets // 30
    while representation(T) is None:   # walk down to the nearest Loeschian number
        T -= 1
    b, c = representation(T)
    return 30 * T, (b, c), T

Run it. With 1856 sheets, TT caps at 61, and 61 is Loeschian on the nose, it’s prime and 1(mod3)\equiv 1 \pmod 3. That gives (b,c)=(5,4)(b,c) = (5,4), an 1830-unit ball, 26 sheets to spare. With another 1000 (2856 total), TT caps at 95, but 95=51995 = 5 \cdot 19 fails and 94 fails too, so it drops to 93=33193 = 3 \cdot 31, giving (b,c)=(7,4)(b,c) = (7,4), a 2790-unit ball, {3,5+}(7,4)\{3,5+\}(7,4).

Two things I didn’t expect. Both winners are Class III chiral (bcb \neq c, both nonzero), so the largest ball I can fold is a giant left- or right-handed spiral, 1830 parallelograms all leaning the same way like wheat in wind. And the extra 1000 sheets only moved TT from 61 to 93, because the paper budget grows linearly while TT grows like the square of the ball’s frequency. Doubling how round the ball looks costs four times the paper. You pay quadratically for roundness. Roundness is a luxury good.

The lesson that stuck: the continuous-optimization reflex was right about the method and wrong about the object. The moment the variable becomes “how many integer lattice points fit,” calculus hands the problem to number theory.

← back to the index