Problème
Supposons que vous ayez deux listes A = [a_1, a_2, ..., a_n]
y B = [b_1, b_2, ..., b_n]
de nombres entiers. Nous disons A
es potentiellement divisible por B
s'il existe une permutation de B
qui rend a_i
divisible par b_i
pour tous i
. Le problème est alors le suivant : est-il possible de réorganiser (c'est-à-dire de permuter) B
de sorte que a_i
est divisible par b_i
pour tous i
? Par exemple, si vous avez
A = [6, 12, 8]
B = [3, 4, 6]
La réponse serait alors True
, comme B
peuvent être réordonnées pour être B = [3, 6, 4]
et nous aurions alors cette a_1 / b_1 = 2
, a_2 / b_2 = 2
y a_3 / b_3 = 2
qui sont tous des entiers, donc A
est potentiellement divisible par B
.
A titre d'exemple, qui devrait produire False
Nous aurions pu le faire :
A = [10, 12, 6, 5, 21, 25]
B = [2, 7, 5, 3, 12, 3]
La raison en est la suivante False
est que nous ne pouvons pas réorganiser B
comme 25 et 5 sont dans A
mais le seul diviseur dans B
serait de 5, il en resterait donc un.
Approche
Il est évident que l'approche la plus simple consisterait à obtenir toutes les permutations de B
et voir si l'une d'entre elles satisferait potentiel-divisibilité , quelque chose du genre :
import itertools
def is_potentially_divisible(A, B):
perms = itertools.permutations(B)
divisible = lambda ls: all( x % y == 0 for x, y in zip(A, ls))
return any(divisible(perm) for perm in perms)
Question
Quel est le moyen le plus rapide de savoir si une liste est potentiellement divisible par une autre liste ? Des idées ? Je me demandais s'il n'y avait pas un moyen astucieux de le faire avec premiers mais je n'ai pas trouvé de solution.
C'est très apprécié !
Editar : C'est probablement sans intérêt pour la plupart d'entre vous, mais par souci d'exhaustivité, je vais expliquer ma motivation. En théorie des groupes, il existe une conjecture sur les groupes simples finis qui consiste à savoir s'il existe ou non une bijection entre les caractères irréductibles et les classes de conjugaison du groupe telle que chaque degré de caractère divise la taille de la classe correspondante. Par exemple, pour U6(4) Voici ce que A
y B
ressemblerait à ce qui suit. Des listes assez conséquentes, d'ailleurs !
1 votes
Il existe une réponse (aujourd'hui supprimée) qui affirme que le tri des deux listes fait partie d'une solution valable. Cela pose-t-il un problème ?
0 votes
@cs Je ne sais pas pourquoi la réponse a été supprimée. Je ne sais pas non plus si le fait de trier va aider ici.
0 votes
@McGuire : Quelle est la taille des a_i y b_i ?
0 votes
@Blender Idéalement arbitrairement grand
0 votes
Les doublons sont-ils autorisés dans l'une ou l'autre liste ? Par exemple, est-ce que
B
être[1,1,1]
?0 votes
@MSeifert oui, il peut y avoir des doublons
0 votes
@Tim ah, vous avez tout à fait raison, désolé.