Le défi est d'écrire le code le plus rapide possible pour calculer le permanent d'une matrice .
Le permanent d'une matrice n
-by- = ( ) est défini commen
A
a
i,j
S_n
Représente ici l'ensemble de toutes les permutations de [1, n]
.
À titre d'exemple (du wiki):
Dans cette question, les matrices sont toutes carrées et n'auront que les valeurs -1
et 1
en elles.
Exemples
Contribution:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Permanent:
-4
Contribution:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Permanent:
0
Contribution:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Permanent:
192
Contribution:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Permanent:
1021509632
La tâche
Vous devez écrire du code qui, donné n
par une n
matrice, sort son permanent.
Comme je devrai tester votre code, il serait utile que vous me donniez un moyen simple de donner une matrice en entrée à votre code, par exemple en lisant la norme dans.
Soyez averti que le permanent peut être grand (la matrice tous les 1 est le cas extrême).
Scores et égalités
Je vais tester votre code sur des matrices aléatoires + -1 de taille croissante et arrêter la première fois que votre code prend plus d'une minute sur mon ordinateur. Les matrices de notation seront cohérentes pour toutes les soumissions afin d'assurer l'équité.
Si deux personnes obtiennent le même score, le gagnant est celui qui est le plus rapide pour cette valeur de n
. Si ceux-ci sont à moins d'une seconde l'un de l'autre, c'est celui affiché en premier.
Langues et bibliothèques
Vous pouvez utiliser n'importe quelle langue et bibliothèque disponibles que vous aimez, mais aucune fonction préexistante pour calculer le permanent. Dans la mesure du possible, il serait bon de pouvoir exécuter votre code, veuillez donc inclure une explication complète sur la façon d'exécuter / compiler votre code sous Linux si possible. »
Implémentations de référence
Il existe déjà une question de codegolf avec beaucoup de code dans différentes langues pour calculer le permanent pour les petites matrices. Mathematica et Maple ont également des implémentations permanentes si vous pouvez y accéder.
Ma machine Les horaires seront exécutés sur ma machine 64 bits. Il s'agit d'une installation Ubuntu standard avec 8 Go de RAM, processeur AMD FX-8350 à huit cœurs et Radeon HD 4250. Cela signifie également que je dois pouvoir exécuter votre code.
Informations de bas niveau sur ma machine
cat /proc/cpuinfo/|grep flags
donne
drapeaux: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl sst fm scl sp sf f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb cpb hw_pstate vmmccl ns
Je vais poser une question de suivi multilingue étroitement liée qui ne souffre pas du gros problème d'Int afin que les amateurs de Scala , Nim , Julia , Rust , Bash puissent également montrer leurs langues.
Classement
- n = 33 (45 secondes. 64 secondes pour n = 34). Ton Hospel en C ++ avec g ++ 5.4.0.
- n = 32 (32 secondes). Dennis en C avec gcc 5.4.0 utilisant les drapeaux gcc de Ton Hospel.
- n = 31 (54 secondes). Christian Sievers à Haskell
- n = 31 (60 secondes). primo en rpython
- n = 30 (26 secondes). ezrast à Rust
- n = 28 (49 secondes). xnor avec Python + pypy 5.4.1
- n = 22 (25 secondes). Shebang avec Python + pypy 5.4.1
Remarque . Dans la pratique, les horaires de Dennis et Ton Hospel varient beaucoup pour des raisons mystérieuses. Par exemple, ils semblent être plus rapides après avoir chargé un navigateur Web! Les horaires cités sont les plus rapides de tous les tests que j'ai effectués.