O Blow-up é uma ferramenta poderosa em geometria algébrica. Permite remover singularidades de conjuntos algébricos , preservando o restante de sua estrutura.
Se você não estiver familiarizado com nada disso, não se preocupe, o cálculo real não é difícil de entender (veja abaixo).
A seguir, estamos considerando a ampliação do ponto de uma curva algébrica em 2D. Uma curva algébrica em 2D é dada pelo locus zero de um polinômio em duas variáveis (por exemplo, para o círculo unitário, ou para uma parábola). A explosão dessa curva (em ) é dada por dois polinômios , conforme definido abaixo. Ambos e descrevem com a (possível) singularidade em removida.
Desafio
Dado algum polinômio , encontre e como definido abaixo.
Definição
Antes de tudo, observe que tudo o que digo aqui é simplificado e não corresponde completamente às definições reais.
Dado um polinômio em duas variáveis a explosão é dada por dois polinômios novamente cada um em duas variáveis.
Para tornar mais claro, considere seguir
Exemplo
Então encontramos
similarmente
Formato de Entrada / Saída
(O mesmo que aqui .) Os polinômios são representados como (m+1) x (n+1)
matrizes / listas de listas de coeficientes inteiros, no exemplo abaixo, os termos dos coeficientes são dados em sua posição:
[ 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]
Portanto, uma elipse 0 = x^2 + 2y^2 -1
seria representada como
[[-1, 0, 1],
[ 0, 0, 0],
[ 2, 0, 0]]
Se preferir, você também pode trocar x
e y
. Em cada direção, você pode ter zeros à direita (ou seja, coeficientes de graus mais altos que são apenas zero). Se for mais conveniente, você também pode ter matrizes escalonadas (em vez de retangulares), de forma que todas as sub-matrizes não contenham zeros à direita.
- O formato de saída é o mesmo que o formato de entrada.
Exemplos
Mais a ser adicionado ( fonte para mais )
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
Exemplos sem imagens
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]]
0+x+x^2+x^3+x^4
Respostas:
Python 3 + numpy,
165134 bytesExperimente online!
A função pega uma
numpy
matriz 2Dp
como entrada e retorna uma tupla(r,s)
de duasnumpy
matrizes 2D.O código não destruído a seguir mostra o processo de computação acima.
Sem Golfe (Básico)
Experimente online!
Ungolfed (Melhorado)
Experimente online!
fonte
APL (Dyalog Unicode) ,
3837 bytes1 byte salvo graças ao ngn usando
+/∘⍴
no lugar do literal fictício0
Experimente online!
(um trem com
⎕io
(origem do índice) definido como 0)⊂
argumento certo fechado,
concatenado com⊂∘
anexo⍉
argumento certo transposto¨
em cada+/∘⍴{ ... }
execute a seguinte função com argumento esquerdo+/
soma⍴
a forma do argumento correto, ou seja, obter linhas + colunase o argumento correto será cada uma das matrizes incluídas.
⍺↑⍵
e pegue o argumento esquerdo⍺
muitas linhas do argumento direito⍵
, se⍵
estiver deficiente em linhas (o que ocorrerá porque linhas + colunas> linhas), é preenchido com 0s suficientesO cálculo da substituição de ou no lugar de ou é feito girando as colunas de pelo seu índice e, como é preenchido com 0s, as colunas de são efetivamente precedidas pela quantidade desejada de 0s.vx uy y x
⍵
⍵
⍵
⊖
gire as colunas⍉⍵
transposto⍵
≢
contar linhas, todas juntas,≢⍉⍵
obtém o número de colunas em⍵
⍳
intervalo 0 .. contagem-1-
negado, para girar na outra direção e o padrão para⊖
, para produzir 0 ¯1 ¯2 ... - (contagem-1), isso vetoriza automaticamente em cada coluna, de modo que a coluna 0 seja girada por 0, a 1-por 1, ...q←
atribua isso à variávelq
Agora, para dividir o polinômio pela maior potência de ou , as principais linhas com 0 devem ser removidas.x y
∨/
reduza por LCM em cada linha, se a linha for todos os 0, isso gera 0, caso contrário, fornece um número positivo×
obtenha seu sinal,0
→0
e número positivo →1
⍸
índices de verdades, ou seja, índices de 1s⊃
escolha o primeiro elemento,⊃⍸
simplesmente obtém o índice do primeiro 1q↓⍨
elimina o número de linhasq
,⎕io←0
ajuda novamente a⍸
retornar o valor correto para eliminar as principais linhas com 0(função de saída)
⊢∘⍉\
Outras abordagens estão listadas abaixo.
fonte