Passeggiate casuali

Senza memoria, a passo costante in tre direzioni ortogonali, simmetriche: prima analisi.

Possiamo riportare in una tabella il numero dei percorsi per raggiungere le varie posizioni dopo $n$ passi. Si tratta, al variare di $n$, di una lista di $2n+1$ tabelle $2n+1\times 2n+1$ da considerare come sezioni piane $z=n-k \quad \text{con}\;\; k=0, \dots, 2n$ dello spazio nel quale si svolge la passeggiata.

per $n=0$ 1
per $n=1$
0 0 0
0 1 0
0 0 0
0 1 0
1 0 1
0 1 0
0 0 0
0 1 0
0 0 0
per $n=2$
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 2 0 0
0 2 0 2 0
0 0 2 0 0
0 0 0 0 0
0 0 1 0 0
0 2 0 2 0
1 0 6 0 1
0 2 0 2 0
0 0 1 0 0
0 0 0 0 0
0 0 2 0 0
0 2 0 2 0
0 0 2 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
per $n=3$
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 3 0 0 0
0 0 3 0 3 0 0
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 3 0 0 0
0 0 6 0 6 0 0
0 3 0 15 0 3 0
0 0 6 0 6 0 0
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 3 0 3 0 0
0 3 0 15 0 3 0
1 0 15 0 15 0 1
0 3 0 15 0 3 0
0 0 3 0 3 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 3 0 0 0
0 0 6 0 6 0 0
0 3 0 15 0 3 0
0 0 6 0 6 0 0
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 3 0 0 0
0 0 3 0 3 0 0
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

Il numero di percorsi per raggiungere dopo $n$ passi una certa posizione $(x,y,z)$ forma uno schema numerico che ricorsivamente può descriversi in javascript nel modo seguente:

function nPercorsi(n, x, y, z) { if (n == 0) return 1 else if(n < Math.abs(x) + Math.abs(y) + Math.abs(z)) return 0 else if((n + Math.abs(x) + Math.abs(y) + Math.abs(z)) % 2 != 0) return 0 else if(n == Math.abs(x) || n == Math.abs(y) || n == Math.abs(z)) return 1 else return nPercorsi(n-1,x-1,y,z) + nPercorsi(n-1,x+1,y,z) + nPercorsi(n-1,x,y-1,z) + nPercorsi(n-1,x,y+1,z) + nPercorsi(n-1,x,y,z-1) + nPercorsi(n-1,x,y,z+1) }

Si può costruire una matrice $2n+1 \times 2n+1 \times 2n+1$ relativa a $n$ passi anche iterativamente mediante il seguente codice che, a partire dalla matrice iniziale per $n=0$, trasforma la matrice relativa a un certo valore di $n$ in quella successiva così che M[m][r][c] è il numero di percorsi per raggiungere la posizione $(-n+r,n-c,n-m)$:

