Dado un vector de n
valores (x1,x2,x3,...,xn)
devuelve el determinante de la matriz de Vandermonde correspondiente .
Este determinante se puede escribir como:
Detalles
Su programa / función tiene que aceptar una lista de números de coma flotante en cualquier formato conveniente que permita una longitud variable y generar el determinante especificado.
Puede suponer que tanto la entrada como la salida están dentro del rango de los valores que admite su idioma. Si su idioma no admite números de coma flotante, puede suponer enteros.
Algunos casos de prueba
Tenga en cuenta que siempre que haya dos entradas iguales, el determinante será 0
ya que hay dos filas iguales en la matriz de Vandermonde correspondiente. Gracias a @randomra por señalar este caso de prueba perdido.
[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
falla
fuente
fuente
[1,2,2,3] => 0
: dos elementos iguales en la matriz, para comprobar si el código comprueba la diferencia propia (xi-xi
) simplemente comparándolo con0
.Respuestas:
Jalea, 6 bytes
œc2
obtiene todas las combinaciones sin reemplazar la longitud 2.I
calcula la lista de diferencias de cada uno de esos pares, produciendo una lista como[[1], [2], [3], ..., [1]]
. NosF
aferramos y tomamos elP
roducto.Pruébalo aquí!
fuente
Ruby,
4947 bytesEsta es una función lambda que acepta una matriz unidimensional de valor real y devuelve un flotante o un entero dependiendo del tipo de entrada. Para llamarlo, asígnelo a una variable y luego haga
f.call(input)
.Obtenemos todas las combinaciones de tamaño 2 usando
.combination(2)
y obtenemos las diferencias para cada par usando.map {|a, b| b - a}
. Unimos la matriz resultante en una cadena separada por*
, luegoeval
esto, que devuelve el producto. Si la entrada tiene longitud 1, esta seránil
, que es falsey en Ruby, por lo que||1
al final podemos devolver 1 en esta situación. Tenga en cuenta que esto todavía funciona cuando el producto es 0 porque, por cualquier razón, 0 es verdadero en Ruby.Verifique todos los casos de prueba en línea
¡Ahorré 2 bytes gracias a Doorknob!
fuente
Mathematica, 30 bytes
Esta es una función anónima.
Ampliado por Mathematica, es equivalente a
(1 ##1 & ) @@ Apply[#2 - #1 & , Subsets[#1, {2}], {1}] &
.1##&
es un equivalente paraTimes
(página de consejos de agradecimiento), que se aplica a cada par distinto de elementos de la lista de entrada, generado porSubsets[list, {2}]
. Tenga en cuenta queSubsets
no verifica la unicidad de los elementos.fuente
J, 13 bytes
Esta es una función monádica que toma una matriz y devuelve un número. Úselo así:
Explicación
Construyo explícitamente la matriz de Vandermonde asociada con la matriz de entrada, y luego calculo su determinante.
fuente
.
que también es un carácter modificador. Lo mismo para:
por sí solo.∘
), como al escribir con J ... El increíblemente sobrecargado.
y:
(que de nuevo es visualmente el mismo que dos.
s apilados ) hace que J sea difícil de leer (para mí). ¡Cuánto más cuando los espacios en blanco al lado de los puntos determinan el significado! J.
debe ser el símbolo más sobrecargada en toda la historia de computación: Cuento 53 de significados distintos.
y 43 (61 si se cuentan todas_9:
a9:
) significados distintos de:
. Yukk ;-)MATL , 9
Pruébalo en línea!
Esto calcula una matriz de todas las diferencias y luego mantiene solo la parte debajo de la diagonal principal, haciendo las otras entradas
1
para que no afecten al producto. La función triangular inferior hace que los elementos0
no deseados , no1
. Entonces restamos1
, tomamos la parte triangular inferior y sumamos de1
nuevo. Entonces podemos tomar el producto de todas las entradas.fuente
2Xn!dp
solo parece funcionar con valores únicos cuando el valor es mayor o igual a 2 ... Lo escribí yo mismo tratando de vencer a Jelly: PXn
hacer un chequeo comoif size(arg) == [1,1] ...
o algo así. Soy demasiado vago para mirar a través de la fuente, pero (con suerte) no debería ser tan difícil.1
o0
y no hay diferencia si la primera entrada se interpreta como una matriz o como un número. El verdadero problema es que la segunda entrada no puede exceder el tamaño de la matriz. "¿Cuántas maneras hay para elegir 2 elementos de 1 elemento". En este caso, la diferencia de matriz / número es importante: si la primera entrada es un retorno de matriz[]
(matriz vacía), si es una devolución de número0
. Creo que volveré[]
, porque luegop
obliga a la otra interpretaciónPyth,
15131211 bytesGracias a @FryAmTheEggman y @ Pietu1998 por un byte cada uno.
fuente
Mathematica, 32 bytes
Me sorprendió no encontrar un lugar para las cosas de Vandermonde. Probablemente porque es muy fácil hacerlo uno mismo.
Éste construye explícitamente la transposición de una VM y toma su determinante (que, por supuesto, es el mismo que el original). Este método resultó ser significativamente más corto que el uso de cualquier fórmula que conozco.
fuente
Haskell, 34 bytes
Una solución recursiva. Cuando
h
se antepone un nuevo elemento al frente, la expresión se multiplica por el producto dex-h
para cada elementox
de la lista. Gracias a Zgarb por 1 byte.fuente
Matlab, 26 bytes
(sin competencia)
Uso directo de los incorporados. Tenga en cuenta que (una vez más) Matlab's
vander
crea matrices de Vandermonde pero con el orden de las filas invertido.fuente
Óxido, 86 bytes
Óxido, detallado como siempre ...
La explicación vendrá más tarde (sin embargo, es bastante sencillo).
fuente
Perl, 38
41bytesIncluye +1 para
-p
Dé los números en una línea en STDIN. Entonces, por ejemplo, correr como
Usa una expresión regular malvada para obtener el doble bucle:
vandermonde.pl
:fuente
JavaScript (ES6), 61 bytes
Probé una comprensión de matriz (Firefox 30-57) y fue 5 bytes más larga:
Sin embargo, el bucle anidado aburrido es probablemente más corto.
fuente
Haskell, 53 bytes
Ejemplo de uso:
f [1,2,4,8,16]
->20321280
.Ir a través de los índices
j
yi
en un bucle anidado y hacer una lista de las diferencias de los elementos en la posiciónj
yi
. Haga el producto de todos los elementos en la lista.Otras variantes que resultaron ser un poco más largas:
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 bytesfuente
CJam, 16 bytes
En respuesta a la publicación de A Simmons , a pesar de la falta de un operador de combinaciones de CJam, sí, es posible hacerlo mejor :)
-1 byte gracias a @ MartinBüttner.
Pruébalo en línea | Banco de pruebas
fuente
CJam, 32 bytes
Estoy seguro de que alguien puede jugar mejor en CJam ... El problema principal es que no puedo ver una buena manera de obtener los subconjuntos para que use la mayoría de mis bytes. Esto genera el conjunto de potencia (utilizando una idea de Martin Büttner) y luego selecciona los elementos de longitud 2.
fuente
R , 41 bytes
Pruébalo en línea!
¡Me sorprendió no ver una respuesta R aquí!
fuente
Perl 5
-pa
, 36 bytesPruébalo en línea!
fuente