Máy bay thổi lên


10

Các Blow-up là một công cụ mạnh mẽ trong hình học đại số. Nó cho phép loại bỏ các điểm kỳ dị khỏi các bộ đại số trong khi bảo tồn phần còn lại của cấu trúc của chúng.

Nếu bạn không quen thuộc với bất kỳ điều gì không lo lắng, tính toán thực tế không khó hiểu (xem bên dưới).

Sau đây chúng tôi đang xem xét sự bùng nổ của điểm (0,0) của một đường cong đại số trong 2D. Một đường cong đại số trong 2D được cho bởi vị trí 0 của đa thức trong hai biến (ví dụ p(x,y)=x2+y21 cho vòng tròn đơn vị, hoặc p(x,y)=yx2 cho một parabola). Các Blowup của đường cong đó (trong (0,0)) được cho bởi hai đa thức r,s như được định nghĩa dưới đây. Cả rs đều mô tả p với số ít (có thể) tại (0,0) loại bỏ.

Thử thách

Cho một số đa thức p , tìm rs như được định nghĩa dưới đây.

Định nghĩa

Trước hết lưu ý rằng mọi thứ tôi nói ở đây đều được đơn giản hóa và không hoàn toàn tương ứng với các định nghĩa thực tế.

Cho một đa thức p trong hai biến x,y thì blowup được đưa ra bởi hai đa thức r,s lại mỗi biến trong hai biến.

Để có được r trước tiên chúng ta xác định R(x,v):=p(x,vx) . Sau đó, R(x,v) có lẽ là một bội số của x , tức là R(x,v)=xnr(x,v) đối với một số n nơi x không chia r(x,v) . Thìr(x,v) về cơ bản là những gì còn lại sau khi chia.

Đa thức khác được định nghĩa chính xác như nhau, nhưng chúng tôi chuyển đổi các biến: Đầu tiên viết S(u,y):=p(uy,y) . Khi đó s được định nghĩa sao cho S(u,y)=yms(u,y) cho một số m trong đó y không chia s(u,y) .

Để làm cho nó rõ ràng hơn xem xét sau

Thí dụ

Xét đường cong được cho bởi quỹ tích bằng không của p(x,y)=y2(1+x)x2 . (Nó có một điểm kỳ dị tại (0,0) vì không có tiếp tuyến được xác định rõ tại điểm đó.)

Sau đó, chúng tôi tìm thấy

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

r(x,v)=v21x

Tương tự

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

Định dạng đầu vào / đầu ra

(Giống như ở đây .) Các đa thức được biểu diễn dưới dạng (m+1) x (n+1)ma trận / danh sách các danh sách các hệ số nguyên, trong ví dụ bên dưới các thuật ngữ của các hệ số được đưa ra ở vị trí của chúng:

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

Vì vậy, một hình elip 0 = x^2 + 2y^2 -1sẽ được đại diện là

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

Nếu bạn thích bạn cũng có thể trao đổi xy. Trong mỗi hướng, bạn được phép có các số 0 ở cuối (tức là các hệ số có độ cao hơn bằng 0). Nếu thuận tiện hơn, bạn cũng có thể có các mảng so le (thay vì một hình chữ nhật) sao cho tất cả các mảng phụ không chứa các số 0 ở cuối.

  • Định dạng đầu ra giống như định dạng đầu vào.

Ví dụ

Thêm vào để thêm ( nguồn để biết thêm )

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

Ví dụ hình ảnh không có

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
Tiêu đề này chắc chắn không phải là những gì tôi nghĩ nó là ...
tiêu cực bảy

0+x+x^2+x^3+x^4
Testcase

@Cowsquack Đã thêm nó!
flawr

Câu trả lời:


5

Python 3 + gọn gàng, 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

Hãy thử trực tuyến!

Hàm lấy một numpymảng 2D plàm đầu vào và trả về một bộ (r,s)gồm hai numpymảng 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

Các mã không mã hóa sau đây cho thấy quá trình tính toán ở trên.

Ungolfed (Cơ bản)

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

Hãy thử trực tuyến!

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

Ungolfed (Cải tiến)

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

Hãy thử trực tuyến!


3

APL (Dyalog Unicode) , 38 37 byte

Lưu 1 byte nhờ ngn bằng cách sử dụng +/∘⍴thay cho chữ giả0

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

Hãy thử trực tuyến!

(một chuyến tàu có ⎕io(chỉ số gốc) được đặt là 0)

lập luận kèm theo

, nối với

  • ⊂∘ kèm

  • tranh luận đúng

s được tính từ cái trước, từ cái saur

¨ trên mỗi

+/∘⍴{ ... } thực hiện chức năng sau với đối số bên trái

  • +/ Tổng

      • hình dạng của đối số đúng, tức là lấy hàng + cột

và đối số đúng sẽ là mỗi ma trận kèm theo.

⍺↑⍵và lấy đối số bên trái nhiều hàng từ đối số bên phải , nếu thiếu hàng (điều này sẽ là do hàng + cột> hàng), nó được đệm với đủ 0s

Việc tính toán thay thế hoặc thay cho hoặc được thực hiện bằng cách xoay các cột theo chỉ số của chúng và do được đệm bằng 0, nên các cột được bổ sung một cách hiệu quả với số 0 mong muốn.vxuyyx

xoay cột bằng

  • ⍉⍵ chuyển

  • đếm các hàng, tất cả cùng nhau, ≢⍉⍵có được số lượng cột trong

  • phạm vi 0 .. đếm-1

  • -bị phủ định, để xoay theo hướng khác và mặc định cho , cuối cùng mang lại 0 1 2 ... - (đếm-1), điều này tự động vectơ trên mỗi cột sao cho cột 0 được xoay bằng 0, 1-by 1, ...

q← gán cái này cho biến q

Bây giờ để chia đa thức cho lũy thừa lớn nhất của hoặc , các hàng all-0 hàng đầu phải được loại bỏ.xy

∨/ giảm LCM trên mỗi hàng, nếu hàng là 0, điều này mang lại 0, nếu không, nó sẽ cho số dương

×lấy dấu của nó, 00và số dương → 1

chỉ số của sự thật, tức là chỉ số của 1s

chọn phần tử đầu tiên, ⊃⍸chỉ cần lấy chỉ mục của 1 đầu tiên

q↓⍨giảm nhiều hàng từ q, một lần nữa ⎕io←0giúp trả về giá trị chính xác cho việc thả các hàng tất cả 0 hàng đầu

(chức năng thoát)

s đã đạt được, để có được giá trị thứ hai phải được hoán quar⊢∘⍉\


Các cách tiếp cận khác được liệt kê dưới đây.

⍝(⊢∘⍉\+/∘⍴{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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.