Avec une matrice entière carrée en entrée, sortie le déterminant de la matrice.
Règles
- Vous pouvez supposer que tous les éléments de la matrice, le déterminant de la matrice et le nombre total d'éléments de la matrice sont compris dans la plage d'entiers pouvant être représentés pour votre langue.
- La sortie d'une valeur décimale / float avec une partie décimale de 0 est autorisée (par exemple à la
42.0
place de42
). - Les commandes intégrées sont autorisées, mais vous êtes invité à inclure une solution qui ne les utilise pas.
Cas de test
[[42]] -> 42
[[2, 3], [1, 4]] -> 5
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 0
[[13, 17, 24], [19, 1, 3], [-5, 4, 0]] -> 1533
[[372, -152, 244], [-97, -191, 185], [-53, -397, -126]] -> 46548380
[[100, -200, 58, 4], [1, -90, -55, -165], [-67, -83, 239, 182], [238, -283, 384, 392]] -> 571026450
[[432, 45, 330, 284, 276], [-492, 497, 133, -289, -28], [-443, -400, 56, 150, -316], [-344, 316, 92, 205, 104], [277, 307, -464, 244, -422]] -> -51446016699154
[[416, 66, 340, 250, -436, -146], [-464, 68, 104, 471, -335, -442], [159, -407, 310, -489, -248, 370], [62, 277, 446, -325, 47, -193], [460, 460, -418, -28, 234, -374], [249, 375, 489, 172, -423, 125]] -> 39153009069988024
[[-246, -142, 378, -156, -373, 444], [186, 186, -23, 50, 349, -413], [216, 1, -418, 38, 47, -192], [109, 345, -356, -296, -47, -498], [-283, 91, 258, 66, -127, 79], [218, 465, -420, -326, -445, 19]] -> -925012040475554
[[-192, 141, -349, 447, -403, -21, 34], [260, -307, -333, -373, -324, 144, -190], [301, 277, 25, 8, -177, 180, 405], [-406, -9, -318, 337, -118, 44, -123], [-207, 33, -189, -229, -196, 58, -491], [-426, 48, -24, 72, -250, 160, 359], [-208, 120, -385, 251, 322, -349, -448]] -> -4248003140052269106
[[80, 159, 362, -30, -24, -493, 410, 249, -11, -109], [-110, -123, -461, -34, -266, 199, -437, 445, 498, 96], [175, -405, 432, -7, 157, 169, 336, -276, 337, -200], [-106, -379, -157, -199, 123, -172, 141, 329, 158, 309], [-316, -239, 327, -29, -482, 294, -86, -326, 490, -295], [64, -201, -155, 238, 131, 182, -487, -462, -312, 196], [-297, -75, -206, 471, -94, -46, -378, 334, 407, -97], [-140, -137, 297, -372, 228, 318, 251, -93, 117, 286], [-95, -300, -419, 41, -140, -205, 29, -481, -372, -49], [-140, -281, -88, -13, -128, -264, 165, 261, -469, -62]] -> 297434936630444226910432057
You may assume that all elements in the matrix, the determinant of the matrix, and the total number of elements in the matrix are within the representable range of integers for your language.
Réponses:
Gelée , 15 octets
Essayez-le en ligne!
Comment ça marche
Pourquoi ça marche - version mathématique
L'opérateur det prend une matrice et retourne un scalaire. Une matrice n -by- n peut être considérée comme une collection de n vecteurs de longueur n , alors det est en réalité une fonction qui prend n vecteurs de n et renvoie un scalaire.
Par conséquent, j'écris det ( v 1 , v 2 , v 3 , ..., v n ) pour det [ v 1 v 2 v 3 ... v n ].
Notez que det est linéaire dans chaque argument, c'est-à-dire det ( v 1 + λ w 1 , v 2 , v 3 , ..., v n ) = det ( v 1 , v 2 , v 3 , ..., v n ) + λ det ( w 1 , v 2 , v 3 , ..., v n ). Par conséquent, il est une carte linéaire de (ℤ n ) ⊗ n à.
Il suffit de déterminer l’image de la base sous la carte linéaire. La base de (ℤ n ) ⊗ n est constitué de n produits tensoriels -fold des éléments de base de ℤ n , ieeg e 5 ⊗ e 3 ⊗ e 1 ⊗ e 5 ⊗ e 1 . Les produits de tenseurs comportant des tenseurs identiques doivent être mis à zéro, car le déterminant d'une matrice dans laquelle deux colonnes sont identiques est zéro. Il reste à vérifier à quoi sont envoyés les produits tensoriels d’éléments de base distincts. Les indices des vecteurs dans le produit tensoriel forment une bijection, c'est-à-dire une permutation, dans laquelle les permutations paires sont envoyées à 1 et les permutations impaires à -1.
Par exemple, pour trouver le déterminant de [[1, 2], [3, 4]]: notez que les colonnes sont [1, 3] et [2, 4]. Nous décomposons [1, 3] pour donner (1 e 1 + 3 e 2 ) et (2 e 1 + 4 e 2 ). L'élément correspondant dans le produit tenseur est (1 e 1 2 e 1 + 1 e 1 4 e 2 + 3 e 2 ⊗ 2 e 1 + 3 e 2 4 e 2 ), que nous simplifions en (2 e 1 ⊗ e 1 + 4 e 1 e 2 + 6 e 2 e 1 + 12 e 2 e 2). Par conséquent:
det [[1, 2], [3, 4]]
= det (1 e 1 + 3 e 2 , 2 e 1 + 4 e 2 )
= det (2 e 1 ≤ e 1 + 4 e 1 ≤ e 2 + 6 e 2 ⊗ e 1 + 12 e 2 e 2 )
= det (2 e 1 e 1 ) + det (4 e 1 ⊗ e 2 ) + det (6 e 2 e 1 ) + det (12 e2 ⊗ e 2 )
= 2 det (e 1 e 1 ) + 4 dét (e 1 e 2 ) + 6 dét (e 2 e 1 ) + 12 dét (e 2 e 2 )
= 2 (0) + 4 (1) + 6 (-1) + 12 (0)
= 4 - 6
= -2
Maintenant, il reste à prouver que la formule pour trouver la parité de la permutation est valide. Ce que fait mon code, c'est essentiellement trouver le nombre d'inversions, c'est-à-dire les endroits où un élément de gauche est plus grand qu'un élément de droite (pas nécessairement de manière consécutive).
Par exemple, dans la permutation 3614572, il y a 9 inversions (31, 32, 61, 64, 65, 62, 42, 52, 72), de sorte que la permutation est impair.
La justification est que chaque transposition (permutation de deux éléments) ajoute une inversion ou supprime une inversion en permutant la parité du nombre d'inversions et que la parité de la permutation est la parité du nombre de transpositions nécessaires pour obtenir la permutation.
Donc, en conclusion, notre formule est donnée par:
Pourquoi ça marche - version non mathématique
où σ est une permutation de n le groupe de toutes les permutations sur n lettres, et sgn est le signe de la permutation, AKA (-1) élevé à la parité de la permutation, et a ij est la ( ij ) ème entrée de la matrice ( i down, j across).
la source
R , 3 octets
Solution triviale
Essayez-le en ligne!
R ,
9492 octetssolution ré-implémentée
surclassé par Jarko Dubbeldam
Essayez-le en ligne!
Utilise de manière récursive le développement par des mineurs dans la première colonne de la matrice.
la source
Jelly ,
16151210 octetsUtilise l' extension Laplace . Merci à @miles pour le golf de
3 à5 octets!Essayez-le en ligne!
Comment ça marche
la source
Wolfram Language (Mathematica) , entre 14 et 42 octets
Nous avons des solutions intégrées à 3 octets et à 53 octets qui les évitent complètement. Voici donc des solutions plus bizarres.
Le langage Wolfram a beaucoup de fonctions très intenses pour décomposer les matrices en produits d'autres matrices à structure plus simple. L'un des plus simples (ce qui signifie que j'en ai entendu parler auparavant) est la décomposition de Jordan. Chaque matrice est similaire à une matrice triangulaire supérieure (éventuellement à valeurs complexes) constituée de blocs diagonaux de structure spécifique, appelée décomposition de Jordan de cette matrice. La similarité préserve les déterminants et le déterminant d'une matrice triangulaire est le produit des éléments diagonaux. Nous pouvons donc calculer le déterminant avec les 42 octets suivants :
Le déterminant est également égal au produit des valeurs propres d'une matrice, avec sa multiplicité. Heureusement, la fonction valeur propre de Wolfram garde la trace de la multiplicité (même pour les matrices non diagonalisables), nous obtenons donc la solution à 20 octets suivante :
La solution suivante consiste à tricher et je ne sais pas trop pourquoi cela fonctionne. Le Wronskian d'une liste de n fonctions est le déterminant de la matrice des n premières dérivées des fonctions. Si nous donnons à la
Wronskian
fonction une matrice d’entiers et que nous disons que la variable de différenciation est 1, elle détermine en quelque sorte le déterminant de la matrice. C'est bizarre, mais cela n'implique pas les lettres "Det
" et ce n'est que 14 octets ...(Le déterminant Casoratian fonctionne aussi bien, pour une plus octet:
#~Casoratian~1&
)Dans le domaine de l’algèbre abstraite, le déterminant d’une matrice n x n (considéré comme la carte k → k, multiplication par le déterminant) est la n- ième puissance extérieure de la matrice (après le choix d’un isomorphisme k → n k n ). En langage Wolfram, nous pouvons le faire avec les 26 octets suivants :
Et voici une solution qui ne fonctionne que pour les déterminants positifs. Si nous prenons un hypercube d'unité à n dimensions et lui appliquons une transformation linéaire, le "volume" à n dimensions de la région résultante est la valeur absolue du déterminant de la transformation. L'application d'une transformation linéaire à un cube donne un parallélépipède et nous pouvons prendre son volume avec les 39 octets de code suivants:
la source
Exp@*Tr@*MatrixLog
, mais malheureusement, cela ne fonctionne pas pour les matrices singulières.Check[E^Tr@MatrixLog@#,0]&
.Check
avant.Haskell , 71 octets
-3 octets grâce à Lynn. Un autre octroie la poussière grâce à Craig Roy.
Essayez-le en ligne! Ajout d'un
-O
drapeau à des fins d'optimisation. Ce n'est pas nécessaire.Explication (obsolète)
f
implémente de manière récursive l'expansion du cofacteur.Cette ligne couvre le cas de base d'une matrice 1 × 1 , auquel cas le déterminant est
mat[0, 0]
.Cela utilise la correspondance de motif de Haskell pour diviser la matrice en une tête (la première ligne) et une queue (le reste de la matrice).
Énumérez la tête de la matrice (en zippant la liste infinie de nombres entiers et la tête) et parcourez-la.
Annulez le résultat en fonction de l'indexation même ou non, car le calcul du déterminant implique une addition et une soustraction en alternance.
Cela supprime essentiellement la ième colonne de la queue en prenant i éléments et en la concaténant avec la ligne avec le premier (i + 1) ème éléments lâchés pour chaque ligne de la queue.
Calculez le déterminant du résultat ci-dessus et multipliez-le par le résultat de
(-1)*i*v
.Faites la somme du résultat de la liste ci-dessus et renvoyez-le.
la source
sum[(-1)^i*...
parfoldr(-)0[...
Proton , 99 octets
Essayez-le en ligne!
-3 octets grâce à Mr. Xcoder
-3 octets grâce à Erik the Outgolfer
Expansion sur la première rangée
la source
((~i%2)*2-1)
->((-i%2)|1)
j!=i
parj-i
oui-j
.Octave , 28 octets
Essayez-le en ligne!
Celui - ci utilise la décomposition QR d'une matrice X dans une matrice orthgonal Q et une matrice triangulaire supérieure R . Le déterminant de X est le produit de celles de Q et R . Une matrice orthogonale a un déterminant unitaire et pour une matrice triangulaire, le déterminant est le produit de ses entrées en diagonale. Octave
qr
fonction appelée avec une seule sortie donne R .Le résultat est arrondi à l'entier le plus proche. Pour les grandes matrices d’entrée, les imprécisions en virgule flottante peuvent produire un dépassement d’erreur
0.5
et donner ainsi un résultat erroné.la source
det
incident. ;)Haskell , 59 octets
Essayez-le en ligne!
la source
C,
176125 octetsMerci à @ceilingcat pour le jeu de 42 octets, et à @Lynn et @Jonathan Frech pour avoir sauvegardé un octet chacun!
Calcule le déterminant en utilisant l' extension de Laplace le long de la première ligne.
Essayez-le en ligne!
Déroulé:
la source
(i%2*-2+1)
→(1-i%2*2)
enregistre un octet supplémentaire.n+1+c
peut êtren-~c
.i=s
au lieu dereturn s
Gelée , 43 octets
Enfin, j'ai fini d'écrire ma solution non intégrée dans un langage de golf!
Merci à HyperNeutrino d' avoir sauvegardé un octet!
Essayez-le en ligne! (code espacé pour plus de clarté)
Un très long chemin pour supprimer les éléments d'une liste, s'améliorera plus tard
HyperNeutrino, Dennis et Leaky Nun avaient déjoué les réponses. La gelée est très populaire comme langue de golf.
Explication rapide:
la source
Gelée , 24 octets
Essayez-le en ligne!
Explication
-2 octets grâce à la solution de user202729
la source
MATL , 3 octets / 5 octets
Avec fonction intégrée
Essayez-le en ligne!
Sans incorporé
Merci à Misha Lavrov pour avoir signalé une erreur, maintenant corrigée
Essayez-le en ligne!
Ceci calcule le déterminant comme le produit des valeurs propres, arrondi au nombre entier le plus proche pour éviter les inexactitudes en virgule flottante.
la source
R , 32 octets
Utilise l'algorithme de Not a Tree pour prendre les valeurs propres de la matrice et prendre la partie réelle de leur produit.
Essayez-le en ligne!
la source
Octave , 30 octets
Essayez-le en ligne!
ou la solution ennuyeuse sur 4 octets (6 octets sauvegardés grâce à Luis Mendo (j'ai oublié les règles concernant les fonctions internes)):
Explication:
À venir! :)
la source
TI-Basic, 2 octets
Et bien.
S'il vous plaît ne pas upvote des réponses triviales.
En tant qu'élève du secondaire (qui est obligé de posséder une de ces calculatrices), cette fonction est très utile ...
la source
Haskell, 62 octets
Essayez-le en ligne! (Pied de page avec cas de test tirés de la solution de @ totallyhuman.)
d
calcule le déterminant en utilisant une extension de Laplace le long de la première colonne. A besoin de trois octets de plus que le permanent .la source
Python 2 , 95 octets
-12 octets grâce à Lynn.
Port de ma réponse Haskell .
Essayez-le en ligne!
la source
[]
comme cas de base:f=lambda m:sum((-1)**i*v*f([j[:i]+j[i+1:]for j in m[1:]])for i,v in enumerate(m[0]))if m else 1
pour 95 octets!m==[]or sum(...)
donne 92 octets.Wolfram Language (Mathematica) ,
5352 octetsEssayez-le en ligne!
Malheureusement, le calcul du déterminant d'une matrice n par n utilise de cette manière la mémoire O ( n n ), ce qui éloigne de nombreux cas de test.
Comment ça marche
La première partie,
1##&@@@(t=Tuples)@#
calcule tous les produits possibles d'un terme à partir de chaque ligne de la matrice donnée.t[Range@Tr[1^#]&/@#]
donne une liste de la même longueur dont les éléments sont des choses comme{3,2,1}
ou{2,2,3}
indiquant quelle entrée de chaque rangée nous avons sélectionnée pour le produit correspondant.Nous nous appliquons
Signature
à la deuxième liste, qui mappe les permutations même en1
, les permutations impaires-1
et les non-permutations0
. C'est précisément le coefficient avec lequel le produit correspondant apparaît dans le déterminant.Enfin, prenons le produit scalaire des deux listes.
Si pair
Signature
est trop intégré, à 73 octets, nous pouvons prendrele remplacer par
1##&@@Order@@@#~Subsets~{2}&
. Ceci calculeSignature
une éventuelle permutation en prenant le produit deOrder
appliqué à tous les couples d'éléments de la permutation.Order
donnera1
si la paire est dans l'ordre croissant,-1
si elle est dans l'ordre décroissant et0
si elles sont égales.-1 octet grâce à @ user202729
la source
Python 3 ,
238 octets,227 octets,224 octets, 216 octetsEssayez-le en ligne!
Ma solution utilise la définition d'un déterminant pour les calculs. Malheureusement, la complexité de cet algorithme est
n!
et je ne peux pas montrer le passage du dernier test, mais en théorie c'est possible.la source
CJam (
5045 octets)C'est un bloc anonyme (fonction) qui prend un tableau 2D sur la pile et laisse un entier sur la pile.
Suite de tests en ligne
Dissection
Cela implémente l' algorithme Faddeev-LeVerrier , et je pense que c'est la première réponse à adopter cette approche.
Le code ne fonctionne jamais directement avec et , mais toujours avec et , la récurrence est donccn−k Mk (−1)kcn−k (−1)k+1AMk (−1)kcn−k=1ktr((−1)k+1AMk)(−1)k+2AMk+1=(−1)kcn−kA−A((−1)k+1AMk)
la source
Wolfram Language (Mathematica) , 3 octets
Essayez-le en ligne!
Selon le méta-consensus , votez principalement pour les solutions non triviales qui demandent un effort d'écriture.
la source
Python 2 , 75 octets
Essayez-le en ligne!
la source
SageMath , divers
Voici un tas de méthodes pour calculer le déterminant que j'ai trouvé intéressant, toutes programmées dans SageMath. Ils peuvent tous être essayés ici .
Builtin, 3 octets
Celui-ci n'est pas trop intéressant. Sage fournit des alias de niveau global à de nombreuses opérations courantes qui seraient normalement des méthodes d'objet. C'est donc plus court que
lambda m:m.det()
.Partie réelle du produit des valeurs propres, 36 octets
Malheureusement, ce
eigenvalues
n'est pas l'un de ces alias de niveau global. Cela, combiné au fait que Sage n’a pas un moyen astucieux de composer des fonctions, signifie que nous avons un coût élevélambda
. Cette fonction contient des valeurs symboliques qui sont automatiquement converties en valeurs numériques lors de l’impression, de sorte que certaines sorties peuvent comporter une imprécision en virgule flottante.Produit de Diagonal en Jordanie, forme normale, 60 octets
Dans la forme Jordan normale, une matrice NxN est représentée sous la forme d’une matrice de blocs, avec N blocs sur la diagonale. Chaque bloc consiste en une seule valeur propre ou en une matrice MxM avec une valeur propre répétée sur la diagonale et
1
s sur la super-diagonale (la diagonale située au-dessus et à droite de la diagonale "principale"). Il en résulte une matrice avec toutes les valeurs propres (avec la multiplicité) sur la diagonale principale et certaines1
s sur la super-diagonale correspondant aux valeurs propres répétées. Ceci retourne le produit de la diagonale de la forme normale de Jordan, qui est le produit des valeurs propres (avec multiplicty). Il s’agit donc d’une manière plus détournée d’effectuer le même calcul que la solution précédente.Parce que Sage veut que la forme normale de Jordan recouvre le même anneau que la matrice d'origine, cela ne fonctionne que si toutes les valeurs propres sont rationnelles. Les valeurs propres complexes entraînent une erreur (à moins que la matrice d'origine ne soit au-dessus de l'anneau
CDF
(doubles flottants complexes) ouSR
). Cependant, cela signifie que prendre la partie réelle n’est pas nécessaire, par rapport à la solution ci-dessus.Produit de Diagonal dans Smith Decomposition
Contrairement à la forme normale de Jordan, la forme normale de Smith est garantie sur le même champ que la matrice d'origine. Plutôt que de calculer les valeurs propres et de les représenter avec une matrice en bloc diagonale, la décomposition de Smith calcule les diviseurs élémentaires de la matrice (sujet un peu trop compliqué pour cet article), les place dans une matrice diagonale
D
et calcule deux matrices à unité déterminantU
etV
tel queD = U*A*V
(oùA
est la matrice d'origine). Depuis le déterminant du produit de matrices est égal au produit des déterminants des matrices (det(A*B*...) = det(A)*det(B)*...
) etU
etV
sont définis pour avoir des déterminants de l' unité,det(D) = det(A)
. Le déterminant d'une matrice diagonale est simplement le produit des éléments sur la diagonale.Extension Laplace, 109 octets
Ceci effectue une expansion de Laplace le long de la première ligne, en utilisant une approche récursive.
det([[a]]) = a
est utilisé pour le cas de base. Son utilisation devrait être plus courtedet([[]]) = 1
pour le scénario de base, mais ma tentative d' implémentation comportait un bogue que je n'ai pas encore pu localiser.La formule de Leibniz, 100 octets
Ceci implémente directement la formule de Leibniz. Pour une bien meilleure explication de la formule et pourquoi cela fonctionne que je ne pourrais en écrire, voir cette excellente réponse .
Partie réelle de
e^(Tr(ln(M)))
, 48 octetsCette fonction renvoie des expressions symboliques. Pour obtenir une approximation numérique, appelez
n(result)
avant d’imprimer.C’est une approche que je n’ai encore vue utiliser. Je vais donner une explication plus longue et plus détaillée pour celle-ci.
Soit
A
une matrice carrée sur les réels. Par définition, le déterminant deA
est égal au produit des valeurs propres deA
. La trace deA
est égale à la somme desA
valeurs propres de. Pour les nombres réelsr_1
etr_2
,exp(r_1) * exp(r_2) = exp(r_1 + r_2)
. Puisque la fonction exponentielle de la matrice est définie comme étant analogue à la fonction exponentielle scalaire (en particulier dans l'identité précédente), et que l'exponentielle matricielle peut être calculée en diagonalisant la matrice et en appliquant la fonction exponentielle scalaire aux valeurs propres de la diagonale, nous pouvons diredet(exp(A)) = exp(trace(A))
(le produit deexp(λ)
chaque valeur propreλ
deA
est égale à la somme des valeurs propres deexp(A)
). Ainsi, si nous pouvons trouver une matriceL
telle queexp(L) = A
, nous pouvons calculerdet(A) = exp(trace(L))
.Nous pouvons trouver une telle matrice
L
en calculantlog(A)
. Le logarithme de la matrice peut être calculé de la même manière que l'exponentielle de la matrice: formez une matrice de diagonale carrée en appliquant la fonction du logarithme scalaire à chaque valeur propre deA
(c'est pourquoi nous nous sommes limitésA
aux réels). Puisque nous ne nous soucions que de la trace deL
, nous pouvons ignorer la construction et additionner directement les exponentielles des valeurs propres. Les valeurs propres peuvent être complexes, même si la matrice n'est pas au-dessus de l'anneau complexe, nous prenons donc la partie réelle de la somme.la source
real(prod(m.eigenvalues()))
non - golfé.Java 8,
266261259258 octetsRegarde maman, pas de construction .. car Java n'en a pas ..>.>
-7 octets grâce à @ceilingcat .
Explication:
Essayez ici. (Seul le dernier cas de test est trop volumineux pour tenir dans une
long
taille de 2 63 -1.)la source
JavaScript (ES6), 91
Laplace récursive
Moins golfé
Tester
la source
Python 2 + numpy , 29 octets
Essayez-le en ligne!
la source
Julia , 3 octets
Essayez-le en ligne!
la source
Pari / GP , 6 octets
Essayez-le en ligne!
la source
Java (OpenJDK 8) ,
195 192177 octetsEssayez-le en ligne!
Comme beaucoup d'autres réponses, cela utilise également la formule de Laplace. Une version légèrement moins golfée:
la source
J , 5 octets
Essayez-le en ligne!
la source