เครื่องบินระเบิด


10

การเป่าลมขึ้นเป็นเครื่องมือที่ทรงพลังในเรขาคณิตเชิงพีชคณิต จะช่วยให้การกำจัดเอกฐานจากชุดพีชคณิตในขณะที่รักษาส่วนที่เหลือของโครงสร้างของพวกเขา

หากคุณไม่คุ้นเคยกับสิ่งใดก็ตามที่ไม่ต้องกังวลการคำนวณจริงนั้นไม่ยากที่จะเข้าใจ (ดูด้านล่าง)

ในต่อไปนี้เรากำลังพิจารณาระเบิดขึ้นของจุด(0,0)ของเส้นโค้งพีชคณิตใน 2D เส้นโค้งพีชคณิตในแบบ 2 มิติจะถูกกำหนดโดย zero-locus ของพหุนามในตัวแปรสองตัว (เช่นพี(x,Y)=x2+Y2-1 สำหรับวงกลมหน่วยหรือ พี(x,Y)=Y-x2สำหรับพาราโบลา) การระเบิดของเส้นโค้งนั้น (ใน(0,0)) ถูกกำหนดโดยพหุนามสองอัน R,sตามที่กำหนดไว้ด้านล่าง ทั้งสองR และ s ทำอธิบาย พี ด้วยภาวะเอกฐาน (ที่เป็นไปได้) ที่ (0,0) ลบออก

ท้าทาย

รับพหุนาม พีหา R และ s ตามที่กำหนดไว้ด้านล่าง

คำนิยาม

ก่อนอื่นให้สังเกตว่าทุกอย่างที่ฉันพูดที่นี่นั้นง่ายและไม่ตรงกับคำจำกัดความที่แท้จริงทั้งหมด

รับพหุนาม พี ในสองตัวแปร x,YการระเบิดถูกกำหนดโดยพหุนามสองอันR,s อีกครั้งในสองตัวแปร

ที่จะได้รับ R เราก่อนกำหนด R(x,โวลต์)=พี(x,โวลต์x). แล้วก็R(x,โวลต์) อาจเป็นหลาย xเช่น R(x,โวลต์)=xnR(x,โวลต์) สำหรับบางคน n ที่ไหน x ไม่แบ่ง R(x,โวลต์). แล้วก็R(x,โวลต์) เป็นสิ่งที่เหลืออยู่หลังจากการแบ่ง

พหุนามอื่น ๆ ถูกนิยามเหมือนกัน แต่เราสลับตัวแปร: การเขียนครั้งแรก S(ยู,Y)=พี(ยูY,Y). แล้วก็s ถูกกำหนดไว้อย่างนั้น S(ยู,Y)=Yม.s(ยู,Y) สำหรับบางคน ม. ที่ไหน Y ไม่แบ่ง s(ยู,Y).

เพื่อที่จะให้ชัดเจนพิจารณาต่อไป

ตัวอย่าง

พิจารณาความโค้งที่กำหนดโดยศูนย์โลกัสของ พี(x,Y)=Y2-(1+x)x2. (มันมีลักษณะแปลกประหลาดที่(0,0)เนื่องจากไม่มีจุดสัมผัสที่ชัดเจนในจุดนั้น )

จากนั้นเราก็พบ

R(x,โวลต์)=พี(x,โวลต์x)=โวลต์2x2-(1+x)x2=x2(โวลต์2-1-x)

แล้วก็ R(x,โวลต์)=โวลต์2-1-x เป็นพหุนามแรก

เหมือนกับ

S(ยู,Y)=พี(ยูY,Y)=Y2-(1+ยูY)ยู2Y2=Y2(1-(1+ยูY)ยู2)

แล้วก็ s(ยู,Y)=1-(1+ยูY)ยู2=1-ยู2+ยู3Y.

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

พี 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

พี 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

testcase ที่แนะนำ:0+x+x^2+x^3+x^4
user41805

@Cowsquack เพิ่มแล้ว!
ข้อบกพร่อง

คำตอบ:


5

Python 3 + จำนวน, 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

ลองออนไลน์!

ฟังก์ชั่นนี้ใช้numpyอาร์เรย์ 2D หนึ่งชุดpเป็นอินพุตและส่งคืน tuple (r,s)ของสองnumpyอาร์เรย์สองอาร์เรย์

รายละเอียดของการแก้ปัญหามีดังนี้ เพื่อที่จะคำนวณพหุนามRเราเขียนแต่ละเทอม xJYผม ของ พี เข้าไป xJ+ผม(Yx)ผมและมันจะกลายเป็น xJ+ผมยูผม ใน พี(x,ยูx). ดังนั้นเราสามารถจัดเรียงอินพุตใหม่(ม.+1)×(n+1) มดลูก P เป็น (ม.+1)×(ม.+n-1) มดลูก D สอดคล้องกับ พี(x,ยูx) โดยการตั้งค่า D[ผม,J+ผม]=P[ผม,J]. จากนั้นเราจะกำจัดคอลัมน์ทั้งหมดที่เป็นศูนย์ที่จุดเริ่มต้นและจุดสิ้นสุดD เพื่อทำการลดขนาดและรับเอาท์พุทเมทริกซ์ R สำหรับ R.

เพื่อคำนวณ sเราแค่สลับ x และ Yทำซ้ำกระบวนการเดียวกันจากนั้นสลับกลับ สิ่งนี้สอดคล้องกับการคำนวณR สำหรับ PT แล้วแปลงผลลัพธ์

รหัส ungolfed ต่อไปนี้แสดงกระบวนการคำนวณข้างต้น

Ungolfed (พื้นฐาน)

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[ผม,J+ผม-]=P[ผม,J]ที่ไหน =นาทีP[ผม,J]0ผม+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 เพียงพอ

การคำนวณการทดแทน โวลต์x หรือ ยูY แทน Y หรือ xจะทำโดยการหมุนคอลัมน์ของดัชนีของพวกเขาและเนื่องจากเป็นเบาะกับ 0s คอลัมน์ของจะถูกเติมอย่างมีประสิทธิภาพด้วยจำนวนที่ต้องการ 0s

หมุนคอลัมน์ตาม

  • ⍉⍵ ขนย้าย

  • นับจำนวนแถวเข้าด้วยกัน≢⍉⍵จะได้จำนวนคอลัมน์

  • ช่วง 0 .. นับ -1

  • -เมื่อตะกี้, เพื่อหมุนในทิศทางอื่นและค่าปริยายสำหรับ, เพื่อให้ได้ผลลัพธ์ 0 ¯1¯2 ... - (นับ -1), นี่จะเวกเตอร์อัตโนมัติในแต่ละคอลัมน์โดยอัตโนมัติซึ่งคอลัมน์ 0-th ถูกหมุนด้วย 0, 1 ต่อ 1, ...

q← กำหนดสิ่งนี้ให้กับตัวแปร q

ตอนนี้หารพหุนามด้วยพลังที่ใหญ่ที่สุดของ x หรือ Yจะต้องลบแถวนำทั้งหมด -0

∨/ ลด LCM ลงในแต่ละแถวหากแถวเป็น all-0s นี่จะให้ผลเป็น 0 มิฉะนั้นจะให้ค่าเป็นบวก

×รับเครื่องหมายของมัน00และจำนวนบวก→ 1

ดัชนีของความจริงเช่นดัชนีของ 1s

เลือกองค์ประกอบแรก⊃⍸เพียงรับดัชนีของ 1 ตัวแรก

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.