飞机爆炸


10

该吹胀是代数几何中的有力工具。它可以去除奇点从代数集中同时保留其其余结构。

如果您对这些都不熟悉,请不要担心,实际的计算并不难理解(请参阅下文)。

下面我们考虑爆炸了点(0,0)2D中的代数曲线 二维的代数曲线由两个变量的多项式的零位给出(例如p(x,y)=x2+y2−1 对于单位圆,或者 p(x,y)=y−x2抛物线)。那条曲线的爆炸(在(0,0))由两个多项式给出 r,s如下定义。都r 和 s 确实描述 p 具有(可能)的奇点 (0,0) 删除。

挑战

给定一些多项式 p, 找 r 和 s 如下定义。

定义

首先请注意,我在这里所说的一切都是简化的,并不完全符合实际定义。

给定多项式 p 在两个变量中 x,y该爆破是由两个多项式给出r,s 再次在两个变量中每个。

要得到 r 我们首先定义 R(x,v):=p(x,vx)。然后R(x,v) 大概是 x,即 R(x,v)=xn⋅r(x,v) 对于一些 n 哪里 x 不分裂 r(x,v)。然后r(x,v) 基本上是除法后剩下的

另一个多项式的定义完全相同,但是我们切换了变量:首先写 S(u,y):=p(uy,y)。然后s 被定义为 S(u,y)=ym⋅s(u,y) 对于一些 m 哪里 y 不分裂 s(u,y)。

为了更清楚地考虑以下

例

考虑由零轨迹给出的曲线 p(x,y)=y2−(1+x)x2。(它在(0,0)因为此时没有明确定义的切线。)

然后我们发现

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

然后 r(x,v)=v2−1−x 是第一个多项式。

相似地

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

然后 s(ü,ÿ)=1个-(1个+üÿ)ü2=1个-ü2+ü3ÿ。

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

建议的测试案例:0+x+x^2+x^3+x^4
— user41805 '19

@Cowsquack添加了它!
— 瑕疵的

Answers:


5

Python 3 + numpy,165134字节

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

在线尝试!

该函数将一个numpy2D数组p作为输入,并返回(r,s)两个numpy2D数组的元组。

解决方案的细分如下。为了计算多项式[R,我们重写每个术语 XĴÿ一世 的 p 进入 XĴ+一世(ÿX)一世,它变成 XĴ+一世ü一世 在 p(X,üX)。这样我们就可以重新排列输入(米+1个)×(ñ+1个) 矩阵 P 变成一个 (米+1个)×(米+ñ-1个) 矩阵 d 对应于 p(X,üX) 通过设置 d[一世,Ĵ+一世]=P[一世,Ĵ]。然后,我们消除开头和结尾的全零列d 执行约简并获得输出矩阵 [R 对于 [R。

计算 s,我们只是交换 X 和 ÿ,重复相同的过程,然后将它们交换回去。这对应于计算[R 对于 PŤ 然后转置结果。

以下未执行代码的代码显示了上述计算过程。

空球(基本)

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

在线尝试!

解决方案的进一步改进计算矩阵 [R 一次基于 [R[一世,Ĵ+一世-C]=P[一世,Ĵ],在哪里 C=分P[一世,Ĵ]≠0一世+Ĵ。

取消高尔夫(改进)

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字节

通过使用ngn+/∘⍴代替虚拟文字,节省了1个字节0

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

在线尝试!

(⎕io(索引原点)设置为0 的火车)

⊂ 封闭的权利论证

, 与

  • ⊂∘ 封闭的

  • ⍉ 移置权论证

s 是根据前者计算得出的 [R 从后者

¨ 在每一个上

+/∘⍴{ ... } 用左参数执行以下功能

  • +/ 和

      • ⍴ 正确参数的形状,即获取行+列

正确的参数将是每个封闭的矩阵。

⍺↑⍵并⍺从右边的参数中取出左边的参数很多行⍵,如果⍵行数不足(这是因为rows + columns> rows),它将填充足够的0

代入计算 vX 要么 üÿ 代替 ÿ 要么 X通过旋转⍵索引的列完成索引的操作,并且由于⍵填充了0,因此列的⍵有效位置前面是所需的0。

⊖ 旋转列

  • ⍉⍵ 转置 ⍵

  • ≢一起计算行数,≢⍉⍵获取其中的列数⍵

  • ⍳ 范围0 .. count-1

  • -取反,以向另一个方向旋转,并为取默认值⊖,最终产生0¯1¯2...-(count-1),这将自动矢量化每列,以使第0列旋转0, 1乘1,...

q← 将此分配给变量 q

现在将多项式除以 X 要么 ÿ,则必须删除前导全0行。

∨/ 通过每行LCM减少,如果该行全为0,则得出0,否则给出一个正数

×得到它的符号0→ 0和正数→ 1

⍸ 真实指数,即1s的指数

⊃选择第一个元素,⊃⍸只需获取第一个元素的索引

q↓⍨从中删除那么多行q,再次⎕io←0有助于⍸返回正确的值以删除前导全0行

(退出功能)

s 已经实现了 [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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.