DMUG-Archiv 2009

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Aufgabe::Cantornummerierung

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.

------------------------------------------------------------------------



Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html