Come si calcolano le caratteristiche geometriche, ovvero vertici, lati, e facce, degli (iper)cubi in dimensioni generiche?
Infatti, finché lavoriamo con quadrati (quindi in 2d) o cubi (in 3d) è tutto molto tranquillo: basta disegnarli e osservarli e per capire quanti vertici, lati, e facce abbiano. Invece salendo di dimensione non possiamo più disegnarli, o quantomeno farlo in un modo intuibile e comprensibile, e quindi occorre arrivarci per vie traverse, sfruttando anche un po' di calcolo combinatorio.
Per i vertici basta sfruttare l'idea che salendo di dimensioni il vecchio cubo viene traslato lungo il nuovo asse, e quindi i suoi vertici raddoppiano (pensate a come si ottenga un cubo traslando un quadrato lungo l'asse ). E quindi studiando un po' il pattern si ricava che
Ora che ci penso, questo risultato può anche essere trovato immaginando dove posizione i vertici dell'ipercubo nello spazio cartesiano. Per esempio, il quadrato in 2d ha vertici nei punti , , , ; il cubo in 3d ha vertici nei punti , , , , ecc; quindi tutti i vertici devono riempire le tre coordinate ( nel caso in 2d, nel caso in 3d, ecc) dello spazio in cui ci troviamo. Per farlo, abbiamo tanti modi (e quindi tanti vertici) quanti i modi in cui ogni coordinata può essere impostata a 0 oppure a 1. In dimensioni abbiamo quindi 3 slot ciascuno dei quali ha 2 scelte possibili (metterci 0 o 1), e quindi avremo . In generale, scelte e quindi vertici.
Per i lati e le facce l'idea è invece di capire intanto come caratterizzarli, per poi passare a contarli. Nel senso: cosa caratterizza un lato? Potremmo pensare che un lato è univocamente determinato da una coppia di vertici, ma in realtà non proprio, perché un lato collega solo i vertici che sono tra loro adiacenti, non vertici qualunque. Pensare ad un lato come caratterizzato da un vertice e una direzione invece funziona, ed è possibile scegliere un vertice ed una direzione in modi (perché possiamo scegliere un vertice tra i presenti e una direzione tra le dello spazio -dimensionale in cui siamo). Occorre però filtrare il fatto che in questo modo staremmo contando due volte ogni lato (basta prendere due vertici adiacenti e due direzioni complementari), e quindi occorre mettere un fratto due per equilibrare il conteggio. Si arriva quindi alla formula finale
Per le facce piane, ovvero quelle classiche, si procede in modo simile, pensando a come caratterizzarle. In questo caso, risulta che una faccia piana è univocamente determinabile dalla scelta di un vertice e di due direzioni da esso uscenti. Riguardo alle facce generiche di dimensione (perché per esempio uno può chiedersi da quante facce 5-cubiche è formato un 7-cubo, o domande ancora peggiori), queste si possono caratterizzare come la scelta di un vertice e di direzioni da esso uscenti. Correggendo sempre per il numero di volte in cui si sta contando più volte ogni faccia, si arriva alle seguenti formule
dove è il coefficiente binomiale di su , che indica in quanti modi possiamo scegliere elementi distinti da un gruppo di elementi.
using Plots
using JSON
vertici(n) = 2^n
lati(n) = 2^(n-1)*n
facce_piane(n) = n >= 2 ? 2^(n-2) * binomial(n,2) : 0
facce_k(n,k) = 3 <= k <= n-1 ? 2^(n-k) * binomial(n,k) : 0
ns = collect(1:9)
colors = [:red, :blue, :green, :orange]
p1 = plot(ns, vertici.(ns), label="",title="vertici", color=colors[1], m=2, markershape=:circle)
p2 = plot(ns, lati.(ns), label="",title="lati", color=colors[2], m=2, markershape=:circle)
p3 = plot(ns, facce_piane.(ns), label="",title="facce piane", color=colors[3], m=2, markershape=:circle)
p4 = plot(ns, facce_k.(ns, 3), label="",title="facce cubiche", color=colors[4], m=2, markershape=:circle)
p = plot(p1, p2, p3, p4, layout=(2, 2))