Pesawat meledak

10

The Pukulan-up adalah alat yang ampuh dalam geometri aljabar. Hal ini memungkinkan penghapusan singularitas dari set aljabar sambil mempertahankan sisa struktur mereka.

Jika Anda tidak terbiasa dengan hal itu, jangan khawatir, perhitungan yang sebenarnya tidak sulit untuk dipahami (lihat di bawah).

Berikut ini kami sedang mempertimbangkan meledakkan titik (0,0) dari kurva aljabar dalam 2D. Kurva aljabar dalam 2D ​​diberikan oleh nol-lokus polinomial dalam dua variabel (misalnya p(x,y)=x2+y21 untuk lingkaran satuan, atau p(x,y)=yx2 untuk parabola). The blowup kurva yang (di (0,0)) diberikan oleh dua polinomial r,s seperti yang didefinisikan di bawah ini. Kedua r dan s menjelaskan p dengan singularitas (mungkin) pada (0,0) dihapus.

Tantangan

Dengan beberapa polinomial p , temukan r dan s seperti yang didefinisikan di bawah ini.

Definisi

Pertama-tama perhatikan bahwa semua yang saya katakan di sini disederhanakan, dan tidak sepenuhnya sesuai dengan definisi yang sebenarnya.

Mengingat jumlahnya banyak p di dua variabel x,y yang blowup diberikan oleh dua polinomial r,s lagi masing-masing dalam dua variabel.

Untuk mendapatkan r pertama-tama kita mendefinisikan R(x,v):=p(x,vx) . Maka R(x,v) mungkin kelipatan x , yaitu R(x,v)=xnr(x,v) untuk beberapa n mana x tidak membagi r(x,v) . Makar(x,v) pada dasarnya adalah apa yang tersisa setelah pembagian.

Polinomial lain didefinisikan persis sama, tetapi kami mengganti variabel: Pertama tulis S(u,y):=p(uy,y) . Kemudian s didefinisikan sedemikian sehingga S(u,y)=yms(u,y) untuk beberapa m mana y tidak membagi s(u,y) .

Untuk membuatnya lebih jelas, pertimbangkan untuk mengikuti

Contoh

Pertimbangkan kurva yang diberikan oleh nol locus p(x,y)=y2(1+x)x2 . (Ini memiliki singularitas pada (0,0) karena tidak ada garis singgung yang didefinisikan dengan baik pada saat itu.)

Lalu kita temukan

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

r(x,v)=v21x

Demikian pula

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

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

rs

Format Input / Output

(Sama seperti di sini .) Polinomial diwakili diberikan sebagai (m+1) x (n+1)matriks / daftar daftar koefisien integer, dalam contoh di bawah ini syarat-syarat koefisien diberikan dalam posisi mereka:

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

Jadi elips 0 = x^2 + 2y^2 -1akan diwakili sebagai

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

Jika mau, Anda juga dapat menukar xdan y. Di setiap arah Anda diizinkan memiliki angka nol (misalnya koefisien derajat lebih tinggi yang hanya nol). Jika lebih nyaman, Anda juga dapat memiliki array yang terhuyung-huyung (bukan yang persegi panjang) sehingga semua sub-array tidak mengandung nol tambahan.

  • Format output sama dengan format input.

Contohnya

Lebih banyak untuk ditambahkan ( sumber untuk lebih )

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

hal 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

hal r s

Contohnya tanpa gambar

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]]
cacat
sumber
7
Judul ini jelas bukan seperti yang saya kira ...
negatif tujuh
0+x+x^2+x^3+x^4
Testcase yang
@Cowsquack menambahkannya!
flawr

Jawaban:

5

Python 3 + numpy, 165 134 byte

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

Cobalah online!

Fungsi ini mengambil satu numpylarik 2D psebagai input dan mengembalikan tupel (r,s)dua numpylarik 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

Kode ungolfed berikut menunjukkan proses perhitungan di atas.

Tidak Disatukan (Dasar)

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

Cobalah online!

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

Tidak Disatukan (Ditingkatkan)

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

Cobalah online!

Joel
sumber
3

APL (Dyalog Unicode) , 38 37 byte

1 byte disimpan berkat Ngn dengan menggunakan +/∘⍴pengganti dummy literal0

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

Cobalah online!

(kereta dengan ⎕io(indeks asal) ditetapkan sebagai 0)

argumen benar terlampir

, digabungkan dengan

  • ⊂∘ tertutup

  • argumen kanan yang dialihkan

s dihitung dari yang pertama, dari yang terakhirr

¨ pada setiap

+/∘⍴{ ... } melakukan fungsi berikut dengan argumen kiri

  • +/ jumlah

      • bentuk argumen yang tepat, yaitu dapatkan baris + kolom

dan argumen yang tepat adalah masing-masing dari matriks terlampir.

⍺↑⍵dan ambil argumen kiri banyak baris dari argumen kanan , jika kekurangan dalam baris (yang akan karena baris + kolom> baris), itu diisi dengan 0s cukup

vxuyyx

putar kolom dengan

  • ⍉⍵ ditransposisikan

  • hitung baris, semuanya, ≢⍉⍵mendapat jumlah kolom

  • range 0 .. count-1

  • -dinegasikan, untuk memutar ke arah lain dan default untuk , untuk akhirnya menghasilkan 0 ¯ 1 ... - (hitung-1), ini secara otomatis vektor di setiap kolom sehingga kolom ke-0 diputar oleh 0, 1-st dengan 1, ...

q← tetapkan ini ke variabel q

xy

∨/ dikurangi dengan LCM di setiap baris, jika barisnya adalah semua-0s, ini menghasilkan 0, jika tidak maka akan memberikan angka positif

×dapatkan tandanya, 00dan angka positif → 1

indeks kebenaran, yaitu indeks 1s

pilih elemen pertama, ⊃⍸cukup dapatkan indeks dari 1 pertama

q↓⍨turun dari banyak baris q, sekali lagi ⎕io←0membantu mengembalikan nilai yang benar untuk menjatuhkan semua-0 baris utama

(fungsi keluar)

sr⊢∘⍉\


Pendekatan lain tercantum di bawah ini.

⍝(⊢∘⍉\+/∘⍴{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
pengguna41805
sumber