Adventitious triangles
The classic 20-80-80 triangle geometry problem looks like this. We have an isosceles right triangle with angles 20°, 80°, and 80°, and lines and with angles as shown. The task is to find the red marked angle at .
This is a well known problem, and you might have even seen it shared on social media at some point. You can find the solution on this Wikipedia page.
Here’s the fun part no one told you:
- If you try to generalize the problem with general integral angles (or rational angles) in place of the ones in the image, the red angle will not in general be integral or rational.
- Nevertheless, there are infinitely many triangles where the 5 labeled angles, along with the unknown angle, are rational. We’ll call these rational adventitious triangles.
From what I can tell, it appears that the rational adventitious triangles come in two families:
- One infinite family whose defining feature is that you can construct a right angle out of the segments or vertically mirrored images of the segments. The triangle at the top of this page is a member of this infinite family, because the vertical mirror of line is perpendicular to line .
- And a finite family of sporadic triangles where there are no right angles involved.
For fun, I enumerated the latter and they’re all shown below.
I’m curious if one can find natural synthetic geometry proofs for each one, similar to the famous solution to the first triangle of this post. Show these problems to your friends and family. If you find any synthetic arguments, let me know!
Here is the C++ code I wrote to produce these triangles. Each line in the output is of the form and corresponds to the triangle where , line is inclined at angle with respect to the vertical, line is inclined at angle with respect to the vertical, and line is inclined at angle with respect to the vertical.
#include <cmath>
#include <fstream>
#include <iostream>
#include <numeric>
using namespace std;
// https://www.geogebra.org/calculator/fgbhynue
int main()
{
ofstream fout("test_langley_out.txt");
for (int denom = 4; denom <= 180; ++denom)
{
fout << "# denom = " << denom << "\n";
for (int a = 1; a < denom; ++a)
{
for (int b = a + 1; b < denom; ++b)
{
for (int c = a + 1; c < denom; ++c)
{
if (b == c || gcd(gcd(a, b), c) != 1)
continue;
auto aa = numbers::pi / 2 * a / denom;
auto bb = numbers::pi / 2 * b / denom;
auto cc = numbers::pi / 2 * c / denom;
auto x = 1 / tan(aa);
auto y = 1 / tan(bb);
auto z = 1 / tan(cc);
auto result = atan((x * x - y * z) / (x * x * (y - z)));
auto df = result * denom / (numbers::pi / 2);
auto d = (int)round(df);
if (abs(df - d) < 1e-9 && b + c != denom && b + abs(d) != denom && c + abs(d) != denom)
fout << denom << " " << a << " " << b << " " << c << " " << d << "\n";
}
}
}
}
}