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.
Herausforderung
Wenn ein Polynom , finden Sie und wie unten definiert.
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.
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.
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 .
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.)
Dann finden wir
Dann ist das erste Polynom.
Ähnlich
Dann ist .
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 -1
würde also als dargestellt
[[-1, 0, 1],
[ 0, 0, 0],
[ 2, 0, 0]]
Wenn Sie es vorziehen, können Sie auch tauschen x
und 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
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
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]]
quelle
0+x+x^2+x^3+x^4
Antworten:
Python 3 + numpy,
165134 BytesProbieren Sie es online aus!
Die Funktion verwendet ein
numpy
2D-Arrayp
als Eingabe und gibt ein Tupel(r,s)
von zweinumpy
2D-Arrays zurück.Der folgende ungolfed Code zeigt den obigen Berechnungsprozess.
Ungolfed (Basic)
Probieren Sie es online aus!
Ungolfed (verbessert)
Probieren Sie es online aus!
quelle
APL (Dyalog Unicode) ,
3837 Bytes1 Byte gespart dank ngn durch Verwendung
+/∘⍴
anstelle des Dummy-Literal0
Probieren Sie es online aus!
(ein Zug mit
⎕io
(Indexursprung) als 0 gesetzt)⊂
beiliegendes rechtes Argument,
verkettet mit⊂∘
beigefügt⍉
umgesetztes richtiges Argument¨
auf jeder+/∘⍴{ ... }
Führen Sie die folgende Funktion mit dem linken Argument aus+/
Summe⍴
die Form des richtigen Arguments, dh Zeilen + Spalten erhaltenund 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⍵
⍵
⍵
⊖
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 zuq
∨/
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 Vorzeichen0
→0
und 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 1q↓⍨
Das Löschen von so vielen Zeilen hilftq
wiederum dabei⎕io←0
,⍸
den richtigen Wert für das Löschen der führenden All-0-Zeilen zurückzugeben(Exit-Funktion)
⊢∘⍉\
Andere Ansätze sind unten aufgeführt.
quelle