비행기


10

블로우 업 대수 기하학에서 강력한 도구입니다. 그것은 나머지 구조를 보존하면서 대수 세트 에서 특이점 을 제거 할 수 있습니다 .

걱정하지 않는 것에 익숙하지 않으면 실제 계산을 이해하기 어렵지 않습니다 (아래 참조).

다음에서 우리는 포인트 의 폭파를 고려하고 있습니다.(0,0)2D에서 대수 곡선의 2D의 대수 곡선은 두 변수에서 다항식의 영점에 의해 주어진다 (예 :피(엑스,와이)=엑스2+와이2−1 단위 원 또는 피(엑스,와이)=와이−엑스2포물선을 위해). 그 곡선 의 폭발(0,0))는 두 개의 다항식으로 제공됩니다. 아르 자형,에스아래에 정의 된대로. 양자 모두아르 자형 과 에스 설명하다 피 (가능한) 특이점으로 (0,0) 제거되었습니다.

도전

다항식이 주어지면 피, 찾기 아르 자형 과 에스 아래에 정의 된대로.

정의

우선 내가 여기서 말하는 모든 것은 단순화되었으며 실제 정의와 완전히 일치하지는 않습니다.

다항식이 주어짐 피 두 변수로 엑스,와이파열은 두 다항식 주어진다아르 자형,에스 다시 두 변수에 각각.

얻기 위해 아르 자형 우리는 먼저 정의 아르 자형(엑스,V): =피(엑스,V엑스). 그때아르 자형(엑스,V) 아마 배수 엑스즉 아르 자형(엑스,V)=엑스엔⋅아르 자형(엑스,V) 일부 엔 어디 엑스 나누지 않는다 아르 자형(엑스,V). 그때아르 자형(엑스,V) 기본적으로 분할 후 남은 것입니다.

다른 다항식은 정확히 동일하게 정의되지만 변수를 전환합니다 : 첫 번째 쓰기 에스(유,와이): =피(유와이,와이). 그때에스 다음과 같이 정의됩니다 에스(유,와이)=와이미디엄⋅에스(유,와이) 일부 미디엄 어디 와이 나누지 않는다 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−엑스 첫 번째 다항식입니다.

비슷하게

에스(유,와이)=피(유와이,와이)=와이2−(1+유와이)유2와이2=와이2(1−(1+유와이)유2)

그때 에스(유,와이)=1−(1+유와이)유2=1−유2+유삼와이.

아르 자형에스

입출력 형식

( 여기서 와 동일 ) 다항식은 (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. 각 방향에서 후행 0을 가질 수 있습니다 (즉, 단지 0 인 더 높은 도의 계수). 더 편리한 경우 모든 하위 하위 배열에 후행 0이 포함되지 않도록 직사각형 배열 대신 배열을 엇갈리게 배치 할 수도 있습니다.

  • 출력 형식은 입력 형식과 동일합니다.

예

더 추가 ( 더 많은 소스 )

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

피 아르 자형 에스

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

피 아르 자형 에스

그림이없는 예

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
이 제목은 제가 생각했던 것과는
— negative seven

권장 테스트 케이스 :0+x+x^2+x^3+x^4
— user41805

@Cowsquack 추가했습니다!
— flawr

답변:


5

파이썬 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

온라인으로 사용해보십시오!

이 함수는 하나의 numpy2D 배열을 사용합니다p 을 입력으로 받아서 (r,s)두 개의 튜플을 반환합니다.numpy 2D 배열 합니다.

솔루션의 분석은 다음과 같습니다. 다항식을 계산하려면아르 자형각 용어를 다시 작성합니다 엑스제이와이나는 의 피 으로 엑스제이+나는(와이엑스)나는그리고 엑스제이+나는유나는 에 피(엑스,유엑스). 입력을 다시 정렬 할 수 있습니다(미디엄+1)×(엔+1) 매트릭스 피 로 (미디엄+1)×(미디엄+엔−1) 매트릭스 디 에 해당하는 피(엑스,유엑스) 설정하여 디[나는,제이+나는]=피[나는,제이]. 그런 다음 시작과 끝에서 모두 0 열을 제거합니다.디 축소를 수행하고 출력 행렬을 얻는 방법 아르 자형 ...에 대한 아르 자형.

계산하기 에스우리는 단순히 교환 엑스 과 와이동일한 프로세스를 반복 한 다음 다시 바꿉니다. 이것은 컴퓨팅에 해당합니다아르 자형 ...에 대한 피티 그런 다음 결과를 바꿉니다.

다음 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

온라인으로 사용해보십시오!

솔루션의 추가 개선은 매트릭스를 계산 아르 자형 한 번의 패스로 아르 자형[나는,제이+나는−씨]=피[나는,제이], 어디 씨=분피[나는,제이]≠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으로 설정된 열차 )

⊂ 옳은 논쟁

, 연결

  • ⊂∘ 에워싸는

  • ⍉ 바른 주장

에스 전자에서 계산 된 아르 자형 후자에서

¨ 각각에

+/∘⍴{ ... } 왼쪽 인수로 다음 기능을 수행하십시오.

  • +/ 합집합

      • ⍴ 올바른 인수의 형태, 즉 행 + 열을 얻는다

올바른 인수는 각각의 동봉 된 행렬입니다.

⍺↑⍵⍺행 에 부족한 ⍵경우 ⍵(행 + 열> 행이기 때문에) 왼쪽 인수를 오른쪽 인수에서 여러 행으로 가져옵니다. 충분한 0으로 채워집니다

치환의 계산 V엑스 또는 유와이 대신에 와이 또는 엑스⍵인덱스는 인덱스를 기준으로 열을 회전하여 수행되며 ⍵0으로 채워 지므로 ⍵원하는 양의 0이 열 앞에 효과적으로 추가됩니다.

⊖ 열을 회전

  • ⍉⍵ 전치 ⍵

  • ≢행 수를 모두 합하여 ≢⍉⍵열 수를 가져옵니다.⍵

  • ⍳ 범위 0 .. 카운트 -1

  • -⊖부정적으로, 다른 방향으로 회전하고 기본값을 0으로 설정 하면 궁극적으로 0 ¯1 ¯2 ...-(count-1)이되며, 이는 0 번째 열이 0만큼 회전하도록 각 열에서 자동으로 벡터화됩니다. 1 일 1 일 ...

q← 이것을 변수에 할당 q

이제 다항식을 최대의 거듭 제곱으로 나눕니다. 엑스 또는 와이, 선행 0 행을 모두 제거해야합니다.

∨/ 행이 모두 0 인 경우 각 행에서 LCM으로 줄이면 0이되고 그렇지 않으면 양수가됩니다.

×부호를 확인 0→ → 0양수 → 1

⍸ 진리의 지표, 즉 1의 지수

⊃첫 번째 요소를 선택하고 ⊃⍸단순히 첫 번째 요소 의 색인을 가져옵니다 1

q↓⍨에서 많은 행을 삭제하고 q다시 ⎕io←0도움이됩니다.⍸ 모든 0 행을 삭제하기위한 올바른 값을 반환하는

(종료 기능)

에스 이미 달성했다 아르 자형 두 번째 값은 ⊢∘⍉\


다른 접근 방식은 다음과 같습니다.

⍝(⊢∘⍉\+/∘⍴{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.