Functional programming puzzle

*To*: mathgroup at christensen.cybernetics.net*Subject*: [mg1821] Functional programming puzzle*From*: "Wm. Martin McClain" <wmm at chem.wayne.edu>*Date*: Thu, 3 Aug 1995 23:51:45 -0400*Organization*: Wayne State University, College of Science

Dear functional programers: Let ptList = {{1,1,2},{2,1,3},{1,3,2}}; I want a matrix of distances between the points in ptList. Any human would think you could get it with Rij[a_,b_]:=Sqrt[(a-b).(a-b)] followed by Outer[Rij,ptList,ptList] But Mathematica returns a mess, because Outer seems to Flatten the ptList before running the outer product loops. I can do it for a short ptList this way: toNbrs = Thread[{p1,p2,p3}->ptList] {p1->{1,1,2}, p2->{2,1,3}, p3->{1,3,2}} RijArray = Outer[Rij,{p1,p2,p3},{p1,p2,p3}]; (gives output in terms of symbols p1, p2, and p3) Then replace the symbolic points by numerical points, and give it a hand with Dot[0,0]: RijNbrs = RijArray /.toNbrs /. Sqrt[0 . 0]->0; The answer is, as desired, {{ 0, Sqrt[2], 2 }, {Sqrt[2], 0, Sqrt[6]}, { 2, Sqrt[6], 0 }} But this gets out of hand when ptList is long. I am so frustrated that I am TEMPTED to do it with explicit indices. Please, somebody help me before this happens. Also, with explicit indices I could cut the number of multiplies more than in half, because I know the result will be symmetric, with only zeroes on the diagonal. Is there some way to include this knowledge in a functionally programmed version? TIA- Martin McClain, Chemistry, Wayne State, Detroit