Existe t-il une formule ?
Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
par MarcusStGraal » 30 Mar 2022, 18:59
Bonjour la communauté ,
Je me passionne pour les combinaisons de nombres par exemple :
1/ 1 -2-3-4-5
2/ 1-2-3-4-6
3/ 1-2-3-4-7
...
n/ ?
...
8568/ 14-15-16-17-18
Ma question est la suivante : existe t-il un moyen par le calcul de trouver la nième combinaison?
-
Pisigma
- Habitué(e)
- Messages: 3058
- Enregistré le: 22 Déc 2014, 00:38
-
par Pisigma » 30 Mar 2022, 19:33
Bonjour,
si tu nous donnais encore quelques valeurs
1/ 1 -2-3-4-5
2/ 1-2-3-4-6
3/ 1-2-3-4-7
4/ ?
5/ ?
6/ ?
7/ ?
.
.
.
.
100/?
-
lyceen95
- Membre Complexe
- Messages: 2255
- Enregistré le: 15 Juin 2019, 00:42
-
par lyceen95 » 30 Mar 2022, 20:47
Dans l'esprit de l'OP, on a uniquement les nombres entre 1 et 18
Avec ces 18 nombres, on peut constituer 18*17*16*15*14/120=8568 groupes (a,b,c,d,e) avec (a<b<c<d<e),
et la combinaison n°8568 est donc la dernière : 14,15,16,17,18.
A partir d'un nombre n, on peut trouver la combinaison correspondante, sans avoir à lister toutes les combinaisons, mais c'est lourd.
Pas de temps maintenant... peut-être en fin de soirée ?
-
lyceen95
- Membre Complexe
- Messages: 2255
- Enregistré le: 15 Juin 2019, 00:42
-
par lyceen95 » 30 Mar 2022, 23:12
Imaginons n=4000 par exemple.
Il y a 17*16*15*14/24=2380 combinaisons qui commencent par un 1, 16*15*14*13/24=1820 combinaisons qui commencent par un 2 etc etc.
si n est inférieur ou égal à 2380, la combinaison commence donc par un 1
si n est entre 2381 et 2380+1820, la combinaison commence donc par un 2
etc etc
Et une seule qui commence par un 14.
Parmi toutes les combinaisons qui commencent par un 2, on peut aisément compter le nombre de combinaisons qui commencent par 2.3, 2.4 etc etc
Et on sait donc déterminer le 2ème nombre de notre combinaison.
Etc etc
-
GaBuZoMeu
- Habitué(e)
- Messages: 6019
- Enregistré le: 05 Mai 2019, 10:07
-
par GaBuZoMeu » 31 Mar 2022, 17:53
Bonjour,
Les logiciels de calcul formel font ça. Je prends l'exemple du logiciel libre et gratuit SageMath :
- Code: Tout sélectionner
S=Subsets(range(1,19),5)
S.cardinality()
8568
SageMath commence à numéroter à 0. Si on veut commencer à numéroter à 1, il faut prendre ses précautions.
- Code: Tout sélectionner
def rang(L) :
return S.rank(L)+1
rang({1,3,5,7,9})
665
- Code: Tout sélectionner
def derang(n) :
return S.unrank(n-1)
derang(4000)
{2, 9, 10, 12, 15}
par MarcusStGraal » 04 Avr 2022, 11:03
Pisigma a écrit:Bonjour,
si tu nous donnais encore quelques valeurs
1/ 1 -2-3-4-5
2/ 1-2-3-4-6
3/ 1-2-3-4-7
4/ ?
5/ ?
6/ ?
7/ ?
.
.
.
.
100/?
Bonjour Pisigma,
Merci pour ta réponse; un moyen simple d'avoir d'autres combinaisons est d'aller sur octave online par exemple (
https://octave-online.net/) et de lancer la commande: nchoosek(1:18,5)
par MarcusStGraal » 04 Avr 2022, 11:08
lyceen95 a écrit:Imaginons n=4000 par exemple.
Il y a 17*16*15*14/24=2380 combinaisons qui commencent par un 1, 16*15*14*13/24=1820 combinaisons qui commencent par un 2 etc etc.
si n est inférieur ou égal à 2380, la combinaison commence donc par un 1
si n est entre 2381 et 2380+1820, la combinaison commence donc par un 2
etc etc
Et une seule qui commence par un 14.
Parmi toutes les combinaisons qui commencent par un 2, on peut aisément compter le nombre de combinaisons qui commencent par 2.3, 2.4 etc etc
Et on sait donc déterminer le 2ème nombre de notre combinaison.
Etc etc
Merci lyceen95,
Cette approche est très intéressante, c'est la plus proche de ce que je cherche à obtenir; Je vais creuser dans ce sens
par MarcusStGraal » 04 Avr 2022, 11:14
GaBuZoMeu a écrit:Bonjour,
Les logiciels de calcul formel font ça. Je prends l'exemple du logiciel libre et gratuit SageMath :
- Code: Tout sélectionner
S=Subsets(range(1,19),5)
S.cardinality()
8568
SageMath commence à numéroter à 0. Si on veut commencer à numéroter à 1, il faut prendre ses précautions.
- Code: Tout sélectionner
def rang(L) :
return S.rank(L)+1
rang({1,3,5,7,9})
665
- Code: Tout sélectionner
def derang(n) :
return S.unrank(n-1)
derang(4000)
{2, 9, 10, 12, 15}
Merci GaBuZoMeu,
C'est une solution mais ça ne répond pas à mon problème car en effet, je souhaite pouvoir le résoudre à la main par des calculs simples
-
GaBuZoMeu
- Habitué(e)
- Messages: 6019
- Enregistré le: 05 Mai 2019, 10:07
-
par GaBuZoMeu » 05 Avr 2022, 09:36
Il y a des fois où une jolie formule permet de trouver facilement le résultat recherché. Et des fois où ça demande d'utiliser un algorithme plus ou moins coûteux. Lyceen95 en a esquissé un.
Ces algorithmes sont implémentés dans des systèmes de calcul formel. On peut bien sûr tenir absolument à les exécuter à la main ...
par MarcusStGraal » 13 Avr 2022, 20:50
GaBuZoMeu a écrit:Il y a des fois où une jolie formule permet de trouver facilement le résultat recherché. Et des fois où ça demande d'utiliser un algorithme plus ou moins coûteux. Lyceen95 en a esquissé un.
Ces algorithmes sont implémentés dans des systèmes de calcul formel. On peut bien sûr tenir absolument à les exécuter à la main ...
L' intérêt d'obtenir une formule ou un algorithme apparaît évident sur un très grand nombre de donnés par exemple des combinaisons de 5 numéros parmi 500; je ne pense pas qu'il n'y ait beaucoup de systèmes capables de donner la nième combinaison rapidement
-
GaBuZoMeu
- Habitué(e)
- Messages: 6019
- Enregistré le: 05 Mai 2019, 10:07
-
par GaBuZoMeu » 13 Avr 2022, 21:44
- Code: Tout sélectionner
S=Subsets(range(1,501),5)
S.cardinality()
255244687600
- Code: Tout sélectionner
def derang(n) :
return S.unrank(n-1)
%time derang(10**11)
CPU times: user 2.73 ms, sys: 682 µs, total: 3.42 ms
Wall time: 3.43 ms
{65, 228, 48, 435, 221}
Est-ce assez rapide ? Peux-tu espérer aller plus vite à la main ?
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 30 invités