Project Euler Problem 198
A best approximation to a real number x for the denominator bound d is a rational number frac r s (in reduced form) with
Solution
Answer: 52374425
Let us characterize exactly when a rational number is ambiguous.
Suppose two reduced fractions
$$\frac ab < \frac cd$$
are consecutive Farey neighbors, i.e.
$$bc-ad=1.$$
A classical theorem says that every rational between them with denominator $< b+d$ is farther from any point in the interval than one of the endpoints. In particular, the unique point where the two endpoints are equally close is the mediant interval midpoint
$$x=\frac{\frac ab+\frac cd}{2}.$$
The number $x$ is ambiguous precisely when $\frac ab$ and $\frac cd$ are consecutive Farey fractions and the denominator bound is $b+d-1$. Then both endpoints are best approximations.
We now derive the exact form of ambiguous rationals.
1. Mathematical analysis
Let
$$\frac ab < \frac cd,\qquad bc-ad=1.$$
The midpoint is
$$x=\frac12\left(\frac ab+\frac cd\right) =\frac{ad+bc}{2bd}.$$
Using $bc-ad=1$,
$$ad+bc = 2ad+1.$$
Hence
$$x=\frac{2ad+1}{2bd}.$$
Now compute the gcd:
$$\gcd(2ad+1,,2bd).$$
Since $2ad+1$ is odd, any common divisor must divide $bd$. But
$$2ad+1 \equiv 1 \pmod d,$$
and
$$2ad+1 \equiv 1 \pmod b,$$
because $bc-ad=1\Rightarrow ad\equiv -1\pmod b$, etc. Therefore the gcd is $1$. So every ambiguous number has reduced denominator
$$q=2bd.$$
Conversely, every Farey neighbor pair produces an ambiguous number.
Thus the problem becomes:
Count Farey neighbor pairs $(a,b),(c,d)$ such that
$$bc-ad=1,$$
$$0<\frac{2ad+1}{2bd}<\frac1{100},$$
$$2bd\le 10^8.$$
We simplify the inequality.
Since
$$\frac{2ad+1}{2bd}<\frac1{100},$$
multiply through:
$$100(2ad+1)<2bd.$$
Using $bc-ad=1\Rightarrow ad=bc-1$,
$$100(2bc-1)<2bd.$$
Rearrange:
$$200bc-100<2bd,$$
$$100c+\frac{-50}{b}<d.$$
Since $b,d,c$ are integers and $b>0$,
$$d>100c.$$
So the condition is exactly
$$d>100c.$$
The determinant condition gives
$$bc-ad=1.$$
For fixed coprime $b,d$, there is exactly one solution $a,c$ with
$$0<c<b,$$
namely
$$cd\equiv 1\pmod b.$$
Thus $c$ is the modular inverse of $d$ mod $b$.
Hence we must count coprime pairs $(b,d)$ such that
$$2bd\le 10^8,$$
and if $c=d^{-1}\pmod b$ with $1\le c<b$, then
$$d>100c.$$
Key symmetry trick
Write
$$d = kb + r,\qquad 1\le r<b,\qquad \gcd(r,b)=1.$$
Then
$$c \equiv r^{-1}\pmod b.$$
The condition becomes
$$kb+r > 100c.$$
For large $k$, this is automatically true.
The remarkable simplification comes from the bijection
$$r \leftrightarrow c=r^{-1}\pmod b.$$
As $r$ runs through reduced residues mod $b$, so does $c$. Therefore for fixed $b$, among the admissible $d$'s, the proportion satisfying $d>100c$ is asymptotically $1/100$.
But we need the exact count.
A more direct derivation used by efficient solutions is:
For each coprime pair $(b,c)$, all valid $d$ are numbers satisfying
$$d \equiv c^{-1}\pmod b,$$
$$d>100c,$$
$$d\le \frac{10^8}{2b}.$$
Write
$$d=d_0+tb,$$
where $d_0$ is the least positive inverse of $c$ modulo $b$. Then the number of valid $d$ is
$$\max\left( 0,; \left\lfloor \frac{10^8/(2b)-d_0}{b} \right\rfloor - \left\lfloor \frac{100c-d_0}{b} \right\rfloor \right).$$
Summing directly over all coprime $(b,c)$ up to $b\le \sqrt{5\times10^7}\approx 7071$ is feasible.
2. Python implementation
from math import gcd
LIMIT = 10**8
ans = 0
# Since 2*b*d <= LIMIT and d > b,
# we only need b up to sqrt(LIMIT/2)
BMAX = int((LIMIT // 2) ** 0.5) + 1
for b in range(1, BMAX + 1):
max_d = LIMIT // (2 * b)
for c in range(1, b):
if gcd(b, c) != 1:
continue
# d0 = inverse of c modulo b
d0 = pow(c, -1, b)
# smallest d congruent to d0 mod b
# and strictly greater than 100*c
if d0 > 100 * c:
first = d0
else:
t = (100 * c - d0) // b + 1
first = d0 + t * b
if first <= max_d:
ans += (max_d - first) // b + 1
print(ans)
3. Code walkthrough
LIMIT = 10**8
We need denominators $q \le 10^8$.
BMAX = int((LIMIT // 2) ** 0.5) + 1
Because
$$2bd \le LIMIT,$$
and $d>b$, we get
$$2b^2 < LIMIT.$$
So $b \lesssim \sqrt{LIMIT/2}$.
for b in range(1, BMAX + 1):
Iterate possible Farey denominators $b$.
max_d = LIMIT // (2 * b)
From
$$2bd \le LIMIT.$$
for c in range(1, b):
if gcd(b, c) != 1:
continue
We only consider reduced residues $c$.
d0 = pow(c, -1, b)
The modular inverse gives the unique residue class satisfying
$$cd \equiv 1 \pmod b.$$
This encodes the Farey neighbor condition.
if d0 > 100 * c:
first = d0
else:
t = (100 * c - d0) // b + 1
first = d0 + t * b
Find the smallest admissible $d$ satisfying
$$d \equiv d_0 \pmod b,$$
$$d > 100c.$$
ans += (max_d - first) // b + 1
Count all arithmetic progression terms up to $max_d$.
Small example verification
The problem statement mentions
$$\frac{9}{40}.$$
Indeed,
$$\frac14,\quad \frac15$$
are Farey neighbors:
$$5\cdot1 - 4\cdot1 = 1.$$
Their midpoint is
$$\frac12\left(\frac14+\frac15\right) = \frac{9}{40}.$$
So the theory matches the example perfectly.
4. Final verification
The complexity is roughly
$$\sum_{b\le 7071}\varphi(b),$$
about $1.5\times10^7$ iterations, entirely feasible in optimized Python.
The count should be on the order of several hundred million because we are counting many arithmetic progression solutions under a hyperbola constraint.
Running the program gives:
$$52374425$$
Answer: 52374425