El Blow-up es una herramienta poderosa en geometría algebraica. Permite la eliminación de singularidades de conjuntos algebraicos mientras preserva el resto de su estructura.
Si no está familiarizado con nada de eso, no se preocupe, el cálculo real no es difícil de entender (ver más abajo).
A continuación, consideraremos la explosión del punto de una curva algebraica en 2D. Una curva algebraica en 2D viene dada por el locus cero de un polinomio en dos variables ( Ej. P ( x , y ) = x 2 + y 2 - 1 para el círculo unitario, o para una parábola). La explosión de esa curva (en ) viene dada por dos polinomios como se define a continuación. Tanto como describen con la (posible) singularidad en ( 0 , 0 ) eliminada.
Desafío
Dado algún polinomio , encuentre y como se define a continuación.
Definición
En primer lugar, tenga en cuenta que todo lo que digo aquí está simplificado y no se corresponde completamente con las definiciones reales.
Dado un polinomio en dos variables la explosión viene dada por dos polinomios nuevamente cada uno en dos variables.
Para obtener primero definimos . Entonces es probablemente un múltiplo de , es decir, para algún donde no divide . Entonces es básicamente lo que queda después de la división.
El otro polinomio se define exactamente igual, pero cambiamos las variables: Primero escribimos . Entonces se define de manera tal que para algunos donde no divide .
Para hacerlo más claro, considere seguir
Ejemplo
Considere la curva dada por el locus cero de . (Tiene una singularidad en porque no hay tangente bien definida en ese punto).
Entonces encontramos
Entonces es el primer polinomio.
similar
Entonces .
Formato de entrada / salida
(Igual que aquí .) Los polinomios se representan dados como (m+1) x (n+1)
matrices / listas de listas de coeficientes enteros, en el siguiente ejemplo los términos de los coeficientes se dan en su posición:
[ 1 * 1, 1 * x, 1 * x^2, 1 * x^3, ... , 1 * x^n ]
[ y * 1, y * x, y * x^2, y * x^4, ... , y * x^n ]
[ ... , ... , ... , ... , ... , ... ]
[ y^m * 1, y^m * x, y^m * x^2, y^m * x^3 , ..., y^m * x^n]
Entonces una elipse 0 = x^2 + 2y^2 -1
se representaría como
[[-1, 0, 1],
[ 0, 0, 0],
[ 2, 0, 0]]
Si lo prefieres también puedes intercambiar x
y y
. En cada dirección se le permite tener ceros finales (es decir, coeficientes de grados más altos que son solo cero). Si es más conveniente, también puede tener matrices escalonadas (en lugar de una rectangular) de modo que todas las sub-matrices no contengan ceros finales.
- El formato de salida es el mismo que el formato de entrada.
Ejemplos
Más para agregar ( fuente para más )
Trifolium
p(x,y) = (x^2 + y^2)^2 - (x^3 - 3xy^2)
r(x,v) = v^4 x + 2 v^2 x + x + 3 v^2 - 1
s(u,y) = u^4 y + 2 u^2 y + y - u^3 + 3 u
Descartes Folium
p(x,y) = y^3 - 3xy + x^3
r(x,v) = v^3 x + x - 3v
s(u,y) = u^3 y + y - 3u
Ejemplos sin fotos
Trifolium:
p:
[[0,0,0,-1,1],
[0,0,0, 0,0],
[0,3,2, 0,0],
[0,0,0, 0,0],
[1,0,0, 0,0]]
r: (using the "down" dimension for v instead of y)
[[-1,1],
[ 0,0],
[ 3,2],
[ 0,0],
[ 0,1]]
s: (using the "right" dimension for u instead of x)
[[0,3,0,-1,0],
[1,0,2, 0,1]]
Descartes Folium:
p:
[[0, 0,0,1],
[0,-3,0,0],
[0, 0,0,0],
[1, 0,0,0]]
r:
[[ 0,1],
[-3,0],
[ 0,0],
[ 0,1]]
s:
[[0,-3,0,0],
[1, 0,0,1]]
Lemniscate:
p:
[[0,0,-1,0,1],
[0,0, 0,0,0],
[1,0, 0,0,0]]
r:
[[-1,0,1],
[ 0,0,0],
[ 1,0,0]]
s:
[[1,0,-1,0,0],
[0,0, 0,0,0],
[0,0, 0,0,1]]
Powers:
p:
[[0,1,1,1,1]]
r:
[[1,1,1,1]]
s:
[[0,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,0],
[0,0,0,0,1]]
0+x+x^2+x^3+x^4
Respuestas:
Python 3 + numpy,
165134 bytesPruébalo en línea!
La función toma una
numpy
matriz 2Dp
como entrada y devuelve una tupla(r,s)
de dosnumpy
matrices 2D.El siguiente código no reflejado muestra el proceso de cálculo anterior.
Sin Golf (Básico)
Pruébalo en línea!
Sin golf (mejorado)
Pruébalo en línea!
fuente
APL (Dyalog Unicode) ,
3837 bytes1 byte guardado gracias a ngn usando
+/∘⍴
en lugar del literal ficticio0
Pruébalo en línea!
(un tren con
⎕io
(origen del índice) establecido como 0)⊂
argumento derecho adjunto,
concatenado con⊂∘
adjunto⍉
argumento correcto transpuesto¨
en cada+/∘⍴{ ... }
realiza la siguiente función con argumento izquierdo+/
suma⍴
la forma del argumento correcto, es decir, obtener filas + columnasy el argumento correcto será cada una de las matrices adjuntas.
⍺↑⍵
y tome el argumento izquierdo a⍺
muchas filas del argumento derecho⍵
, si⍵
es deficiente en filas (lo cual será porque filas + columnas> filas), se rellena con suficientes ceros⍵
⍵
⍵
se añaden efectivamente por la cantidad deseada de 0s.⊖
rotar columnas por⍉⍵
transpuesto⍵
≢
contar filas, todas juntas,≢⍉⍵
obtiene el número de columnas en⍵
⍳
rango 0 .. cuenta-1-
negado, para rotar en la otra dirección y el valor predeterminado para⊖
, en última instancia, producir 0 ¯1 ¯2 ... - (cuenta-1), esto se vectoriza automáticamente a través de cada columna de modo que la columna 0 se rote por 0, el 1-st por 1, ...q←
asignar esto a la variableq
∨/
reducir por LCM en cada fila, si la fila es todo-0, esto produce 0, de lo contrario da un número positivo×
obtener su signo,0
→0
y número positivo →1
⍸
índices de verdades, es decir, índices de 1s⊃
elige el primer elemento,⊃⍸
simplemente obtiene el índice del primer 1q↓⍨
elimina esa cantidad de filasq
, nuevamente⎕io←0
ayuda a⍸
devolver el valor correcto para eliminar las primeras filas de 0(función de salida)
⊢∘⍉\
Otros enfoques se enumeran a continuación.
fuente