Aller au contenu

Matrice ZigZag

Une matrice \(n\times n\) dite « ZigZag » est remplie d’entiers consécutifs (commençant à 1 par exemple) de telle sorte que le premier entier est placé en haut à gauche. Le remplissage s’effectue vers le sud-est de la matrice en zigzag, comme dans la norme jpg, ou comme on le voit dans ce schéma :

Voici une matrice zigzag \(8\times8\) :
 1   2   6   7  15  16  28  29

 3   5   8  14  17  27  30  43

 4   9  13  18  26  31  42  44

10  12  19  25  32  41  45  54

11  20  24  33  40  46  53  55

21  23  34  39  47  52  56  61

22  35  38  48  51  57  60  62

36  37  49  50  58  59  63  64

 

Quelle est la formule qui donne le nombre se trouvant à la ligne \(L\) et à la colonne \(C\) ? La réponse n’est pas triviale et il m’a fallu du temps, de l’observation et de la réflexion pour l’obtenir.

 

En fait, il faut tout d’abord observer que 2 éléments symétriques par rapport au centre de la matrice ont pour somme 65, et plus généralement \(n^2+1\) si \(n\) est l’ordre de la matrice. Par exemple, 38 et 27 sont symétriques et leur somme est bien \(8^2+1=65\). Il suffit donc de remplir la matrice triangulaire supérieure haute-gauche et compléter par symétrie.

Ensuite, les choses se passent en diagonale :

 1   2   6   7  15  16  28  29

 3   5   8  14  17  27  30

 4   9  13  18  26  31

10  12  19  25  32

11  20  24  33

21  23  34

22  35

36

La somme \(C+L\) est paire dans les diagonales bleues et impaire dans les rouge. On peut observer que les entiers se trouvant en haut des diagonales paires (1, 6, 15, 28) sont des nombres triangulaires.

Un nombre triangulaire de rang \(n\), que nous notons \(t_n\) vaut $$t_n=\frac{n(n+1)}{2}$$

Revenons à notre matrice… Ainsi, prenons par exemple 15 en haut d’une diagonale bleue : il a pour coordonnées \((5;1)\), a une somme \(C+L=6\) et est égal au nombre triangulaire de rang \(C+L-1\) et en effet $$t_{6-1}=\frac{(6-1)\times6}{2}=15$$

Sur ces diagonales bleues, les nombres diminuent lorsque \(L\) augmente. Par conséquent, un nombre de coordonnées \((C ; L)\) sur une diagonale bleue vaut  $$\frac{(C+L-1)(C+L)}{2}-L+1$$

En suivant le même raisonnement avec les diagonales rouge, les nombres triangulaires se trouvent à leur base et les nombres diminuent lorsque \(C\) augmente ; on obtient $$\frac{(C+L-1)(C+L)}{2}-C+1$$

 

Finalement, la fonction \(f(C,L)\) donnant la valeur d’un nombre de coordonnées \(C\) et \(L\) est:

\(\begin{cases}
\text{Si }C+L<n+2\text{,} &f (C,L)=t_{C+L-1}+1-\begin{cases}L&\text{si } C+L\text{ pair}\\C&\text{si } C+L\text{ impair}\end{cases}\\[5ex]
\text{sinon, }&f (C,L)=n^2+1-f(n+1-C,n+1-L)
\end{cases}\)

Une boucle de type for avec une macro de syntaxe

\fornum<variable>=<entier initial> to <entier final>(<incrément signé>){<code>}

a dû être programmée afin que la syntaxe reste agréable.

Cela donne le code suivant :

Et le résultat :

Laisser un commentaire