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 ) r , s r s p ( 0 , 0 )
Défi
Étant donné un polynôme , trouver et tels que définis ci-dessous.
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.
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.
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 .
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.)
Ensuite, nous trouvons
Alors est le premier polynôme.
De même
Alors .
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 -1
serait représentée comme
[[-1, 0, 1],
[ 0, 0, 0],
[ 2, 0, 0]]
Si vous préférez, vous pouvez également échanger x
et 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
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
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]]
0+x+x^2+x^3+x^4
Réponses:
Python 3 + numpy,
165134 bytesEssayez-le en ligne!
La fonction prend un
numpy
tableau 2Dp
en entrée et renvoie un tuple(r,s)
de deuxnumpy
tableaux 2D.Le code non golfé suivant montre le processus de calcul ci-dessus.
Non golfé (basique)
Essayez-le en ligne!
Non golfé (amélioré)
Essayez-le en ligne!
la source
APL (Dyalog Unicode) ,
3837 octets1 octet enregistré grâce à ngn en utilisant
+/∘⍴
à la place du littéral factice0
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é¨
sur chaque+/∘⍴{ ... }
effectuer la fonction suivante avec l'argument gauche+/
somme⍴
la forme de l'argument de droite, c'est-à-dire obtenir des lignes + colonneset 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 0Le 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.vx uy y x
⍵
⍵
⍵
⊖
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 variableq
∨/
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,0
→0
et 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 1q↓⍨
supprime autant de lignesq
,⎕io←0
aide à nouveau à⍸
renvoyer la valeur correcte pour supprimer les premières lignes de 0(fonction de sortie)
⊢∘⍉\
D'autres approches sont énumérées ci-dessous.
la source