Tests such as jo44f carry n independent vectors around a bone. If matrix X is the array of independent vectors and Y is the result of carrying them then X−1Y does not depend on the choice of original vectors. The matrix representation of X−1Y does, however, depend on the basis vectors presumed for that matrix. A matrix identifies a linear transformation only in conjunction with an identified set of n basis vectors. We speculate that such a rotation is the composition of two rotations that respectively: These two particular transforms commute. This speculation can be verified if we express our rotation in an orthonormal basis set with n−2 vectors from the bone.

To this end we call Linear.gs passing n−2 independent vectors from the bone first. This yields B which is an array of n orthonormal basis vectors the first n−2 of which lay in the bone. Matrix B itself is expressed in the facet bcc of the interface between the two zones where we launched and captured the vectors on their cycle about the bone. We then express X−1Y in basis B thus:
A = BX−1YB−1.
Note that the above is a product of matrices all in bcc coordinates, while the resulting matrix can be taken as being expressed in the orthonormal basis vectors.

Counter Speculation

The following argument seems to support the 3D intuition that the effect of parallel circulation about a bone is just rotation about that bone, even in many dimensions.

Consider a contravarient vector in a zone that is parallel to a vector in the bone. If crossing each facet between neighbors in the cycle about the bone leaves the vector parallel to the same vector of the bone, then the cycled vector would end up parallel to the same bone vector. Consider the itinerant vector when it is in the facet between vectors. It is by continuity parallel to the bone vector, and should so remain as it emerges into the neighbor’s space.

This sounds right yet the output with tag xr reports the parallel test vectors in each fbcc in test cases such as jo44. In that computation the first vector of the n test vectors has components (1, 0, 0, 0) and this presumes the fbcc basis set. All the basis vectors of a fbcc basis set but the last belong the facet. In this case the logic assumes the bcc origin for the facet to be global vertex 3. The vector (1, 0, 0, 0) is thus seen to be the vector from vertex 3 to vertex 0 which indeed lies in the facet, but not the bone which is simplex [0; 1; 2]. Indeed none of the test vectors are of the bone. Perhaps we should renumber the vertices to improve our analysis of this same geometry.

This may cinch the argument: Consider some vector to be transmitted around a bone that is parallel to some vector in the bone. ‘Parallel’ is meaningful here because the bone is a sub-simplex of the zone and is thus included in the scope of the Euclidean geometry of the zone. As we move to the frame of the facet between neighboring zones, this parallel relationship is maintained. By induction the vector remains parallel, indeed equal, to its stay-at-home copy. This simple logic was suggested by looking at the numbers. Here is more detail.

Consider an orthonormal basis ON with the first n−2 elements in the bone. Interpret I (the n by n identity) as a linear transformation expressed in the ON basis, convert to fbcc, send that around the loop, convert back to the ON basis. That result should manifest or refute the speculation after we introduce random mods to the metric!

Create a matrix of vectors the first n−2 of which are in the bone. Do this in fbcc because then the matrix consists of only 0s and 1s.

Just now I am putting this code into file jo44fc which descends from jo44f because it provides the necessary context. I plan to move it later perhaps into jog.ml.

a function of two global vertex numbers yielding distance2.
which designates the facet for tapping.
global vertex number of the facet vertex opposite the bone.
merely an array form of fac, suitable for indexing.
covariant metric tensor of fbcc.
inner product for this metric.
The orthonormal basis, expressed in fbcc.
Contemplate this with simple zbcc’s.


B = I, the n by n identity. We are in the fbcc where a tap is installed. We view the elements of B as basis vectors. The last of those vectors is not in the facet. The integer argument k of the call to curl nominates a vertex of the facet, opposite to which is the bone in question. We swap B[k] and B[n−2]. Now the array B[0] thru B[n−3] are independent bone vectors. Linear.gs gd c returns an array of n vectors in fbcc. gd is the bilinear form of the metric tensor for the fbcc. c is B. B[0] thru B[n−1] are all of magnitude 1 and mutually orthogonal. The first n−2 are in the facet. They are all still expressed in fbcc.

Since B is an array of ON (orthonormal) basis vectors, expressed in fbcc, then B−1 is an array of fbcc basis vectors expressed in ON coordinates. We send B around the loop yielding B' also in fbcc.


To express the linear transformation X−1Y in these orthogonal basis we compute: C−1X−1YC where C = B. To understand this expression imagine it working on a vector x expressed in fbcc: C−1X−1YCx. When x is an edge of the bone, x has one 1 component and the rest zero. Cx is then one of the orthonormal basis set. Send Cx around the bone yielding RCx. Compute (RCx)−1RCx

Perhaps we should make newz and nz return the metric too, in guise of bilinear form, expressed in fbcc. On the other hand it is trivial to recompute the metric tensor and then we need not mess with high level interfaces and elide and augment metric tensors computed elsewhere. ††††††