One of my goals is to find ways to catalyze the desire to explore higher mathematics, by creating onramps from lower math, for example high school math.
Just as left and right (negative and positive) infinity might be unified in a projective geometry, so might the higher meet the lower math in the realm of philosophy and curriculum design, the latter being a practical expression, one of philosophy's fruits, at least potentially.
For example, Graph Theory is inherently accessible and is already making inroads in that kids get recruited into competitive programming teams, with encouraging parents hoping for scholarships or at least a stronger college admissions portfolio, not that the kids themselves don't share this agenda.
So last year I found myself plowing through Dijkstra's Algorithm and myriad others, because these feature in CP (competitive programming). Academically, this material gets put in an elective called Algorithms and Data Structures. My students were 8th graders, with Python and/or C++ skills.
Fano's Plane reminds me of the Konigsberg Bridge problem, which is often presented as a quasi-realistic map of Konigsberg. Examples:
However tempting it might be to present Fano's Plane as a manicured garden, with a canal boat going in a circle, with mini-Rialto bridges along inclined walkways from corners of an outer triangle to the raised central mound, with steps down to the opposite edge midpoints and a subway system around the perimeter...
However tempting, that's a misreading.
A Fano line is more like a set, in that we don't identify which of its three points has to be "between the other two".
Three points defining a line is more like three people having the same political party affiliation.
When any two people stand together, a unique common party affiliation will be evident, along with a 3rd person in the same party.
Each person is in exactly three parties etc.
The Fano System here described is the simplest one, when we have 7 persons i.e. when n = 2 and persons = $n^{2} + n + 1$. n might go higher. Mathematica has demos that work through n = 9.
The diagram on the right, called an incidence diagram, is clearer about the overall symmetry, once we take away whether a station is one or two stops away. The incidence diagram shows what persons are "incident to" (members of) what party, and what parties are "incident to" (contain) which folks.
If you're at station 3 and want to reach station 1, simply jump on the blue line and take it there, without having to go through station 7 along the way.
In this sense, every station is connected to exactly six others. Every person, with three political affiliations, is connected to six others, two more in each party.
# use sets, not lists
L1 = {5, 2, 3}
L2 = {3, 7, 1}
L3 = {1, 6, 5}
L4 = {6, 4, 3}
L5 = {2, 4, 1}
L6 = {7, 4, 5}
L7 = {6, 7, 2}
import itertools as it
# every intersection of two distinct lines is the set of all points
set([list(a.intersection(b))[0]
for a, b in it.product((L1, L2, L3, L4, L5, L6, L7), repeat=2)
if a != b])
{1, 2, 3, 4, 5, 6, 7}
# every point occurs in 3 distinct lines
for i in range(1, 8):
print(sum([i in line for line in (L1, L2, L3, L4, L5, L6, L7)]))
3 3 3 3 3 3 3
{6, 7}.issubset( {2, 7, 6} )
True
# every pair occurs only once in any block
pairs = it.combinations({1, 2, 3, 4, 5, 6, 7}, 2)
trials = 0
for p in pairs:
p = set(p)
print(p)
trials += 1
total = sum(list(map(lambda q: p.issubset(q), (L1, L2, L3, L4, L5, L6, L7))))
if total != 1:
raise Exception
print(f"All good! {trials} trials")
{1, 2} {1, 3} {1, 4} {1, 5} {1, 6} {1, 7} {2, 3} {2, 4} {2, 5} {2, 6} {2, 7} {3, 4} {3, 5} {3, 6} {3, 7} {4, 5} {4, 6} {4, 7} {5, 6} {5, 7} {6, 7} All good! 21 trials
The sculpture below is in some sense isomorphic to the Fano Circuit Diagram.
In another sense, it highlights differences among vertices we are meant to overlook e.g. the centrality of one of them, in terms of it being but one hop from all the rest.
Fano lines are better thought of as "bags" or "blocks", not subway lines, in having no "middle points" as distinct from "termini".
In the simplest Fano system, represented in Steiner notation as S(2, 3, 7), every pair of persons is uniquely in one of the 3-person political parties, and we have 7 such persons in 7 such parties. Any given person will be in exactly three political parties (or blocks).
This pattern may be generated in 168 ways, by swapping around party affiliation.
"Projective planes are known to exist for all orders which are prime numbers or powers of primes." (Block Designs, Wikipedia)
import pandas as pd
import numpy as np
If we were to go ahead with the subway metaphor, and interpret the above picture quite literally, we might go with something like this:
# seven stations
stations = {'pos_x': ( 1, 0, 0), 'pos_y': ( 0, 1, 0), 'pos_z': ( 0, 0, 1),
'neg_x': (-1, 0, 0), 'pos_z': ( 0, 0, 1), 'neg_z': ( 0, 0, -1),
'xyz_0': ( 0, 0, 0)}
# seven subway routes
routes = {"V": ('pos_x', 'pos_y', 'neg_z'),
"I": ('pos_y', 'pos_z', 'neg_x'),
"B": ('neg_x', 'neg_y', 'neg_z'),
"G": ('neg_y', 'pos_z', 'pos_x'),
"Y": ('pos_x', 'xyz_0', 'neg_x'),
"O": ('pos_y', 'xyz_0', 'neg_y'),
"R": ('pos_z', 'xyz_0', 'neg_z')
}
df = pd.DataFrame(routes).T
df
0 | 1 | 2 | |
---|---|---|---|
V | pos_x | pos_y | neg_z |
I | pos_y | pos_z | neg_x |
B | neg_x | neg_y | neg_z |
G | neg_y | pos_z | pos_x |
Y | pos_x | xyz_0 | neg_x |
O | pos_y | xyz_0 | neg_y |
R | pos_z | xyz_0 | neg_z |
You may be able to force yourself to see Zhen-Qian-Xun as an X axis, at 90 degrees to both the Y axis (Dui-Qian-Gen) and the Z axis (Li-Qian-Kan).
Space divides into eight octants. Each octant is described by a right tetrahedron.
The tetrahedron facing us is Quian-Xun-Dui-Li and does not form a closed tetrahedron. Qian reaches these other stops in one hop, but the other three stations are not directly connected.
However, Qian-Gen-Zhen-Li forms a closed tetrahedron. Each is a single hop from the others.
Lets categorize each octant in terms of open or closed tetrahedrons.
tetrahedra = {
('Qian', 'Xun', 'Dui', 'Li') : "OPEN", # + + +
('Qian', 'Xun', 'Gen', 'Li') : "OPEN", # + - +
('Qian', 'Gen', 'Zhen', 'Li') : "CLOSED", # - - +
('Qian', 'Zhen', 'Dui', 'Li') : "OPEN", # - + +
('Qian', 'Xun', 'Dui', 'Kan'): "OPEN", # + + -
('Qian', 'Xun', 'Gen', 'Kan'): "CLOSED", # + - -
('Qian', 'Gen', 'Zhen', 'Kan'): "CLOSED", # - - -
('Qian', 'Zhen', 'Dui', 'Kan'): "CLOSED", # - + -
}
We're actually free to delete the Zhen-Gen segment, or any of the segments around the inner circle, while still preserving the seven lines and their relationships.
Stylistically, it's nice to make the center line a circle, but these "lines" are really blocks and their being connected together collineraly simply means "in the same bag" or "party".