飞机爆炸


10

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

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

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

挑战

给定一些多项式 p, 找 rs 如下定义。

定义

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

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

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

另一个多项式的定义完全相同,但是我们切换了变量:首先写 S(u,y):=p(uy,y)。然后s 被定义为 S(u,y)=yms(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(v21x)

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

相似地

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

如果您愿意,也可以交换xy。在每个方向上,您都可以使用尾随零(即,较高阶的系数仅为零)。如果更方便,您还可以使用交错数组(而不是矩形数组),以便所有子子数组都不包含尾随零。

  • 输出格式与输入格式相同。

例子

有待添加的更多内容(更多信息来源

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Ĵ+一世ü一世pXüX。这样我们就可以重新排列输入+1个×ñ+1个 矩阵 P 变成一个 +1个×+ñ-1个 矩阵 d 对应于 pXü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,否则给出一个正数

×得到它的符号00和正数→ 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.