飛行機ブローアップ


10

ブローアップは、代数幾何学の強力なツールです。それはそれらの構造の残りを維持しながら代数的集合から特異点を取り除くことを可能にします。

心配していなくても、実際の計算を理解するのは難しくありません(以下を参照)。

以下では、2Dの代数曲線の点の拡大を検討しています。2Dの代数曲線は、2つの変数の多項式のゼロ軌跡によって与えられます(たとえば、単位円の場合は、または放物線)。その曲線()の爆発は、以下に定義する2つの多項式によって与えられます。とはどちらも、(可能な)特異点を削除してを記述します。(0,0)p(x,y)=x2+y21p(x,y)=yx20 0 R S R S P 0 0 (0,0)r,srsp(0,0)

チャレンジ

いくつかの多項式与えられた場合、以下に定義されているようにとを見つけます。prs

定義

まず、私がここで言うことはすべて簡略化されており、実際の定義に完全には対応していないことに注意してください。

2つの変数の多項式が与えられた場合、爆発は2つの変数の2つの多項式によってそれぞれ与えられます。px,yr,s

を取得するには、まず定義します。その場合、はおそらく倍数になります。つまり、は、が除算しない場合です。次に、は基本的に除算後に残るものです。rR(x,v):=p(x,vx)R(x,v)xR(x,v)=xnr(x,v)nxr(x,v)r(x,v)

他の多項式もまったく同じように定義されていますが、変数を切り替えます。最初にます。次にように定義される一部の分割しない。S(u,y):=p(uy,y)sS(u,y)=yms(u,y)mys(u,y)

より明確にするために、以下を検討してください

のゼロ軌跡によって与えられる曲線を考えます。(その点には明確に定義された接線がないため、特異点があります。)p(x,y)=y2(1+x)x2(0,0)

次に見つけます

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

次に、が最初の多項式です。r(x,v)=v21x

同様に

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

入出力フォーマット

ここと同じです。)多項式は(m+1) x (n+1)、整数係数のリストの行列/リストとして与えられて表されます。以下の例では、係数の項がその位置に与えられています。

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

したがって、楕円0 = x^2 + 2y^2 -1は次のように表されます

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

必要に応じてx、とを交換することもできますy。各方向で、後続のゼロ(つまり、ちょうどゼロであるより高い次数の係数)を持つことができます。より便利な場合は、すべてのサブサブ配列に後続ゼロが含まれないように、配列を(長方形の配列の代わりに)交互に配置することもできます。

  • 出力フォーマットは入力フォーマットと同じです。

追加する詳細(詳細のソース

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

写真なしの例

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
このタイトルは、私が思っていたものとは
負の7

推奨されるテストケース:0+x+x^2+x^3+x^4
user41805

@Cowsquackが追加しました!
火曜日

回答:


5

Pythonの3 + numpyの、165の 134バイト

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

オンラインでお試しください!

この関数は、1つのnumpy2D配列pを入力として受け取り、(r,s)2つのnumpy2D配列のタプルを返します。

ソリューションの内訳は次のとおりです。多項式を計算するために、各項をに書き換えると、 in。したがって設定することにより、入力行列を対応する行列再配置できます。次に、最初と最後ですべて0の列を削除して削減を実行し、出力行列を取得します。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

次のゴルフされていないコードは、上記の計算プロセスを示しています。

ゴルフなし(ベーシック)

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

オンラインでお試しください!

ソリューションのさらなる改善により、に基づいて1つの単一パスで行列を計算し。ここで、。RR[i,j+ic]=P[i,j]c=minP[i,j]0i+j

Ungolfed(改善)

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

オンラインでお試しください!


3

APL(Dyalog Unicode)38 37バイト

1つのバイトはして感謝を保存したNGN使用して+/∘⍴ダミーのリテラルの代わりに、0

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

オンラインでお試しください!

⎕io(インデックスの起点)が0に設定された列車)

囲まれた右引数

, と連結

  • ⊂∘ 囲まれた

  • 転置された正しい議論

sは前者から、は後者から計算されますr

¨ それぞれの

+/∘⍴{ ... } 左の引数で次の関数を実行します

  • +/

      • 正しい引数の形状、つまり行と列を取得する

右の引数は囲まれた行列のそれぞれになります。

⍺↑⍵そして、左の引数を右の引数から多くの行を取ります。行が不足している場合(行+列>行のため)、十分な0が埋め込まれます。

置換の計算又はの代わりにまたはの列を回転させることによって行われ、それらのインデックスによって、そして以来0でパディングされ、の列が効果的に0の所望量によって付加されます。vxuyyx

列を回転させる

  • ⍉⍵ 転置

  • 行を数えて、列≢⍉⍵の数を取得します

  • 範囲0 .. count-1

  • -否定され、他の方向に回転し、のデフォルトで、最終的に0¯1¯2...-(count-1)を生成します。これは、0番目の列が0だけ回転するように、各列を自動的にベクトル化します。 1-st by 1、...

q← これを変数に割り当てます q

次に、多項式をまたは最大べき乗で除算するには、先頭のすべて0の行を削除する必要があります。xy

∨/ 行がすべて0の場合、各行全体でLCMだけ減少します。これにより0が生成されます。それ以外の場合は、正の数になります。

×その符号を取得0→→ 0正の数→ 1

真実のインデックス、すなわち1のインデックス

最初の要素を選択し、⊃⍸単に最初の要素のインデックスを取得します1

q↓⍨多くの行を落としq、再び、⎕io←0に助けをリードするオール0の行を削除するための正しい値を返します

(出口機能)

sはすでに達成されていますを取得するには、2番目の値を介して転置する必要がありますr⊢∘⍉\


その他のアプローチを以下に示します。

⍝(⊢∘⍉\+/∘⍴{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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.