Flugzeug explodieren


10

Das Aufblasen ist ein mächtiges Werkzeug in der algebraischen Geometrie. Es ermöglicht das Entfernen von Singularitäten aus algebraischen Mengen, während der Rest ihrer Struktur erhalten bleibt.

Wenn Sie mit all dem nicht vertraut sind, machen Sie sich keine Sorgen, die tatsächliche Berechnung ist nicht schwer zu verstehen (siehe unten).

Im Folgenden betrachten wir das Aufblasen des Punktes einer algebraischen Kurve in 2D. Eine algebraische Kurve in 2D ist durch den Nullort eines Polynoms in zwei Variablen gegeben (z. B. für den Einheitskreis oder für eine Parabel). Das Aufblasen dieser Kurve (in ) ist durch zwei Polynome wie nachstehend definiert. Sowohl als auch beschreiben wobei die (mögliche) Singularität bei entfernt ist.(0,0)p(x,y)=x2+y21p(x,y)=yx2(0,0)r,srsp(0,0)

Herausforderung

Wenn ein Polynom , finden Sie und wie unten definiert.prs

Definition

Beachten Sie zunächst, dass alles, was ich hier sage, vereinfacht ist und nicht vollständig den tatsächlichen Definitionen entspricht.

Bei einem Polynom in zwei Variablen das Aufblasen durch zwei Polynome wiederum jeweils in zwei Variablen gegeben.px,yr,s

Um , definieren wir zuerst . Dann ist wahrscheinlich ein Vielfaches von , dh für einige wobei nicht teilt . Dann ist im Grunde das, was nach der Division übrig bleibt.rR(x,v):=p(x,vx)R(x,v)xR(x,v)=xnr(x,v)nxr(x,v)r(x,v)

Das andere Polynom ist genau gleich definiert, aber wir wechseln die Variablen: Schreiben Sie zuerst . Dann ist so definiert, dass für einige wobei nicht teilt .S(u,y):=p(uy,y)sS(u,y)=yms(u,y)mys(u,y)

Um dies klarer zu machen, sollten Sie Folgendes beachten

Beispiel

Betrachten Sie die Kurve, die durch den Nullort von . (Es hat eine Singularität bei da es zu diesem Zeitpunkt keine genau definierte Tangente gibt.)p(x,y)=y2(1+x)x2(0,0)

Dann finden wir

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

Dann ist das erste Polynom.r(x,v)=v21x

Ähnlich

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

Dann ist .s(u,y)=1- -(1+uy)u2=1- -u2+u3y

rs

Eingabe- / Ausgabeformat

(Wie hier .) Die Polynome werden als (m+1) x (n+1)Matrizen / Listen von Listen mit ganzzahligen Koeffizienten dargestellt. Im folgenden Beispiel werden die Begriffe der Koeffizienten an ihrer Position angegeben:

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

Eine Ellipse 0 = x^2 + 2y^2 -1würde also als dargestellt

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

Wenn Sie es vorziehen, können Sie auch tauschen xund y. In jeder Richtung dürfen Sie nachgestellte Nullen haben (dh Koeffizienten höherer Grade, die nur Null sind). Wenn es bequemer ist, können Sie auch gestaffelte Arrays (anstelle eines rechteckigen) verwenden, sodass alle Sub-Sub-Arrays keine nachgestellten Nullen enthalten.

  • Das Ausgabeformat ist das gleiche wie das Eingabeformat.

Beispiele

Mehr hinzugefügt werden ( Quelle für mehr )

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

Beispiele ohne Bilder

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

7
Dieser Titel ist definitiv nicht das, was ich dachte ...
negativ sieben

Vorgeschlagener Testfall:0+x+x^2+x^3+x^4
user41805

@Cowsquack Hinzugefügt!
Fehler

Antworten:


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

Probieren Sie es online aus!

Die Funktion verwendet ein numpy2D-Array pals Eingabe und gibt ein Tupel (r,s)von zwei numpy2D-Arrays zurück.

rxjyichpxj+ich(yx)ichxj+ichuichp(x,ux)(m+1)×(n+1)P.(m+1)×(m+n- -1)D.p(x,ux)D.[ich,j+ich]]=P.[ich,j]]D.R.r

sxyR.P.T.

Der folgende ungolfed Code zeigt den obigen Berechnungsprozess.

Ungolfed (Basic)

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

Probieren Sie es online aus!

R.R.[ich,j+ich- -c]]=P.[ich,j]]c=MindestP.[ich,j]]0ich+j

Ungolfed (verbessert)

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

Probieren Sie es online aus!


3

APL (Dyalog Unicode) , 38 37 Bytes

1 Byte gespart dank ngn durch Verwendung +/∘⍴anstelle des Dummy-Literal0

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

Probieren Sie es online aus!

(ein Zug mit ⎕io(Indexursprung) als 0 gesetzt)

beiliegendes rechtes Argument

, verkettet mit

  • ⊂∘ beigefügt

  • umgesetztes richtiges Argument

sr

¨ auf jeder

+/∘⍴{ ... } Führen Sie die folgende Funktion mit dem linken Argument aus

  • +/ Summe

      • die Form des richtigen Arguments, dh Zeilen + Spalten erhalten

und das richtige Argument wird jede der beigefügten Matrizen sein.

⍺↑⍵und nimm das linke Argument viele Zeilen vom rechten Argument , wenn es an Zeilen mangelt (was daran liegt, dass Zeilen + Spalten> Zeilen sind), wird es mit genügend Nullen aufgefüllt

vxuyyx

Spalten drehen um

  • ⍉⍵ transponiert

  • Die Anzahl der Zeilen zusammen ≢⍉⍵ergibt die Anzahl der Spalten

  • Bereich 0 .. Anzahl-1

  • -negiert, um in die andere Richtung zu drehen und die Standardeinstellung für , um letztendlich 0 ¯ 1 ¯ 2 ... - (Anzahl-1) zu ergeben, wird automatisch über jede Spalte vektorisiert, so dass die 0. Spalte um 0 gedreht wird 1 mal 1, ...

q← Weisen Sie dies der Variablen zu q

xy

∨/ Reduzieren Sie jede Zeile um LCM. Wenn die Zeile nur 0 ist, ergibt dies 0, andernfalls ergibt sich eine positive Zahl

×Holen Sie sich das Vorzeichen 00und die positive Zahl → 1

Indizes von Wahrheiten, dh Indizes von 1s

Wählen Sie das erste Element aus und erhalten Sie ⊃⍸einfach den Index der ersten 1

q↓⍨Das Löschen von so vielen Zeilen hilft qwiederum dabei ⎕io←0, den richtigen Wert für das Löschen der führenden All-0-Zeilen zurückzugeben

(Exit-Funktion)

sr⊢∘⍉\


Andere Ansätze sind unten aufgeführt.

⍝(⊢∘⍉\+/∘⍴{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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.