Blow-up jest potężnym narzędziem w geometrii algebraicznej. Pozwala na usunięcie osobliwości ze zbiorów algebraicznych przy jednoczesnym zachowaniu reszty ich struktury.
Jeśli nie znasz tego, nie martw się, faktyczne obliczenia nie są trudne do zrozumienia (patrz poniżej).
Poniżej rozważamy powiększenie punktukrzywej algebraicznej w 2D. Krzywą algebraiczną w 2D podaje locus zero wielomianu w dwóch zmiennych (np. dla okręgu jednostkowego lub dla paraboli). Blowup tej krzywej (w ) uzyskuje się dwa wielomianów , jak zdefiniowano poniżej. Zarówno i opisują z (możliwą) osobliwością w oddalony.
Wyzwanie
Biorąc pod uwagę pewien wielomian , odnaleźć i jak zdefiniowano poniżej.
Definicja
Przede wszystkim zauważ, że wszystko, co tu mówię, jest uproszczone i nie do końca odpowiada rzeczywistym definicjom.
Biorąc pod uwagę wielomian w dwóch zmiennych blowup jest przez dwóch wielomianów znowu każda z dwóch zmiennych.
Aby dostać najpierw definiujemy . Następnie jest prawdopodobnie wielokrotnością , tj dla niektórych gdzie nie dzieli . Następnie jest w zasadzie tym, co pozostaje po podziale.
Drugi wielomian jest zdefiniowany dokładnie tak samo, ale zmieniamy zmienne: Najpierw napisz . Następnie jest zdefiniowany tak, że dla niektórych gdzie nie dzieli .
Aby było to bardziej zrozumiałe, rozważ następujące czynności
Przykład
Zastanów się nad krzywą podaną przez zero miejsca . (Ma osobliwość wponieważ w tym momencie nie ma dobrze zdefiniowanej stycznej. )
Potem znajdziemy
Następnie jest pierwszym wielomianem.
podobnie
Następnie .
Format wejścia / wyjścia
(Tak jak tutaj .) Wielomiany są reprezentowane jako (m+1) x (n+1)
macierze / listy list współczynników całkowitych, w poniższym przykładzie warunki współczynników podano w ich pozycji:
[ 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]
Elipsa 0 = x^2 + 2y^2 -1
byłaby reprezentowana jako
[[-1, 0, 1],
[ 0, 0, 0],
[ 2, 0, 0]]
Jeśli wolisz, możesz także zamienić x
i y
. W każdym kierunku możesz mieć końcowe zera (tj. Współczynniki wyższych stopni, które są tylko zero). Jeśli jest to wygodniejsze, możesz mieć także tablice rozmieszczone naprzemiennie (zamiast prostokątnego), tak aby wszystkie podgrupy podrzędne nie zawierały zer końcowych.
- Format wyjściowy jest taki sam jak format wejściowy.
Przykłady
Więcej do dodania ( źródło więcej )
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
Przykłady bez zdjęć
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
Odpowiedzi:
Python 3 + numpy,
165134 bajtówWypróbuj online!
Funkcja przyjmuje jedną
numpy
tablicę 2Dp
jako dane wejściowe i zwraca krotkę(r,s)
dwóchnumpy
tablic 2D.Podział rozwiązania jest następujący. Aby obliczyć wielomianr , przepisujemy każdy termin xjotyja z p w xj+i(yx)i , and it becomes xj+iui in p(x,ux) . So we can rearrange the input (m+1)×(n+1) matrix P into a (m+1)×(m+n−1) matrix D corresponding to p(x,ux) by setting D[i,j+i]=P[i,j] . Then we eliminate all-zero columns at the beginning and end of D to perform a reduction and get the output matrix R for r .
To computes , we simply swap x and y , repeat the same process, and then swap them back. This corresponds to computing R for PT and then transposes the outcome.
The following ungolfed code shows the above computation process.
Ungolfed (Basic)
Try it online!
A further improvement of the solution computes the matrixR in one single pass based on R[i,j+i−c]=P[i,j] , where c=minP[i,j]≠0i+j .
Ungolfed (Improved)
Try it online!
źródło
APL (Dyalog Unicode),
3837 bytes1 byte saved thanks to ngn by using
+/∘⍴
in place of the dummy literal0
Try it online!
(a train with
⎕io
(index origin) set as 0)⊂
enclosed right argument,
concatenated with⊂∘
enclosed⍉
transposed right argument¨
on each+/∘⍴{ ... }
perform the following function with left argument+/
sum⍴
the shape of the right argument, i.e. get rows+columnsand the right argument will be each of the enclosed matrices.
⍺↑⍵
and take left argument⍺
many rows from the right argument⍵
, if⍵
is deficient in rows (which it will be because rows+columns > rows), it is padded with enough 0sThe computation of substitutingvx or uy in place of y or x is done by rotating the columns of
⍵
by their index, and since⍵
is padded with 0s, columns of⍵
are effectively prepended by the desired amount of 0s.⊖
rotate columns by⍉⍵
transposed⍵
≢
count rows, all together,≢⍉⍵
gets the number of columns in⍵
⍳
range 0 .. count-1-
negated, to rotate in the other direction and the default for⊖
, to ultimately yield 0 ¯1 ¯2 ... -(count-1), this automatically vectorises across each column such that the 0-th column is rotated by 0, the 1-st by 1, ...q←
assign this to variableq
Now to divide the polynomial by the largest power ofx or y , the leading all-0 rows have to be removed.
∨/
reduce by LCM across each row, if the row is all-0s, this yields 0, otherwise it gives a positive number×
get its sign,0
→0
and positive number →1
⍸
indices of truthies, i.e. indices of 1s⊃
pick the first element,⊃⍸
simply gets the index of the first 1q↓⍨
drops that many rows fromq
, again⎕io←0
helps in⍸
returning the correct value for dropping the leading all-0 rows(exit function)
⊢∘⍉\
Other approaches are listed below.
źródło