Uçak havaya uçurmak


10

Blow-up cebirsel geometri güçlü bir araçtır. Bu kaldırılmasını verir Singularities gelen cebirsel kümeler kendi yapısının geri kalanını korurken.

Eğer bunlardan herhangi birine aşina değilseniz, gerçek hesaplamanın anlaşılması zor değildir (aşağıya bakınız).

Aşağıda cebirsel bir eğrinin noktasının 2D olarak patlamasını düşünüyoruz . 2B'deki bir cebirsel eğri, iki değişkenli bir polinomun sıfır-lokusu tarafından verilir (örn . Birim daire için veya Bir parabol için ). Bu eğrinin patlaması ( ) aşağıda tanımlandığı gibi iki polinom tarafından verilir . Hem hem de , da (olası) tekillik çıkarılmış olarak tarif eder .(0,0)p(x,y)=x2+y21p(x,y)=yx2(0,0)r,srsp(0,0)

Meydan okuma

Bazı polinom verildiğinde , aşağıda tanımlandığı gibi ve bulun .prs

Tanım

Her şeyden önce, burada söylediğim her şeyin basitleştirildiğini ve gerçek tanımlara tamamen karşılık gelmediğini unutmayın.

İki değişken bir polinom verildiğinde , patlama , her biri iki değişkente olmak üzere iki polinom tarafından verilir .px,yr,s

Elde etmek için ilk tanımlamak . Daha sonra bir çoklu muhtemelen , yani bazıları için bölmek değil . O zaman temel olarak bölünmeden sonra kalan şeydir.rR(x,v):=p(x,vx)R(x,v)xR(x,v)=xnr(x,v)nxr(x,v)r(x,v)

Diğer polinom tamamen aynı şekilde tanımlanır, ancak değişkenleri değiştiririz: İlk önce . Daha sonra tanımlanmış ve bazı does not bölmek .S(u,y):=p(uy,y)sS(u,y)=yms(u,y)mys(u,y)

Daha açık hale getirmek için aşağıdakileri göz önünde bulundurun

Misal

sıfır odağı tarafından verilen eğriyi göz önünde bulundurun . ( da tekilliğe sahiptir, çünkü o noktada iyi tanımlanmış bir teğet yoktur.)p(x,y)=y2(1+x)x2(0,0)

Sonra buluruz

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

Sonra ilk polinomdur.r(x,v)=v21x

benzer şekilde

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

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

rs

Giriş / Çıkış Formatı

( Burada olduğu gibi .) Polinomlar, (m+1) x (n+1)tamsayı katsayıları listelerinin matrisleri / listeleri olarak verilir , aşağıdaki örnekte katsayıların terimleri konumlarında verilmiştir:

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

Böylece bir elips 0 = x^2 + 2y^2 -1,

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

İsterseniz xve de değiştirebilirsiniz y. Her yönde sondaki sıfırlara (yani yalnızca sıfır olan daha yüksek derecelerin katsayılarına) sahip olmanıza izin verilir. Daha uygunsa, tüm alt alt dizilerin sonunda sıfır bulunmayacak şekilde kademeli diziler de (dikdörtgen yerine) olabilir.

  • Çıktı biçimi, giriş biçimiyle aynıdır.

Örnekler

Eklenecek daha fazlası (daha fazlası için kaynak )

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

Resimsiz örnekler

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
Bu başlık kesinlikle düşündüğüm gibi değil ...
negatif yedi

Önerilen test 0+x+x^2+x^3+x^4
çantası

@Cowsquack Ekledi!
flawr

Yanıtlar:


5

Python 3 + numpy, 165 134 bayt

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

Çevrimiçi deneyin!

İşlev birini alır numpy2B dizi pgirişi ve bir başlığın geri (r,s)iki numpy2D dizileri.

Çözeltinin dökümü aşağıdaki gibidir. Polinom hesaplamak için , terimlerinin her birini yeniden yazıyoruz ve , . Biz giriş yeniden böylece matrisi bir içine matrisi tekabül eden ayarlayarak . Daha sonra başlangıç ve sonunda tamamen sıfır sütun ortadan bir azalma gerçekleştirir ve çıkış matris elde etmek için için .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

Hesaplama için , biz sadece takas ve , aynı işlemi tekrarlayın ve sonra onları geri takas. Bu hesaplamaya karşılık gelirsxyR için PT ve sonra sonucu aktarır.

Aşağıdaki çözülmemiş kod yukarıdaki hesaplama işlemini gösterir.

Ungolfed (Temel)

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

Çevrimiçi deneyin!

Çözümün daha da geliştirilmesi matrisi hesaplar R dayalı tek bir geçişte R[i,j+ic]=P[i,j], nerede c=minP[i,j]0i+j.

Ungolfed (Geliştirilmiş)

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

Çevrimiçi deneyin!


3

APL (Dyalog Unicode) , 38 37 bayt

1 bayt sayesinde kaydedilen NGN kullanarak +/∘⍴kukla sabitin yerine0

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

Çevrimiçi deneyin!

( ⎕ioindeks kökeni) 0 olarak ayarlanmış bir tren )

ekli sağ argüman

, ile birleştirildi

  • ⊂∘ kapalı

  • aktarılmış sağ argüman

s birinciden, ikincisinden hesaplanırr

¨ her birinde

+/∘⍴{ ... } sola argüman ile aşağıdaki işlevi gerçekleştirir

  • +/ toplam

      • doğru argümanın şekli, yani satırları + sütunları al

ve doğru argüman ekteki matrislerin her biri olacaktır.

⍺↑⍵ve sağdaki bağımsız değişkeni birçok satırdan sağ bağımsız değişkene alın (eğer satırlar eksikse (satırlar + sütunlar> satırlar olacaktır), yeterli 0s ile doldurulur)

İkame hesaplama veya yerine veya sütun döndürülmesiyle yapılır bunların indeksi ve o zamandan beri 0s ile pedlenmekte, sütunları etkili bir 0s arzu edilen miktarı ile başa getirilir.vxuyyx

sütunları tarafından döndür

  • ⍉⍵ aktarılmamıştır

  • satırları birlikte toplam, ≢⍉⍵içindeki sütun sayısını alır

  • aralık 0 .. sayım-1

  • -Negatif olarak, diğer yönde döndürmek ve varsayılan olarak , sonuçta 0 ¯1 ¯2 ... - (sayı-1) vermek için, bu, her sütun boyunca 0'ıncı sütun 0 döndürülecek şekilde otomatik olarak vektörleşir, 1'e 1, ...

q← bunu değişkene ata q

Şimdi polinomu veya en büyük gücüne bölmek için , önde gelen all-0 satırlarının kaldırılması gerekir.xy

∨/ her sıra boyunca LCM ile azalt, eğer satır all-0 ise, bu 0 verir, aksi takdirde pozitif bir sayı verir

×işaretini al, 00ve pozitif numara → 1

doğruluk indeksleri, yani 1s indeksleri

ilk eleman almak, ⊃⍸sadece ilk dizin alır 1

q↓⍨birçok satırdan düştüğünde q, yine önde gelen tüm 0 satırlarını bırakmak için doğru değeri döndürmeye ⎕io←0yardımcı olur

(çıkış fonksiyonu)

s zaten elde edildi, elde etmek için ikinci değerin aktarılması gerekirr⊢∘⍉\


Diğer yaklaşımlar aşağıda listelenmiştir.

⍝(⊢∘⍉\+/∘⍴{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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.