introduction
Aujourd'hui, nous allons nous occuper du fléau des étudiants en première année d'algèbre linéaire: la précision de la matrice! Apparemment, cela n'a pas encore de défi, alors c'est parti:
Contribution
- Une matrice symétrique dans n'importe quel format pratique (vous pouvez bien sûr également ne prendre que la partie supérieure ou inférieure de la matrice)
- Facultativement: la taille de la matrice
Que faire?
Le défi est simple: étant donné une matrice à valeur réelle matrice décide si elle est définie positive en émettant une valeur véridique dans l'affirmative et une valeur de Falsey dans le cas contraire.
Vous pouvez supposer que vos éléments intégrés fonctionnent réellement avec précision et ne doivent donc pas prendre en compte les problèmes numériques qui pourraient conduire à un comportement incorrect si la stratégie / le code "de manière prouvable" devait donner le résultat correct.
Qui gagne?
C'est le code-golf , donc le code le plus court en octets (par langue) gagne!
Qu'est-ce qu'une matrice positive définie de toute façon?
Il existe apparemment 6 formulations équivalentes lorsqu'une matrice symétrique est définie positivement. Je vais reproduire les trois plus faciles et vous référer à Wikipedia pour les plus complexes.
- Si alors est défini positif. Cela peut être reformulé comme suit: Si pour chaque vecteur non nul, le produit scalaire (standard) de et est positif, alors est défini positif.
- Soit les valeurs propres de , si maintenant (c'est tout les valeurs propres sont positives) alors est défini de façon positive. Si vous ne savez pas quelles sont les valeurs propres, je vous suggère d'utiliser votre moteur de recherche préféré pour le découvrir, car l'explication (et les stratégies de calcul nécessaires) est trop longue pour être contenue dans cet article.A ∀ i ∈ { 1 , … , n } : λ i > 0 A
- Si la décomposition de Cholesky de existe, c'est-à-dire qu'il existe une matrice triangulaire inférieure telle que alors est défini positif. Notez que cela équivaut à un retour précoce "faux" si à tout moment le calcul de la racine pendant l'algorithme échoue en raison d'un argument négatif.
Exemples
Pour une sortie fidèle
Pour sortie falsey
(au moins une valeur propre est 0 / semi-définie positive)
(les valeurs propres ont des signes différents / indéfinis)
(toutes les valeurs propres inférieures à 0 / définie négative)
(toutes valeurs propres inférieures à 0 / définies négatives)
(toutes les valeurs propres inférieures à 0 / définies négatives)
(trois valeurs propres positives, une négative / indéfinie)
Réponses:
C, 108 octets
-1 octet grâce à Logern
-3 octets grâce à plafondcat
Essayez-le en ligne!
Effectue l'élimination gaussienne et vérifie si tous les éléments diagonaux sont positifs (critère de Sylvester). L'argument
n
est la taille de la matrice moins un.la source
i=0
dans la boucle for, effectuez l'appel récursiff(M,n-1,0)
et l'appel initial avec 0 comme troisième argument.MATLAB / Octave ,
191712 octetsEssayez-le en ligne!
La fonction eig fournit les valeurs propres par ordre croissant, donc si la première valeur propre est supérieure à zéro, les autres le sont aussi.
la source
f=
au début - les fonctions anonymes sont généralement acceptées comme réponses.8.9219e-17
plutôt que 0.Gelée ,
1110 octetsUtilise le critère de Sylvester .
Essayez-le en ligne!
Comment ça fonctionne
la source
R , 29 octets
Essayez-le en ligne!
Alternative utilisant cholesky:
R ,
3433 octetsEssayez-le en ligne!
-1 octet grâce à @Giuseppe
la source
Haskell , 56 octets
Essayez-le en ligne!
Fondamentalement, un port de réponse de nwellnhof . Effectue l'élimination gaussienne et vérifie si les éléments de la diagonale principale sont positifs.
Échoue la première sortie de falsey en raison d'erreurs d'arrondi, mais cela fonctionnerait théoriquement avec une précision infinie.Grâce à la suggestion de Curtis Bechtel , maintenant les sorties sont toutes correctes.la source
inputs :: [[[Rational]]]
pour obtenir des réponses correctesWolfram Language (Mathematica) , 20 octets
Essayez-le en ligne!
la source
MATL , 4 octets
Essayez-le en ligne!
[3 -2 2; -2 4 0; 2 0 2]
0
la source
[1 2 3j]
est FalseyMathematica,
2928 octetsDéfinition 2.
la source
Julia 1.0 , 28 octets
Essayez-le en ligne!
Julia 0,6 , 8 octets
Essayez-le en ligne!
la source
MATL , 6 octets
Il est possible de le faire en utilisant encore moins d'octets, @Mr. Xcoder a réussi à trouver une réponse MATL de 5 octets !
Explication
Essayez-le en ligne!
la source
Érable , 33 octets
(c'est-à-dire mes 2 cents)
la source
JavaScript (ES6),
99 9588 octetsEssayez-le en ligne!
la source