Avión explotar

10

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 (0,0) de una curva algebraica en 2D. Una curva algebraica en 2D viene dada por el locus cero de un polinomio en dos variables ( p(x,y)=x2+y21 Ej. P ( x , y ) = x 2 + y 2 - 1 para el círculo unitario, o p(x,y)=y-X2 para una parábola). La explosión de esa curva (en (0 0,0 0)) viene dada por dos polinomios como se define a continuación. Tanto como describen con la (posible) singularidad en ( 0 , 0 ) eliminada.r,srspags(0 0,0 0)

Desafío

Dado algún polinomio pags , encuentre r y s 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 pags en dos variables X,y la explosión viene dada por dos polinomios r,s nuevamente cada uno en dos variables.

Para obtener r primero definimos R(X,v): =pags(X,vX) . Entonces R(X,v) es probablemente un múltiplo de X , es decir, R(X,v)=Xnorter(X,v) para algún n donde x no divide r(x,v) . Entoncesr(x,v) 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 S(u,y):=p(uy,y) . Entonces s se define de manera tal que S(u,y)=yms(u,y) para algunos m donde y no divide s(u,y) .

Para hacerlo más claro, considere seguir

Ejemplo

Considere la curva dada por el locus cero de p(x,y)=y2(1+x)x2 . (Tiene una singularidad en (0,0) porque no hay tangente bien definida en ese punto).

Entonces encontramos

R(x,v)=p(x,vx)=v2x2(1+x)x2=x2(v21x)

Entonces r(X,v)=v2-1-X es el primer polinomio.

similar

S(tu,y)=pags(tuy,y)=y2-(1+tuy)tu2y2=y2(1-(1+tuy)tu2)

Entonces s(tu,y)=1-(1+tuy)tu2=1-tu2+tu3y .

rs

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 -1se 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

pags r s

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

pags r s

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]]
falla
fuente
77
Este título definitivamente no es lo que pensé que era ...
negativo siete
Caso_prueba sugerido:0+x+x^2+x^3+x^4
user41805
@Cowsquack ¡Lo agregó!
error

Respuestas:

5

Python 3 + numpy, 165 134 bytes

lambda p:(r(p),r(p.T).T)
from numpy import*
def r(p):w,l=where(p);s=w+l;n=min(s);o=zeros((len(p),max(s)-n+1));o[w,s-n]=p[w,l];return o

Pruébalo en línea!

La función toma una numpymatriz 2D pcomo entrada y devuelve una tupla (r,s)de dos numpymatrices 2D.

rXjyyopagsXj+yo(yX)yoXj+yotuyopags(X,tuX)(metro+1)×(norte+1)PAGS(metro+1)×(metro+norte-1)repags(X,tuX)re[yo,j+yo]=PAGS[yo,j]reRr

sXyRPAGST

El siguiente código no reflejado muestra el proceso de cálculo anterior.

Sin Golf (Básico)

import numpy as np

def r(p):
    num_rows, num_cols = p.shape
    deg_mat = np.zeros((num_rows, num_rows + num_cols - 1))
    for i, row in enumerate(p):
        deg_mat[i, i:i+num_cols] = row
    non_zero_col_idx, = np.where(deg_mat.any(axis=0))
    return deg_mat[:,non_zero_col_idx.min():non_zero_col_idx.max()+1]

def rs(p):
    return r(p), r(p.T).T

Pruébalo en línea!

RR[yo,j+yo-C]=PAGS[yo,j]C=minPAGS[yo,j]0 0yo+j .

Sin golf (mejorado)

import numpy as np

def r(p):
    y_deg, x_deg = np.where(p)  # Retrieve degrees of y and x for non-zero elements in p
    total_deg = y_deg + x_deg
    min_total_deg = total_deg.min()
    max_total_deg = total_deg.max()
    out = np.zeros((p.shape[0], max_total_deg - min_total_deg + 1))
    out[y_deg, y_deg + x_deg - min_total_deg] = p[y_deg, x_deg]
    return out

def rs(p):
    return r(p), r(p.T).T

Pruébalo en línea!

Joel
fuente
3

APL (Dyalog Unicode) , 38 37 bytes

1 byte guardado gracias a ngn usando +/∘⍴en lugar del literal ficticio0

⊢∘⍉\+/∘⍴{q↓⍨⊃⍸×∨/q←(-⍳≢⍉⍵)⊖⍺↑⍵}¨⊂,⊂∘⍉

Pruébalo en línea!

(un tren con ⎕io(origen del índice) establecido como 0)

argumento derecho adjunto

