Suite à cette discussion, formule pour calcul ART, voici un sujet un peu similaire, mais en beaucoup plus simple.
On a des cubes, de couleurs différentes.
On va commencer par 3 cubes : Bleu Jaune Rouge (B,J, R)
On veut disposer ces 3 cubes côte à côte, et on veut comptabiliser le nombre de dispositions différentes. Chacun des cubes doit être collé à l'un des autres, avec une face accolée.
Si les 3 cubes sont alignés, la seule question est de choisir le cube qui sera relié aux 2 autres. Donc 3 dispositions possibles avec 3 cubes alignés.
Si les cubes ne sont pas alignés, il faut réfléchir un peu plus, mais c'est pareil, la seule question est de choisir le cube qui sera au milieu. Il n'y a pas de question de sens direct ou indirect, en faisant tourner le bloc de 3 cubes sur lui-même, on constate qu'il n'y a que 3 dispositions différentes.
Donc 3+3 = 6 dispositions avec 3 cubes.
Questions,
1/ Combien de dispositions avec 4 cubes différents Bleu Jaune Rouge et Vert ?
2/ Combien de dispositions avec 5 cubes différents Bleu Jaune Rouge Vert et Noir ?
3/ Etc
Je n'ai pas les réponses, je ne pourrais pas trop chercher dans les prochaines semaines.
Je n'ai pas cherché encore, mais ça ne peut pas être ça.
Mon énoncé n'était peut-être pas suffisamment clair , donc je précise :
Si j'aligne 4 cubes, BJRV ou VRJB, ça donne au final la même chose ; quand les 4 cubes sont alignés, il y a 12 façons de répartir les couleurs
Si je dispose les 4 cubes en carré, il n'y a plus que 2 façons de répartir les couleurs.
Et si je dispose les 4 cubes en 'dimension 3' , il y a 8 façons de répartir les couleurs si je ne me trompe pas.
Etc etc ..
Quand j'ai assemblé mes 4 cubes, et qu'ils sont collés entre eux, j'ai le droit de faire tourner la composition dans tous les sens... et donc en particulier si j'ai collé mes 4 cubes pour faire un carré, la seule question qui se pose c'est de savoir si Jaune et Bleu sont cote à cote, ou en diagonale. Donc 2 dispositions seulement.
Donc non, pas ce raisonnement où on compte les dispositions, puis on multiplie par 24.
En carré, ce n'est ni 2 comme j'écrivais précédemment, ni 6, mais 4 dispositions : il faut vraiment voir l'assemblage comme un volume. Je colle mes 4 cubes les uns aux autres. Et si je retourne mon assemblage de 4 cubes BJVR, je tombe sur BRVJ.
ll te manque une forme où les 4 cubes sont sur un même plan. (la position en Z, 3ème exemple de l'image)
Et il manque les formes les 4 cubes ne sont pas tous dans un même plan (entre autres les exemples 1 et 2 de l'image).
Bonjour,
Merci d'animer
Je pose une question pour vérifier que je n'ai pas mal compris ce que l'on compte :
Dans l'image du 14 à 9h02, les figures 1 et 2 sont-elles considérées comme identiques (car symétriques) ou pas ?
Bonjour,
Non, elles sont différentes.
On peut prendre en main la forme n°1, coloriée comme on veut, on peut la faire tourner dans tous les sens, elle ne donnera jamais la forme n°2.
On manipule des objets en bois, réels...
Bonjour,
Joli exercice, je vous souhaite bien du courage pour généraliser quelque soit le nombre de cubes, je ne vois pas comment le faire
Bonjour,
A noter que la troisième disposition dans l'espace est identique à celle du plan.
Jolis dessins
Comme j'ai renoncé à traiter n = 5, je me contente de commenter les résultats pour n = 4.
Pour 5 cubes :
On trouve même la suite des nombres de solide en 2D : 5, 12, 35, 108, 369, 1285, 4655...
et en 3D : 3, 17, 131, 915, 6553, 47026, 341888...
Donc la somme redonne bien la suite trouvée par GBZM mais même en admettant ce résultat, comment il arrive à en déduire le nombre de coloriage ?
Aucune idée, ce n'est pas le même nombre par solide. Je sens venir un programme en python mais cela reste impressionnant car il ne me parait pas du tout évident de coder ce bazar.
Oups, je rectifie. Je me suis trompé dans les grandes largeurs pour les nombres de colorés. Heureusement, c'était facile à réparer :
Nombre de cubes : 5.
Nombre de solides : 29.
Nombre de solides colorés (une couleur par cube) : 2715
Nombre de cubes : 6.
Nombre de solides : 166.
Nombre de solides colorés (une couleur par cube) : 104700
Nombre de cubes : 7.
Nombre de solides : 1023.
Nombre de solides colorés (une couleur par cube) : 4937310
Nombre de cubes : 8.
Nombre de solides : 6922.
Nombre de solides colorés (une couleur par cube) : 273708960
Je suis curieuse de voir le code ou le raisonnement quand même.
Les valeurs numériques ne m'intéressent pas vraiment par contre comprendre l'algo qui les donne nettement plus
Bah, j'ai écrit en python des procédures toutes bêtes, qui demanderaient sans doute à être optimisées. Les grandes lignes :
- Un cube est représenté par un triplet d'entiers (coordonnées de son centre).
- Une liste de cubes donne un solide. Toutes les listes sont calées dans l'octant positif : le minimum des premières (resp. deuxièmes, troisièmes) coordonnées des cubes est nul.
- On code un solide par :
1) Une liste de cubes calée qui le représente,
2) Une liste d'ensembles de cubes qui sont les "avatars" du solide ; on obtient les avatars en faisant agir les 24 rotations du cube sur la liste de cubes du 1), on cale et on transforme en ensemble.
3) Une liste des permutations des cubes de la liste 1) induites par les rotations-calages qui préservent l'avatar associé (l'ensemble des cubes de la liste).
- On fabrique de manière incrémentielle les listes de solides à 1,2,3,... cubes. Les avatars permettent de vérifier qu'il n'y a pas de doublon, les listes de permutations permettent de compter les coloriages.
class Solide :
def __init__(self, ListeCubes, ListeAvatars,Symetries):
self.lcub = ListeCubes
self.lav = ListeAvatars
self.sym = Symetries
UnCube = Solide([(0,0,0)],[set([(0,0,0)])],[(0)])
def Caler(ListeCubes) :
minx = min(cub[0] for cub in ListeCubes)
miny = min(cub[1] for cub in ListeCubes)
minz = min(cub[2] for cub in ListeCubes)
return [(cub[0]-minx,cub[1]-miny,cub[2]-minz) for cub in ListeCubes]
def Rotations(Cube) :
a = Cube[0] ; b = Cube[1] ; c = Cube[2]
return[(a,b,c),(a,-b,-c),(-a,b,-c),(-a,-b,c),\
(-a,-c,-b),(-a,c,b),(a,-c,b),(a,c,-b),\
(c,a,b),(c,-a,-b),(-c,a,-b),(-c,-a,b),\
(-c,-b,-a),(-c,b,a),(c,-b,a),(c,b,-a),\
(b,c,a),(b,-c,-a),(-b,c,-a),(-b,-c,a),\
(-b,-a,-c),(-b,a,c),(b,-a,c),(b,a,-c)]
def Solidifier(ListeCubes):
s=set(ListeCubes)
LAva=[] ; LPerm=[]
LRot=[Rotations(cub) for cub in ListeCubes]
for i in range(24) :
lc = Caler([r[i] for r in LRot])
ava = set(lc)
if not(ava in LAva) : LAva.append(ava)
if ava == s :
perm = [ListeCubes.index(cub) for cub in lc]
if not(perm in LPerm) : LPerm.append(perm)
return Solide(ListeCubes,LAva,LPerm)
def PousseCube(Cube) :
a = Cube[0] ; b = Cube[1] ; c = Cube[2]
return [(a+1,b,c),(a,b+1,c),(a,b,c+1),\
(a-1,b,c),(a,b-1,c),(a,b,c-1)]
def AjoutCube(ListeCubes) :
LAjout=[]
for cub in ListeCubes :
for i in range(6) :
nouv = PousseCube(cub)[i]
if not(nouv in ListeCubes) :
LAjout.append(Caler(ListeCubes+[nouv]))
return LAjout
def PlusUn(ListeSols) :
LPU = []
for sol in ListeSols :
L=AjoutCube(sol.lcub)
for listcub in L :
s=set(listcub)
if all( not(s in solid.lav) for solid in LPU) :
LPU.append(Solidifier(listcub))
return LPU
LSUn=[UnCube]
LSDeux=PlusUn(LSUn)
...
LSSept=PlusUn(LSSix)
%time LSHuit=PlusUn(LSSept)
import math
def Info(ListeSolides,n) :
nb = len(ListeSolides)
nbcol = sum(math.factorial(n)//len(sol.sym) for sol in ListeSolides)
print("Nombre de cubes : {2}.\n\
Nombre de solides : {0}.\n\
Nombre de solides colorés (une couleur par cube) : {1}."\
.format(nb,nbcol,n))
Info(LSHuit,8)
Là, juste en jetant un coup d'oeil, je vois deux optimisations faciles:
- Utiliser des (frozen)sets au lieu de listes un peu partout:
par exemple:
if not(perm in LPerm) : LPerm.append(perm)
est en O(n)
LPerm.add(perm) est en O(1)
for i in range(6) :
nouv = PousseCube(cub)[i]
devrait être
for nouv in PousseCube(cub):
Merci des suggestions. On y gagne pas mal :
%time LSHuit=PlusUn(LSSept)
Du coup, j'ai tenté les neuf cubes. Ça rame, mais ça passe.
%time LSNeuf=PlusUn(LSHuit)
En ne stockant pas les avatars mais juste la forme canonique de chaque solide (peu importe laquelle), je réduis drastiquement la consommation de mémoire et améliore même le temps.
Calcul de 10 cubes en un peu moins de 8 minutes:
Bravo, ça c'est du travail de pro dont je serais bien incapable. Je fais du python en dilettante. J'ai essayé ton code sur ma machine. Un peu plus lent, mais tout à fait comparable :
0: 0 (0) 0.000s
1: 1 (1) 0.001s
2: 1 (1) 0.003s
3: 2 (6) 0.006s
4: 8 (95) 0.018s
5: 29 (2715) 0.054s
6: 166 (104700) 0.205s
7: 1023 (4937310) 1.215s
8: 6922 (273708960) 8.912s
9: 48311 (17431530480) 72.788s
10: 346543 (1254165746400) 605.767s
Par contre je ne suis pas d'accord avec ta première ligne : 0: 0 (0). Ça devrait être 0: 1 (1).
Ah oui aussi LittleFox, je ne comprends pas bien pour quoi tu écris : "Ça été galère d'être sûr d'avoir toutes (et que) les rotations possibles" ?
En continuant avec ce programme, il faudrait 9 mois pour calculer les chiffres de l'oeis
Ça reste possible ^^
@GBZM
J'ai d'abord voulu retrouver les rotations possibles et si possible les construire plutôt que d'écrire les 24. Ben j'ai juste fait plein d'erreurs J'ai repris tes rotations du coup. En espérant qu'elles sont juste (ça à l'air)
Il y a combien de solides avec 0 cubes et 0 couleurs? J'ai choisi 0 mais en fait 0 ou 1 ça n'a pas de sens. D'ailleurs l'oeis se garde bien de donner cette valeur.
Ben c'est clair qu'il y en a un seul : le solide vide. Et il est clair aussi que tous ses cubes sont coloriés (n'est-ce pas ?), en utilisant 0 couleur.
Donc, si on veut donner une valeur pour 0 cube, 1 est la seule possible.
Pour les rotations ; les rotations de la grille entière en dimension 3 sont données par des matrices de permutation, avec pour chaque matrice de permutation les quatre combinaisons de signes possibles pour avoir déterminant 1 : donc 0 ou 2 "moins" pour les permutations paires, 1 ou 3 moins pour les permutations impaires. C'est la structure de ma liste de rotations, avec les permutations données dans l'ordre de l'algorithme de Johnson-Trotter :
Le même procédé marche en toute dimension , pour donner les rotations de la grille entière. Au fait, une petite modification du programme permettrait de compter les poly-hypercubes en dimension 4,5,...
J'aimerais bien une procédure python qui produise la liste des rotations (en toute dimension d). Ça doit être faisable.
Bonjour,
Ce qui est remarquable en "détente c'est qu'un amusement du départ de ty59847
aboutisse à une très belle étude des pros .
Imaginons simplement l'écart entre le niveau 4 proposé et le niveau 10 prouvé par eux.
@dpi,
C'était un peu mon objectif en lançant ce sujet ouvert, avec un nombre de cubes pas forcément limité, je voulais pécher du gros poisson
Je savais que pour 4 cubes, on pourrait trouver la solution à la main, pour 5, ça doit être possible de le faire à la main, mais au delà, c'est une autre histoire.
Je donne quand même le lien vers l'autre sujet similaire, peut-être que LittleFox va mordre à l'hameçon ?
La même question de base, mais avec des tétraèdres réguliers : Combien de dispositions à partir de n tétraèdres
Les nombres sont plus petits, 4 faces au lieu de 6, mais l'approche est plus compliquée.
En tout cas, merci à tous pour vos réponses.
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :