]> The Caertesian product

# The Caertesian product

The Cartesian product, named after René des Cartes, is orthodoxly a way of taking a list of sets and generating a set of lists; if we have a list ({collections}:F|n) with n natural, the cartesian product C of F is that collection for which: list (:c|n) is in C iff i in n implies c(i) in F(i). Thus [a,b] is a member of A×B (as orthdoxy writes it), the cartesian product of [A,B], iff a is in A and b is in B. I depart from orthodoxy in not using × to denote this (it's too heavily over-loaded already); it will be Rene([A,B]).

At the same time, the theory of smooth manifolds obliges one to deal extensively with functions of form (:F|M), with M the smooth manifold, for which F(m) is a linear space, for each m; F is then a tensor rank on M and a section of F is a mapping (:f|M) for which f(m) is a member of F(m) for each m in M (subject to some continuity conditions not relevant to the present). This clearly has the same form, with m and M replacing i and n in the above. The situation is then further complicated by the fact that each F(m) is formally constructed from a pair of equivalence relations at m (and possibly some tensor algebra), so that I'd ideally like to allow that F's outputs need not be collections – e.g. they may be equivalences. Expanding the uses of in above, we get C relates c to d iff i in n implies F(i) relates c(i) to d(i), which perfectly safely allows us arbitrary relations as the outputs of F; and allows n to be any collection (or, indeed, general relation; but only its collection of fixed points will matter).

It would be feasible to be more general yet and say: C relates c to d iff i in n implies F relates, to i, some r which relates c(i) to d(i), but replacing F with (: unite(|F:{i}) ←i :(:F|)) would reduce this to the above form; so there is no benefit in allowing F to be a more general relation – a mapping is as general as we have any use for. In specifying Rene, it is necessary to constrain C's left and right values to have the same right values as F (i.e. F's inputs) but we need not constrain c and d to be mappings, so long as each of them does have every input, i, to F as a right value and F(i) does relate each value that c relates to i to each value that d relates to i – which is the appropriate reading of F(i) relates c(i) to d(i) in this case, with c(i) and d(i) being ambiguous expressions that denote each of the values they may all at the same time.

I therefore address the theoretical construct of the cartesian product by defining the mapping

• Rene = (: ({mappings}: (:c|n) ← (:d|n); i in n implies F(i) relates c(i) to d(i) :{mappings}) ← ({relations}:F|n) :{mappings})

which mediates the above. If (:{mappings}|F) then F(i) relates c(i) to d(i) translates to c(i) = F(i,d(i)) so Rene(F) can be written (: (: F(i,d(i)) ←i :) ← (:d|(:F|)) :). When (furthemore) (:{collections}|F), Rene(F) becomes {d: i in (:F|) implies d(i) in F(i)}, which is its orthodox cartesian product, at least when F is a list (i.e. (:F|) is natural).

At the same time, if F is a rank of some smooth manifold's tensor bundle, Rene(F) is the collection of sections – a.k.a. tensor fields (on the whole manifold) – of that rank. If (:F|M) is a section of the rank which describes linear maps from one rank, A, to another, W – a.k.a. a tensor field whose value at each point, m, is a linear map (W(m): F(m) |A(m)) – then Rene(F) = (Rene(W): (: F(m,a(m)) ←m |M) ←(:a|M) :Rene(A)) is a pointwise linear map from sections of A to sections of W. Indeed, the case where F was a rank is just a special case of this: a rank is the identity on itself, and trivially linear, so Rene maps it to the identity (pointwise linear) map on sections of that rank, i.e. the collection of such sections.

[Complication: for equivalences … G(m) and T(m) are equivalences on {({scalars}:h:M): h smooth on some neighbourhood of m} and {(M:f:{scalars})←t: f(t) = m, f smooth in some neighbourhood of t}, respectively … really want mappings from any rank to G or T to be nice about these equivalences … but that can always be implemented by suitable composition with G or T.]

Now, if we have (:F|M) and (:H|M) as sections of two ranks describing linear maps, with H's output rank being F's input rank, we can construct (: F(m)&on;H(m) ←m |M) which is then a section on a third rank describing linear maps, from H's input rank, (: (:H(m)|) ←m |M), to F's output rank, (: (|F(m):) ←m |M). Applying Rene to the composite, we get

Rene(: F(m)&on;H(m) ←m |M)
= ({mappings}: (: F(m, H(m, v(m))) ←m |M) ← (:v|M) :{mappings})
= Rene(F)&on;Rene(H)

so that the pointwise composite of F and H can be written as reverse(Rene, Rene(F)&on;Rene(H)). [The structure of this echoes that of star(a*b) = star(a)&on;star(b) for a binary operator, *, and its associated mapping, star = (: (: u*v ← v :) ←u :).]

## The partial cartesian product

Now, in the case where one F(i) is empty, Rene(F) is empty. However, when discussing functions from within (:F|), with each F(i) a collection, it is still useful to have the same constraint, f(i) in F(i) for each i, albeit limited to all i in (:f|), which might not be all of (:F|). As ever, I duly generalise this from collections to relations and thus define:

• partialRene = (: ({mappings}: (:c:n) ← (:d:n); n subsumes (c:i ←i:) = (d:i ←i:) and, for each i in this F(i) relates c(i) to d(i) :{mappings}) ← ({relations}:F|n) :{mappings})

When one F(i) is empty, the cartesian product of F is also empty; whereas the mappings partialRene(F) relates to one another are merely constrained to not have this i as a right value.

When F is some tensor rank of a smooth manifold, partialRene(F) contains the sections of that tensor rank on open neighbourhoods of the manifold; we can add these (pointwise, as ever), although smooth sections from distinct open neighbourhoods will have non-smooth sum unless each goes smoothly to zero at as much of its open neighbourhood's boundary as lies within the other's open neihgbourhood.

Written by Eddy.