Numérotation des couples (i,j) avec j > i
Bonjour,
J'ai une telle double boucle :
J'ai donc fait une fonction :
J'ai l'impression de passer à côté d'un truc simple...
J'ai une telle double boucle :
for(int i = 0; i < 4 ;i++){ for(int j = i+1; j < 5; j++){ ...... } }Il me faut, pour chacun des dix couples (i,j) de cette boucle, un entier k qui va de 0 à 9. Vous allez me dire que je peux faire:
int k = -1; for(int i = 0; i < 4 ;i++){ for(int j = i+1; j < 5; j++){ k = k + 1; ...... } }Mais je ne peux pas m'en sortir comme ça, car l'intention est de prendre la k-ième composante V[k] d'un vecteur V, et c'est un programme en WebGL, qui ne permet pas de prendre un tel indice variable.
J'ai donc fait une fonction :
int f(int i, int j){ if(i == 0){ if(j == 1) return 0; if(j == 2) return 1; if(j == 3) return 2; if(j == 4) return 3; }else if(i == 1){ if(j == 2) return 4; if(j == 3) return 5; if(j == 4) return 6; }else if(i == 2){ if(j == 3) return 7; if(j == 4) return 8; }else{ return 9; } }et je fais V[f(i,j)] dans ma boucle. Ça marche de cette façon. Je pourrais simplifier cette fonction ainsi :
int f(int i, int j){ if(i == 0){ return j - 1; }else if(i == 1){ return j + 2; }else if(i == 2){ return j + 4; }else{ return 9; } }Cette méthode est spécifique aux limites sur i et j. Si maintenant j'ai une double boucle telle la suivante, pour n un entier quelconque :
for(int i = 0; i < n-1 ;i++){ for(int j = i+1; j < n; j++){ ...... } }alors comment puis-je programmer f(i,j) ?
J'ai l'impression de passer à côté d'un truc simple...
Réponses
-
sage: def F(k): ....: return floor((sqrt(-1+8*k)+1)/2) ....: sage: [(k-F(k)*(F(k)-1)/2,F(k)+1) for k in range(1,29)] [(1, 2), (1, 3), (2, 3), (1, 4), (2, 4), (3, 4), (1, 5), (2, 5), (3, 5), (4, 5), (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (1, 7), (2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (1, 8), (2, 8), (3, 8), (4, 8), (5, 8), (6, 8), (7, 8)]
-
Bonjour,
Il faut regarder du côté de la numérotation des couples d'entiers de Cantor.
Par exemple, là :
https://culturemath.ens.fr/print.php?nid=3712&print=yes
Bonne journée,
Aline -
Il me semble que la fonction que tu cherches est : \[f(i,j,n) = \frac{i\times (2n-i-1)}{2}+j-1\]
-
Quelle souplesse ! Ce que je te propose, c'est de remplacer les deux boucles imbriquées par une seule portant sur k variant entre 1 et n(n+1)/2, et la fonction F te permet de retrouver i et j en fonction de k.
Connectez-vous ou Inscrivez-vous pour répondre.
Bonjour!
Catégories
- 163.1K Toutes les catégories
- 8 Collège/Lycée
- 21.9K Algèbre
- 37.1K Analyse
- 6.2K Arithmétique
- 53 Catégories et structures
- 1K Combinatoire et Graphes
- 11 Sciences des données
- 5K Concours et Examens
- 11 CultureMath
- 47 Enseignement à distance
- 2.9K Fondements et Logique
- 10.3K Géométrie
- 62 Géométrie différentielle
- 1.1K Histoire des Mathématiques
- 68 Informatique théorique
- 3.8K LaTeX
- 39K Les-mathématiques
- 3.5K Livres, articles, revues, (...)
- 2.7K Logiciels pour les mathématiques
- 24 Mathématiques et finance
- 312 Mathématiques et Physique
- 4.9K Mathématiques et Société
- 3.3K Pédagogie, enseignement, orientation
- 10K Probabilités, théorie de la mesure
- 772 Shtam
- 4.2K Statistiques
- 3.7K Topologie
- 1.4K Vie du Forum et de ses membres