Teaser 2572: Abominable
From The Sunday Times, 8th January 2012 [link] [link]
In the art class Pat used five circles for his new design, Snowman. One circle made the head and another touching circle (with radius three times as big) made the body. Two equal circles (of radius one centimetre less than that of the head) made the arms (one on each side) and they touched both the body and the head. The fifth circle enclosed the other four, touching each of them. The radius of the head’s circle was a whole number of centimetres.
How many centimetres?
[teaser2572]






Jim Randell 9:04 am on 25 February 2024 Permalink |
See also: Teaser 2926.
The arrangement looks like this:
If we consider the head, body, one arm and the enclosing circle we have four mutually tangent circles, so we can use Descartes’ Theorem [ @wikipedia ] to express a relationship between their curvatures.
If the curvatures are represented by k (where: k = 1 / r, i.e. the curvature is the reciprocal of the corresponding radius), then we have:
In this instance the circles have radii of r, 3r, r − 1, 4r and so the curvatures are:
The curvature of the fourth circle is negative as it circumscribes the other three circles.
We can solve the puzzle numerically by simply considering possible r values.
The following program runs in 65ms. (Internal runtime is 102µs).
Run: [ @replit ]
from enigma import (Rational, irange, inf, sq, printf) Q = Rational() # consider possible values for r for r in irange(2, inf): # calculate the 4 curvatures ks = (Q(1, r), Q(1, 3 * r), Q(1, r - 1), Q(-1, 4 * r)) # check Descartes' Theorem if sq(sum(ks)) == 2 * sum(map(sq, ks)): printf("r = {r}") breakSolution: The head has a radius of 13 cm.
Or we can solve it by finding the roots of a polynomial.
This Python program runs in 66ms. (Internal runtime is 3.2ms).
Run: [ @replit ]
from enigma import (Polynomial, sq, printf) # consider the numerators of the curvatures, where the denominator is 12r(r-1) ks = [ 12 * Polynomial([-1, 1]), # k1 = 12(r-1) / 12r(r-1) = 1/r 4 * Polynomial([-1, 1]), # k2 = 4(r-1) / 12r(r-1) = 1/3r 12 * Polynomial([ 0, 1]), # k3 = 12r / 12r(r-1) = 1/(r-1) -3 * Polynomial([-1, 1]), # k4 = -3(r-1) / 12r(r-1) = -1/4r ] # Descartes' Theorem: sq(sum(ks)) = 2 * sum(map(sq, ks)) p = sq(sum(ks)) - 2 * sum(map(sq, ks)) # solve the polynomial for positive integer solutions for r in p.rational_roots(domain='Z', include='+'): printf("r = {r}")Analytically, we find the polynomial we are solving is:
LikeLike