Раздутие является мощным инструментом в алгебраической геометрии. Это позволяет удалять особенности из алгебраических множеств , сохраняя при этом остальную часть их структуры.
Если вы не знакомы ни с чем из этого, не беспокойтесь, фактические вычисления не сложны для понимания (см. Ниже).
В дальнейшем мы рассматриваем увеличение точкиалгебраической кривой в 2D. Алгебраическая кривая в 2D задается нулевым локусом многочлена от двух переменных (например, за единицу круга, или для параболы). Раздутие этой кривой (в) дается двумя полиномами как определено ниже. Обе а также сделать описание с (возможной) особенностью при удален.
Вызов
Учитывая некоторый полином , найти а также как определено ниже.
Определение
Прежде всего обратите внимание, что все, что я здесь говорю, упрощено и не полностью соответствует фактическим определениям.
Учитывая полином в двух переменных раздутие задается двумя многочленами снова каждый в двух переменных.
Получить мы сначала определяем , затем вероятно, кратно т.е. для некоторых где не делит , затем в основном то, что остается после разделения.
Другой многочлен определен точно так же, но мы переключаем переменные: сначала напишите , затем определяется так, что для некоторых где не делит ,
Чтобы сделать это более понятным, рассмотрите следующее
пример
Рассмотрим кривую, заданную нулевым локусом , (Имеет особенность впотому что нет четко определенной касательной в этой точке. )
Тогда мы находим
затем это первый полином.
по аналогии
затем ,
Формат ввода / вывода
(То же, что и здесь .) Полиномы представлены в виде (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
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]]
0+x+x^2+x^3+x^4
Ответы:
Python 3 + numpy,
165134 байтаПопробуйте онлайн!
Функция принимает один
numpy
2D-массив вp
качестве входных данных и возвращает кортеж(r,s)
из двухnumpy
2D-массивов.Разбивка решения заключается в следующем. Для того, чтобы вычислить полиномr переписываем каждый термин xjyi из p в xj+i(yx)i и становится xj+iui в p(x,ux) , Таким образом, мы можем изменить вход(m+1)×(n+1) матрица P в (m+1)×(m+n−1) матрица D соответствует p(x,ux) установив D[i,j+i]=P[i,j] , Затем мы удаляем все нулевые столбцы в начале и концеD выполнить редукцию и получить выходную матрицу R за r ,
Вычислитьs мы просто поменяемся x а также y , повторите тот же процесс, а затем поменяйте их местами. Это соответствует вычислениямR за PT а затем переносит результат.
В следующем негольфовом коде показан вышеуказанный процесс вычисления.
Ungolfed (Основной)
Попробуйте онлайн!
Дальнейшее улучшение решения вычисляет матрицуR за один проход на основе R[i,j+i−c]=P[i,j] , где c=minP[i,j]≠0i+j ,
Ungolfed (Улучшено)
Попробуйте онлайн!
источник
APL (Dyalog Unicode) ,
3837 байт1 байт сохранен благодаря СПП , используя
+/∘⍴
вместо манекена литерала0
Попробуйте онлайн!
(поезд с
⎕io
(начало координат) установлен в 0)⊂
правильный аргумент,
соединенный с⊂∘
закрытый⍉
транспонированный правильный аргумент¨
на каждой+/∘⍴{ ... }
выполнить следующую функцию с левым аргументом+/
сумма⍴
форма правильного аргумента, т.е. получить строки + столбцыи правильным аргументом будет каждая из вложенных матриц.
⍺↑⍵
и взять левый аргумент из⍺
множества строк из правого аргумента⍵
, если⍵
в строках не хватает (что будет, потому что строки + столбцы> строки), он дополняется достаточным количеством 0Вычисление замены или вместо или выполняется путем поворота столбцов на их индекс, и, поскольку они заполнены нулями, к столбцам эффективно добавляется желаемое количество нулей.vx uy y x
⍵
⍵
⍵
⊖
вращать столбцы⍉⍵
транспонировать⍵
≢
количество строк, все вместе,≢⍉⍵
получает количество столбцов в⍵
⍳
диапазон 0 .. количество -1-
Отрицательно, чтобы повернуть в другом направлении и по умолчанию для⊖
, чтобы в конечном итоге привести к 0 ¯1 ¯2 ... - (count-1), это автоматически векторизируется по каждому столбцу так, что 0-й столбец поворачивается на 0, 1 на 1, ...q←
назначить это переменнойq
Теперь, чтобы разделить многочлен на наибольшую степень или , необходимо удалить ведущие строки из всех нулей .x y
∨/
уменьшить на LCM для каждой строки, если строка все-0, это дает 0, в противном случае это дает положительное число×
получить его знак,0
→0
и положительный номер →1
⍸
индексы истинностей, т.е. индексы 1с⊃
выбрать первый элемент,⊃⍸
просто получает индекс первого 1q↓⍨
отбрасывает столько строк изq
, снова⎕io←0
помогает⍸
вернуть правильное значение для отбрасывания ведущих строк все-0(функция выхода)
⊢∘⍉\
Другие подходы перечислены ниже.
источник