Introdução
Hoje nós vamos cuidar da desgraça dos alunos do primeiro ano de álgebra linear: definição de matriz! Aparentemente, isso ainda não tem um desafio, então vamos lá:
Entrada
- Uma Matriz simétrica em qualquer formato conveniente (você também pode, naturalmente, pegar apenas a parte superior ou a parte inferior da matriz)
- Opcionalmente: o tamanho da matriz
O que fazer?
O desafio é simples: dada uma matriz com valor real Matriz decide se é definida positivamente emitindo um valor verdadeiro, se for o caso, e um valor falsey, se não.
Você pode supor que seus internos realmente funcionem com precisão e, portanto, não sejam responsáveis por problemas numéricos que podem levar ao comportamento errado se a estratégia / código "provável" produzir o resultado correto.
Quem ganha?
Isso é código-golfe , então o código mais curto em bytes (por idioma) vence!
O que é uma matriz positiva definida de qualquer maneira?
Aparentemente, existem 6 formulações equivalentes de quando uma matriz simétrica é definida positivamente. Vou reproduzir os três mais fáceis e referenciá-lo à Wikipedia para os mais complexos.
- Se então é positivo-definido.
Isto pode ser formulado como re-:
Se para cada diferente de zero vetor o (padrão) dot produto de e for positivo, então será positivo. - Seja são osautovaloresde , se agora (ou seja, todos os autovalores são positivos), então é positivo-definido.
Se você não sabe quais são os autovalores, sugiro que você use seu mecanismo de pesquisa favorito para descobrir, porque a explicação (e as estratégias de computação necessárias) é muito longa para ser contida neste post. - Se a decomposição de Cholesky de existe, isto é, existe uma matriz triangular inferior tal que então é definida positiva. Observe que isso é equivalente a "false" de retorno antecipado se a qualquer momento o cálculo da raiz durante o algoritmo falhar devido a um argumento negativo.
Exemplos
Para saída de verdade
Para saída falsey
(pelo menos um valor próprio é 0 / semi-definido positivo)
(valores próprios têm sinais diferentes / indefinidos)
(todos os autovalores menores que 0 / negativo definido)
(todos os autovalores menores que 0 / definido negativo)
(todos os autovalores menores que 0 / definido negativo)
(três positivos, um autovalor negativo / indefinido)
fonte
Respostas:
C, 108 bytes
-1 byte graças ao Logern
-3 bytes graças ao ceilingcat
Experimente online!
Executa a eliminação gaussiana e verifica se todos os elementos diagonais são positivos (critério de Sylvester). Argumento
n
é o tamanho da matriz menos um.fonte
i=0
o loop for, efetuar a chamada recursivaf(M,n-1,0)
e a chamada inicial com 0 como o terceiro argumento.MATLAB / Oitava ,
191712 bytesExperimente online!
A função eig fornece os autovalores em ordem crescente, portanto, se o primeiro autovalor for maior que zero, os outros também.
fonte
f=
no início - funções anônimas geralmente são aceitas como respostas.8.9219e-17
ao invés de 0.Geléia ,
1110 bytesUsa o critério de Sylvester .
Experimente online!
Como funciona
fonte
R , 29 bytes
Experimente online!
Alternativa usando cholesky:
R ,
3433 bytesExperimente online!
-1 byte graças a @ Giuseppe
fonte
Haskell , 56 bytes
Experimente online!
Basicamente, um porto de resposta do nwellnhof . Executa a eliminação gaussiana e verifica se os elementos na diagonal principal são positivos.
Falha na primeira saída falsey devido a erros de arredondamento, mas teoricamente funcionaria com precisão infinita.Graças à sugestão de Curtis Bechtel , agora os resultados estão todos corretos.fonte
inputs :: [[[Rational]]]
para obter respostas corretasWolfram Language (Mathematica) , 20 bytes
Experimente online!
fonte
MATL , 4 bytes
Experimente online!
Percebi que, para o10- 18 . Portanto, isso falha no primeiro caso de teste falso devido a problemas de precisão. Agradecemos a Luis Mendo por apontar que uma matriz não vazia é verdadeira se todas as suas entradas diferirem de 0, economizando 1 byte.
[3 -2 2; -2 4 0; 2 0 2]
caso de teste, o MATL calcula o0
autovalor com uma imprecisão muito pequena, calculando algo tão baixo quantofonte
[1 2 3j]
é o falseyMathematica,
2928 bytesDefinição 2.
fonte
Julia 1.0 , 28 bytes
Experimente online!
Julia 0,6 , 8 bytes
Experimente online!
fonte
MATL , 6 bytes
É possível fazer isso usando ainda menos bytes, @Mr. O Xcoder conseguiu encontrar uma resposta MATL de 5 bytes !
Explicação
Experimente online!
fonte
Bordo , 33 bytes
(ou seja, meus 2 centavos)
fonte
JavaScript (ES6),
99 9588 bytesO mesmo método da resposta de nwellnhof . Devoluções0 0 ou 1 .
Experimente online!
fonte