, concatenado con

  • ⊂∘ adjunto

  • argumento correcto transpuesto

sr

¨ en cada

+/∘⍴{ ... } realiza la siguiente función con argumento izquierdo

  • +/ suma

      • la forma del argumento correcto, es decir, obtener filas + columnas

y 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

vXtuyyX 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 variable q

Xy , se deben eliminar las primeras filas de 0.

∨/ 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, 00y número positivo → 1

índices de verdades, es decir, índices de 1s

elige el primer elemento, ⊃⍸simplemente obtiene el índice del primer 1

q↓⍨elimina esa cantidad de filas q, nuevamente ⎕io←0ayuda a devolver el valor correcto para eliminar las primeras filas de 0

(función de salida)

sr⊢∘⍉\


Otros enfoques se enumeran a continuación.

⍝(⊢∘⍉\+/∘⍴{q↓⍨⊃⍸×∨/q←(-⍳≢⍉⍵)⊖⍺↑⍵}¨⊂,⊂∘⍉)¨a
⍝(⊢∘⍉\∘⌽⍴{q↓⍨⊃⍸×∨/q←(-⍳⍺)⊖⍵↑⍨+/⍴⍵}¨⊂∘⍉,⊂)¨a
⍝(⊢∘⍉\⌽∘⍴{q↓⍨⊃⍸×∨/q←(-⍳⍺)⊖⍵↑⍨+/⍴⍵}¨⊂,⊂∘⍉)¨a
⍝(⊢∘⍉\0{q↓⍨⊃⍸×∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵}¨⊂,⊂∘⍉)¨a
⍝(⊢∘⍉\+/∘⍴({⍵↓⍨⊃⍸×∨/⍵}(-∘⍳1⊃⊢∘⍴)⊖↑)¨⊂,⊂∘⍉)¨a
⍝(⊂∘⍉∘⊃@0⍴{q↓⍨⊃⍸×∨/q←(-⍳⍺)⊖⍵↑⍨+/⍴⍵}¨⊂∘⍉,⊂)¨a
⍝{⊢∘⍉\{q↓⍨⊃⍸×∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵}¨⍵(⍉⍵)}¨a
⍝(⊢∘⍉\(({⍵↓⍨⊃⍸×∨/⍵}(-∘⍳1⊃⍴)⊖⊢↑⍨1⊥⍴)¨⊂,⊂∘⍉))¨a
⍝(0 1{⍉⍣⍺⊢q↓⍨⊃⍸×∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵}¨⊂,⊂∘⍉)¨a
⍝{⊢∘⍉\{q[;⍸×∨\∨q←↑(,\0⍴⍨≢⍵),¨↓⍵]}¨⍵(⍉⍵)}¨a
⍝{⊢∘⍉\{q↓⍨1⍳⍨×∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵}¨⍵(⍉⍵)}¨a
⍝(⊢∘⍉\(((⊢↓⍨1⍳⍨0≠∨/)(-∘⍳1⊃⍴)⊖⊢↑⍨1⊥⍴)¨⊂,⊂∘⍉))¨a
⍝{⊢∘⍉\{q[⍸×∨\∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵;]}¨⍵(⍉⍵)}¨a
⍝{⊢∘⍉\{q↓⍨+/0=∨\∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵}¨⍵(⍉⍵)}¨a
⍝{⊢∘⍉\{q↓⍨⌊/+⌿∧⍀0=q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵}¨⍵(⍉⍵)}¨a
⍝(⌽∘⍉¨1↓({⊖⍉q[⍸×∨\∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵;]}\3/⊂))¨a
⍝{⊢∘⍉\{↑(↓q)/⍨∨∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵}¨⍵(⍉⍵)}¨a
f←⊢∘⍉\⋄{f{q[⍸×∨\∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵;]}¨f⍵⍵}¨a
⍝{1↓⌽∘⍉¨{⊖⍉q[⍸×∨\∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵;]}\3/⊂⍵}¨a
⍝{f←{q[⍸×∨\∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵;]}⋄(f⍵)(⍉f⍉⍵)}¨a
⍝{⊢∘⍉\{↑(↓q)/⍨∨\0≠∨/q←(-⍳≢⍉⍵)⊖⍵↑⍨+/⍴⍵}¨⍵(⍉⍵)}¨a
⍝{⊢∘⍉\{(0~⍨∊⍵)@(↓⍉(⊢-⌊/)@1+⍀⍉↑⍸0≠⍵)⊢0⍴⍨,⍨⌈/⍴⍵}¨⍵(⍉⍵)}¨a
usuario41805
fuente