var M = [[[1]]]; var i,M0,M1; for (var it=0; it<n; it++){ i = M.length; M1 = M.map(xy => trasf(xy)); for(var m=0; m<i; m++) for(var r=1; r<i+1; r++) for(var c=1; c<i+1; c++) M1[m][r][c] += ((m>0)? M[m-1][r-1][c-1]:0) +((m<i-1)? M[m+1][r-1][c-1]:0); M0 = new Array(i+2).fill().map(() => Array(i+2).fill(0)); M0[(i+1)/2][(i+1)/2] = 1; M = [M0,...M1,M0]; } function trasf(M) { var row = new Array(M.length+2).fill(0); var M1 = [...M.map(L => [0,...L,0]), row, row]; var M2 = [row, ...M.map(L => [0,0,...L]), row]; var M3 = [row, row, ...M.map(L => [0,...L,0])]; var M4 = [row, ...M.map(L => [...L,0,0]), row]; return M1.map( (L,j) => L.map( (e,i) => e + M2[j][i] + M3[j][i] + M4[j][i] ) ) }
Ad esempio per n=
0 0 0
0 1 0
0 0 0
0 1 0
1 0 1
0 1 0
0 0 0
0 1 0
0 0 0
Possiamo ottenere lo stesso risultato con il codice seguente che generalizza
L = [1]; for(var i=0; i<n;i++){ L_1 = [0,0,...L]; L_2 = [...L,0,0] L = L_1.map((x,k)=>x+L_2[k]); }
nel caso unidimensionale oppure
M = [[1]]; for(var i=0; i<n;i++){ zeroRow = Array(2 * i + 3).fill(0); M_1 = [zeroRow,...M.map(L => [0, 0, ...L]),zeroRow]; M_2 = [zeroRow,...M.map(L => [ ...L, 0, 0]),zeroRow]; M_3 = [zeroRow,zeroRow,...M.map(L =>[0,...L, 0])]; M_4 = [...M.map(L => [0, ...L, 0]),zeroRow,zeroRow] M = M_1.map((L,k)=>L.map((x,h)=>x+M_2[k][h]+M_3[k][h]+M_4[k][h])) }
nel caso bidimensionale.
T = [[[1]]]; for (let i = 0; i < n; i++) { zeroRow = Array(2 * i + 3).fill(0); zeroMatrix = Array.from({length: 2 * i + 3}, () => zeroRow); T_1 = [zeroMatrix,...T.map(M => [zeroRow,...M.map(L => [0, 0, ...L]),zeroRow]),zeroMatrix]; T_2 = [zeroMatrix,...T.map(M => [zeroRow,...M.map(L => [ ...L, 0, 0]),zeroRow]),zeroMatrix]; T_3 = [zeroMatrix,...T.map(M => [zeroRow,zeroRow,...M.map(L =>[0, ...L, 0])]),zeroMatrix]; T_4 = [zeroMatrix,...T.map(M => [...M.map(L => [0, ...L, 0]),zeroRow,zeroRow]),zeroMatrix]; T_5 = [zeroMatrix,zeroMatrix,...T.map(M => [zeroRow,...M.map(L => [0, ...L, 0]),zeroRow])]; T_6 = [...T.map(M => [zeroRow,...M.map(L => [0, ...L, 0]),zeroRow]),zeroMatrix,zeroMatrix] T = T_1.map((M,l)=>M.map((L,k)=>L.map((x,h)=>x+T_2[l][k][h]+T_3[l][k][h]+T_4[l][k][h]+T_5[l][k][h]+T_6[l][k][h]))) }

Una visione a strati, da una della facce più esterna della doppia piramide a base quadrata di equazione $|X|+|Y|+|Z|=n$ agli strati via via più interni di equazioni $|X|+|Y|+|Z|=n-2k\ge 0$, ad esempio per $n =$

      1  
    3   3
  3   6   3
1   3   3   1
  15  
15   15
Lo schema numerico della faccia di $|X|+|Y|+|Z|=n$, rappresentata dal triangolo più a sinistra, è formata da $\binom{n}{k}\binom{k}{h}=\binom{n}{h\;\;k-h\;\;n-k)},\;\; h=0,1,\dots,k,\;\;k=0,1,\dots,n$ ovvero $\binom{n}{n_x\;\;n_y\;\;n_z}, \;\;\; n_x+n_y+n_z=n$. Tutte queste facce, al variare di n, sono le espansioni trinomiali che costituiscono le sezioni della piramide di Pascal.

Anche se indubbiamente dovremmo riconoscere complessivamente, nella sequenza di doppie piramidi con comune base quadrata - un ottaedro -, ancora una generalizzazione del triangolo di Pascal Tartaglia, ottenuto dalla somma reiterata delle liste $[0,...L]$ e $[...L,0]$ a partire da $L=[1]$, già generalizzato nelle due dimensioni a partire dalla matrice $M=[[1]]$ reiterando la somma di \[M=\begin{bmatrix} M & \begin{matrix}0 \\ \vdots\\ 0\end{matrix} \\ \begin{matrix}0\cdots 0\end{matrix} & 0 \end{bmatrix}+ \begin{bmatrix} \begin{matrix}0 \\ \vdots\\ 0\end{matrix} & M \\ 0 &\begin{matrix}0\cdots 0\end{matrix} \end{bmatrix}+ \begin{bmatrix} 0 & \begin{matrix}0\cdots 0\end{matrix} \\ \begin{matrix}0 \\ \vdots\\ 0\end{matrix} & M \end{bmatrix}+ \begin{bmatrix} \begin{matrix}0\cdots 0\end{matrix} &0 \\ M &\begin{matrix}0 \\ \vdots\\ 0\end{matrix} \end{bmatrix}\] avendo esteso la matrice $M$ con "gnomoni" di zeri applicati ai quattro vertici, è difficile vedere un'analoga derivazione.

❮❮ ❯❯