Hallo,
also Udo hat, AFAIK, vorwärts und rückwärts vertauscht, in der
Informatik ist es auch so, dass
man dem Paar {x,y} eine einzigen Index zuordnen will was mit
Cantor[{x_Integer, y_Integer}] := (x + y)*(x + y + 1)/2 + y
passiert (entspricht dem gewünschten cantorInverseD[] von Udo).
Die umgekehrte Variante erhält man mit
InverseCantor[z_Integer] :=
InverseCantor[z] =
With[{j = Floor[Sqrt[2*z + 1/4] - 1/2]},
Block[{y}, y = z - j*(j + 1)/2; {j - y, y}]]
wobei erstmal geklärt werden sollte wie lang die Zeile eine Einzeilers
sein darf, denn
InverseCantor[z_Integer] :=
With[{j = Floor[Sqrt[2*z + 1/4] - 1/2]}, {j*(j + 3)/2 - z, z - j*(j +
1)/2}]
ist zwar kürzer aber nur teilweise schöner. Natürlich gibt's das schon
auf MathWorld
http://mathworld.wolfram.com/PairingFunction.html
Und ein Bild gibt's mit
grid = Flatten[Table[{i, j}, {i, 0, 5}, {j, 0, 5}], 1];
Graphics[{
{Point[#], Text[Cantor[#], #, {-1, -1}]} & /@ grid,
Arrow[{#[[1, 1]], #[[2, 1]]}, 0.1] & /@ Select[Partition[
Sort[{#, Cantor[#]} & /@ grid, Last[#1] < Last[#2] &], 2,
1], #[[1, 2]] + 1 === #[[2, 2]] &]
}, Frame -> True, PlotRangePadding -> 0.5]
Gruss
Jens
Udo und Susanne Krause wrote:
Liebe Freundinnen und Freunde von Kleinstspielereien,
man fertige einen Einzeiler cantorD[], der die nullbasierte
Cantornummerierung eines zweidimensionalen Arrays herstellt sowie als
weiteren Einzeiler die inverse Abbildung cantorInverseD[] von cantorD[]:
In[7]:= cantorD /@ Range[0, 20]
Out[7]= {{0, 0}, {1, 0}, {0, 1}, {0, 2}, {1, 1}, {2, 0}, {3, 0}, {2,
1}, {1, 2}, {0, 3}, {0, 4}, {1, 3}, {2, 2}, {3, 1}, {4, 0}, {5,
0}, {4, 1}, {3, 2}, {2, 3}, {1, 4}, {0, 5}}
In[8]:= cantorD[#, 1] & /@ Range[0, 20]
Out[8]= {{0, 0}, {0, 1}, {1, 0}, {2, 0}, {1, 1}, {0, 2}, {0, 3}, {1,
2}, {2, 1}, {3, 0}, {4, 0}, {3, 1}, {2, 2}, {1, 3}, {0, 4}, {0,
5}, {1, 4}, {2, 3}, {3, 2}, {4, 1}, {5, 0}}
In[9]:= cantorD[#, 1] & /@ Range[0, 20] ==
Reverse /@ cantorD /@ Range[0, 20]
Out[9]= True
In[12]:= cantorD[2009]
Out[12]= {56, 6}
In[13]:= cantorInverseD[{56, 6}]
Out[13]= 2009
In[10]:= cantorInverseD /@ (cantorD /@ Range[0, 15008]) ==
Range[0, 15008]
Out[10]= True
und
In[11]:= GraphicsGrid[{{
Graphics[
Style[Arrow[#, 0.1] & /@
Partition[cantorD[#, 1] & /@ Range[0, 45], 2, 1], Blue],
Frame -> True],
Graphics[
Style[Arrow[#, 0.1] & /@
Partition[cantorD /@ Range[0, 45], 2, 1], Red], Frame -> True]
}}]
gibt das Bildchen im Anhang.
Mit den besten Gruessen
Udo.
------------------------------------------------------------------------