Dado um vetor de n
valores, (x1,x2,x3,...,xn)
retorne o determinante da matriz de Vandermonde correspondente .
Este determinante pode ser escrito como:
Detalhes
Seu programa / função precisa aceitar uma lista de números de ponto flutuante em qualquer formato conveniente que permita um comprimento variável e gerar o determinante especificado.
Você pode assumir que a entrada e a saída estão dentro do intervalo dos valores que seu idioma suporta. Se o seu idioma não suportar números de ponto flutuante, você poderá assumir números inteiros.
Alguns casos de teste
Observe que sempre que houver duas entradas iguais, o determinante será o de 0
duas linhas iguais na matriz de Vandermonde correspondente. Agradecemos a @randomra por apontar esse caso de teste ausente.
[1,2,2,3] 0
[-13513] 1
[1,2] 1
[2,1] -1
[1,2,3] 2
[3,2,1] -2
[1,2,3,4] 12
[1,2,3,4,5] 288
[1,2,4] 6
[1,2,4,8] 1008
[1,2,4,8,16] 20321280
[0, .1, .2,...,1] 6.6586e-028
[1, .5, .25, .125] 0.00384521
[.25, .5, 1, 2, 4] 19.3798828
code-golf
math
matrix
linear-algebra
flawr
fonte
fonte
[1,2,2,3] => 0
:: dois elementos iguais na matriz, para testar se o código verifica a auto-diferença (xi-xi
) apenas comparando com0
.Respostas:
Gelatina, 6 bytes
œc2
obtém todas as combinações sem substituir o comprimento 2.I
calcula a lista de diferenças de cada um desses pares, produzindo uma lista como[[1], [2], [3], ..., [1]]
. NósF
Latten e tomar oP
roduto.Experimente aqui!
fonte
Ruby,
4947 bytesEssa é uma função lambda que aceita uma matriz unidimensional com valor real e retorna um número flutuante ou um número inteiro, dependendo do tipo da entrada. Para chamá-lo, atribua-o a uma variável e faça
f.call(input)
.Obtemos todas as combinações de tamanho 2 usando
.combination(2)
e obtemos as diferenças para cada par usando.map {|a, b| b - a}
. Juntamos a matriz resultante em uma sequência separada por*
, entãoeval
isto, que retorna o produto. Se a entrada tiver comprimento 1, será onil
que é falsey em Ruby, para que possamos||1
retornar no final 1 nessa situação. Observe que isso ainda funciona quando o produto é 0 porque, por qualquer motivo, 0 é verdadeiro no Ruby.Verifique todos os casos de teste online
Economizou 2 bytes graças a Maçaneta!
fonte
Mathematica, 30 bytes
Esta é uma função anônima.
Expandido pelo Mathematica, é equivalente a
(1 ##1 & ) @@ Apply[#2 - #1 & , Subsets[#1, {2}], {1}] &
.1##&
é equivalente aTimes
(página de dicas de agradecimento), que é aplicada a cada par distinto de elementos da lista de entrada, gerado porSubsets[list, {2}]
. Observe queSubsets
não verifica a exclusividade dos elementos.fonte
J, 13 bytes
Esta é uma função monádica que recebe uma matriz e retorna um número. Use-o assim:
Explicação
Construo explicitamente a matriz de Vandermonde associada à matriz de entrada e depois calculo seu determinante.
fonte
.
também é um carácter modificador. O mesmo por:
si só.∘
), como anotando J ... O incrivelmente sobrecarregado.
e:
(que novamente é visualmente o mesmo que dois.
s empilhados ) tornam J difícil de ler (para mim). Quanto mais quando o espaço em branco ao lado dos pontos determina o significado! J.
deve ser o símbolo mais sobrecarregado de toda a história da computação: conto 53 significados distintos de.
e 43 (61 se você contar todos )_9:
até9:
significados distintos de:
. Yukk. ;-)MATL , 9
Experimente online!
Isso calcula uma matriz de todas as diferenças e mantém apenas a parte abaixo da diagonal principal, fazendo as outras entradas
1
para que elas não afetem o produto. A função triangular inferior cria os elementos indesejados0
, não1
. Então subtraímos1
, pegamos a parte triangular inferior e adicionamos de1
volta. Então podemos pegar o produto de todas as entradas.fonte
2Xn!dp
só parece funcionar com valores individuais quando o valor for maior ou igual a 2 ... eu tinha escrito isso sozinho tentando bater Jelly: PXn
fizer uma verificação comoif size(arg) == [1,1] ...
algo assim. Estou com preguiça de procurar a fonte, mas (espero) não deve ser tão difícil.1
ou0
e não faz diferença se a primeira entrada for interpretada como matriz ou como um número. O verdadeiro problema é que a segunda entrada não pode exceder o tamanho da matriz. "Quantas maneiras existem para escolher 2 elementos de 1 elemento". Nesse caso, a diferença de matriz / número importa: se a primeira entrada for um retorno de matriz[]
(matriz vazia), se for um retorno de número0
. Acho que vou voltar[]
, porque depoisp
força a outra interpretação.Pitão,
15131211 bytesObrigado a @FryAmTheEggman e @ Pietu1998 por um byte cada!
fonte
Mathematica, 32 bytes
Fiquei surpreso ao não encontrar um material para as coisas de Vandermonde. Provavelmente porque é tão fácil fazer isso sozinho.
Este constrói explicitamente a transposição de uma VM e assume seu determinante (que é obviamente o mesmo que o original). Esse método acabou sendo significativamente mais curto do que o uso de qualquer fórmula que eu conheça.
fonte
Haskell, 34 bytes
Uma solução recursiva. Quando um novo elemento
h
é anexado à frente, a expressão é multiplicada pelo produto dex-h
para cada elementox
da lista. Obrigado ao Zgarb por 1 byte.fonte
Matlab, 26 bytes
(não competitivo)
Uso direto de componentes internos. Observe que (mais uma vez) o Matlab's
vander
cria matrizes de Vandermonde, mas com a ordem das linhas invertidas.fonte
Ferrugem, 86 bytes
Ferrugem, detalhada como sempre ...
A explicação virá mais tarde (embora seja bastante simples).
fonte
Perl, 38
41bytesIncluir +1 para
-p
Dê os números em uma linha no STDIN. Então, por exemplo, corra como
Use uma regex maligna para obter o loop duplo:
vandermonde.pl
:fonte
JavaScript (ES6), 61 bytes
Eu tentei uma compreensão de matriz (Firefox 30-57) e era 5 bytes mais:
O loop aninhado chato é provavelmente mais curto.
fonte
Haskell, 53 bytes
Exemplo de uso:
f [1,2,4,8,16]
->20321280
.Percorra os índices
j
ei
em um loop aninhado e faça uma lista das diferenças dos elementos na posiçãoj
ei
. Faça o produto de todos os elementos na lista.Outras variantes que se revelaram um pouco mais longas:
f x=product[last l-i|l<-scanl1(++)$pure<$>x,i<-init l]
, 54 bytesimport Data.List;f i=product[y-x|[x,y]<-subsequences i]
, 55 bytesfonte
CJam, 16 bytes
Em resposta à postagem de A Simmons ' , apesar da falta de um operador de combinações de CJam, sim, é possível fazer melhor :)
-1 byte graças a @ MartinBüttner.
Experimente online | Suíte de teste
fonte
CJam, 32 bytes
Tenho certeza de que alguém pode jogar isso melhor no CJam ... O principal problema é que não consigo ver uma boa maneira de obter os subconjuntos para que consuma a maioria dos meus bytes. Isso gera o conjunto de potência (usando uma idéia de Martin Büttner) e, em seguida, seleciona os elementos comprimento-2.
fonte
R , 41 bytes
Experimente online!
Fiquei surpreso ao não ver uma resposta R aqui!
fonte
Perl 5
-pa
, 36 bytesExperimente online!
fonte