Avion exploser

10

Le Blow-up est un outil puissant en géométrie algébrique. Il permet la suppression des singularités de jeux algébriques tout en conservant le reste de leur structure.

Si vous n'êtes pas familier avec tout cela, ne vous inquiétez pas, le calcul réel n'est pas difficile à comprendre (voir ci-dessous).

Dans ce qui suit, nous considérons l' explosion du point d'une courbe algébrique en 2D. Une courbe algébrique en 2D est donnée par le lieu zéro d'un polynôme en deux variables (par exemple pour le cercle unitaire, ou pour une parabole). L' explosion de cette courbe (en ) est donnée par deux polynômes tels que définis ci-dessous. Les deux et font décrire avec le (possible) à la singularité enlevé.(0,0)p(x,y)=x2+y21p(x,y)=yx2 ( 0 , 0 ) r , s r s p ( 0 , 0 )(0,0)r,srsp(0,0)

Défi

Étant donné un polynôme , trouver et tels que définis ci-dessous.prs

Définition

Tout d'abord, notez que tout ce que je dis ici est simplifié et ne correspond pas complètement aux définitions réelles.

Étant donné un polynôme dans deux variables l' explosion est donnée par deux polynômes nouveau chacun dans deux variables.px,yr,s

Pour obtenir nous définissons d'abord . Alors est probablement un multiple de , c'est-à-dire pour certains où ne divise pas . Alors est fondamentalement ce qui reste après la division.rR(x,v):=p(x,vx)R(x,v)xR(x,v)=xnr(x,v)nxr(x,v)r(x,v)

L'autre polynôme est défini exactement de la même manière, mais nous inversons les variables: Écrivons d'abord . Alors est défini de telle sorte que pour un certain où ne divise pas .S(u,y):=p(uy,y)sS(u,y)=yms(u,y)mys(u,y)

Afin de le rendre plus clair, envisagez de suivre

Exemple

Considérons la courbe donnée par le lieu zéro de . (Il a une singularité à car il n'y a pas de tangente bien définie à ce point.)p(x,y)=y2(1+x)x2(0,0)

Ensuite, nous trouvons

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

Alors est le premier polynôme.r(x,v)=v21x

De même

S(u,y)=p(uy,y)=y2(1+uy)u2y2=y2(1(1+uy)u2)

Alors .s(u,y)=1(1+uy)u2=1u2+u3y

rs

Format d'entrée / sortie

(Idem qu'ici .) Les polynômes sont représentés donnés sous forme de (m+1) x (n+1)matrices / listes de listes de coefficients entiers, dans l'exemple ci-dessous les termes des coefficients sont donnés dans leur position:

[   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]

Donc, une ellipse 0 = x^2 + 2y^2 -1serait représentée comme

[[-1, 0, 1],
 [ 0, 0, 0],
 [ 2, 0, 0]]

Si vous préférez, vous pouvez également échanger xet y. Dans chaque direction, vous êtes autorisé à avoir des zéros de fin (c.-à-d. Des coefficients de degrés supérieurs qui sont juste nuls). Si cela est plus pratique, vous pouvez également avoir des tableaux échelonnés (au lieu d'un rectangulaire) de sorte que tous les sous-sous-tableaux ne contiennent pas de zéros de fin.

  • Le format de sortie est le même que le format d'entrée.

Exemples

Plus à ajouter ( source pour plus )

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

p 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

p r s

Exemples sans images

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]]
flawr
la source
7
Ce titre n'est certainement pas ce que je pensais ...
négatif sept
Cas de test suggéré:0+x+x^2+x^3+x^4
user41805
@Cowsquack l'a ajouté!
flawr

Réponses:

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

Essayez-le en ligne!

La fonction prend un numpytableau 2D pen entrée et renvoie un tuple (r,s)de deux numpytableaux 2D.

rxjyipxj+i(yx)ixj+iuip(x,ux)(m+1)×(n+1)P(m+1)×(m+n1)Dp(x,ux)D[i,j+i]=P[i,j]DRr

sxyRPT

Le code non golfé suivant montre le processus de calcul ci-dessus.

Non golfé (basique)

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

Essayez-le en ligne!

RR[i,j+ic]=P[i,j]c=minP[i,j]0i+j

Non golfé (amélioré)

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

Essayez-le en ligne!

Joel
la source
3

APL (Dyalog Unicode) , 38 37 octets

1 octet enregistré grâce à ngn en utilisant +/∘⍴à la place du littéral factice0

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

Essayez-le en ligne!

(un train avec ⎕io(origine de l'index) défini sur 0)

argument de droite joint

, concaténé avec

  • ⊂∘ enfermé

  • argument de droite transposé

s est calculé à partir du premier, partir du secondr

¨ sur chaque

+/∘⍴{ ... } effectuer la fonction suivante avec l'argument gauche

  • +/ somme

      • la forme de l'argument de droite, c'est-à-dire obtenir des lignes + colonnes

et le bon argument sera chacune des matrices incluses.

⍺↑⍵et prendre l'argument de gauche plusieurs lignes de l'argument de droite , s'il manque de lignes (ce qui sera parce que lignes + colonnes> lignes), il est rempli avec suffisamment de 0

Le calcul de la substitution de ou à la place de ou se fait en faisant tourner les colonnes de par leur index, et comme il est rempli de 0, les colonnes de sont effectivement ajoutées par la quantité souhaitée de 0.vxuyyx

faire pivoter les colonnes de

  • ⍉⍵ transposé

  • compter les lignes, tous ensemble, ≢⍉⍵obtient le nombre de colonnes

  • plage 0 .. compte-1

  • -nié, pour tourner dans l'autre sens et la valeur par défaut pour , pour finalement donner 0 ¯1 ¯2 ... - (count-1), cela vectorise automatiquement à travers chaque colonne de telle sorte que la 0-ème colonne est tournée de 0, le 1 er par 1, ...

q← attribuer ceci à une variable q

xy

∨/ réduire de LCM sur chaque ligne, si la ligne est tout-0, cela donne 0, sinon cela donne un nombre positif

×obtenir son signe, 00et un nombre positif → 1

indices de vérités, c'est-à-dire indices de 1

choisissez le premier élément, ⊃⍸obtient simplement l'index du premier 1

q↓⍨supprime autant de lignes q, ⎕io←0aide à nouveau à renvoyer la valeur correcte pour supprimer les premières lignes de 0

(fonction de sortie)

sr⊢∘⍉\


D'autres approches sont énumérées ci-dessous.

⍝(⊢∘⍉\+/∘⍴{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
user41805
la source