Исчисление геометрии Часть 1. Алгебры Клиффорда
В цикле статей «Изобретаем числа» мы знакомились с разнообразной арифметической экзотикой: двойными и дуальными числами, числами Гаусса и Эйзенштейна. В перечисленных числовых системах поле вещественных чисел расширяется дополнительными невещественными элементами, которые я позволил себе неформально называть «квадратными корнями» из единицы, минус единицы или нуля, поскольку их квадраты равны ±1 или 0. Можно определить формальную классификацию таких элементов, основанную на результатах теории представлений. Согласно этой классификации, элементы, равные при возведении в квадрат положительному числу, относятся к гиперболическим элементам, обращающиеся в ноль — к параболическим, а дающие в квадрате отрицательный числа — к эллиптическим. При построении геометрических алгебр мы будем использовать все эти добавки одновременно и моделировать получающимися числами линейные пространства и целые геометрии.
Написание этого цикла сопровождает отладку и подготовку к публикации в официальный репозиторий hackage моей библиотеки Algeometry для языка Haskell (документация здесь (англ.)). Эта библиотека предоставляет удобный DSL не только для эффективных вычислений в геометрических алгебрах, но и для построения чертежей, диаграмм и иллюстраций, как результатов геометрической интерпретации алгебраических выражений. Для чтения статей знание Haskell вовсе не обязательно, но тем, кто знаком с этим языком, примеры кода, создающего иллюстрации, могут быть любопытны. Большая часть иллюстраций в этих статьях создана с помощью Algeometry и небольшого количества Inkscape.
Оглавление серии
Часть 0. Перед знакомством с геометрическими алгебрами может быть полезным просмотреть третью статью цикла «Изобретаем числа». Это не обязательно, но поможет понять логику изложения, которая заметно отличается от стандартных введений в тему.
Часть 1 (которую вы сейчас читаете). После очень небольшого исторического введения мы рассмотрим общие принципы построения алгебр Клиффорда и придём к естественному обоснованию основных (но не всех) свойств геометрического произведения, которое лежит в основе теории. В качестве примера рассмотрим знакомый многим пример алгебры кватернионов, как частного случая алгебры
Часть 2. Далее мы основательно познакомимся с внешними алгебрами (алгебрами Грассмана
Часть 3. Для того чтобы заниматься «нормальной» геометрией, от афинной мы перейдём к проективной геометрии, не выходя при этом за пределы внешней алгебры. При этом у нас появятся новые элементы: идеальные прямые и плоскости и новые геометрические инструменты: ортогональные проекция и антипроекция. В качестве иллюстрации мы создадим пару простых калейдоскопов.
Часть 4. Наконец, мы рассмотрим геометрическую алгебру
Часть 5. В последней теоретической части я дам краткий обзор неевклидовых геометрических алгебр: пространства-времени
Часть 6. Последняя часть планируется как техническое приложение, в которой я хочу поделиться своим опытом разработки библиотеки Algeometry, выбором эффективных структур данных и алгоритмических решений. Она может быть полезной программистам, интересующимся практической стороной геометрической алгебры.
Небольшое введение
Геометрия — это ворота в науку, однако они столь низки и узки, что войти в них можно лишь будучи ребëнком.
Вильям К. Клиффорд
В математике то и дело возникают модные течения. Стереотипные сухость и строгость не мешают математикам искренне увлекаться красивыми идеями и тенденциями, как новыми, так и хорошо забытыми старыми. Последние лет десять в среде физиков, специалистов по компьютерной графике, машинному зрению и распознаванию образов, а также у популяризаторов математики мы наблюдаем резкое повышение интереса к внешним и геометрическим алгебрам, известным также, как алгебры Грассмана и Клиффорда.
Использование алгебраических методов в геометрии восходит к началу XVII века, к работам Рене Декарта и Жирара Дезарга, подарившим нам координатный метод и основы проективной геометрии. В середине позапрошлого века в работах Германа Грассмана, посвящённых мультилинейным формам, появилось новое понятие внешняя алгебра (exterior algebra), формализующее исчисление площадей и объёмов через алгебраические объекты и операции. После этого (в 1870- годы) Вильям Клиффорд, стремясь объединить алгебру кватернионов Гамильтона с внешними алгебрами, определил геометрические числа и геометрические алгебры. К концу столетия эти работы были расширены Эмилем Картаном, и Анри Пуанкаре, а в начале XX века Поль Дирак успешно применил их в разработке релятивистской теории электрона. Идеи Грассмана и Клиффорда развивались в работах Павла Алексеевича Некрасова, создавшего операторный аналог внешней алгебры для решения систем дифференциальных уравнений. В 1930-е годы Иван Матвеевич Виноградов, исследуя квадратичные формы, вывел критерии для представимости чисел квадратичными формами, которые используются в построении базисов алгебр Клиффорда.
В последующие сто лет все эти идеи были востребованы в дифференциальной геометрии, в матфизике, в теории поля и в алгебраических теориях, однако до 1980-х годов этот раздел оставался лишь в числе специальных и факультативных в курсах физфака или мехмата. А уж прикладники-компьютерщики — законодатели мод в современной математике, о ней либо не знали вовсе, либо считали слишком абстрактной до начала нашего столетия. И только, в 2001 году после работы Джона Селига, в которой на лаконичный язык геометрической алгебры была переведена евклидова геометрия, на неё обратили внимание компьютерщики. В 2008 году вышла работа Микеля Родригеса, посвящённая применению геометрической алгебры для системы распознавания образов. Популяризации геометрических алгебр способствовал блестящий цикл статей Чарльза Гунна, показавший чисто практические аспекты их использования. А потом появились многочисленные блоги, ролики на YouTube и обучающие курсы. И вот мы уже слышим заявления о том, что надо включить геометрические алгебры в базовые курсы математики для всех студентов, а также что пора выбросить на помойку кватернионы, спиноры, координаты Плюккера, матрицы Паули и Дирака, а также векторное произведение, поскольку всё это вместе с комплексными числами и группами Ли появляется «само собой» даже в простейших геометрических алгебрах.
Такой энтузиазм привёл современную геометрическую алгебру к болезненному этапу взросления, который проживают многие теории или методологические школы, обретшие популярность. На сегодняшний день ещё не выработался единый стройный непротиворечивый методологический подход к построению геометрических алгебр, зато есть множество школ, практических реализаций и подходов, которые отличаются друг от друга в нюансах и интерпретациях. Об этом состоянии дел подробно пишет Эрик Ленгэль (например, здесь), наиболее далеко продвинувшийся на пути создания непротиворечивых основ геометрической алгебры. В своей работе над библиотекой и этим циклом статей я использовал именно его подход, принимая при этом и некоторые его недостатки, о которых расскажу позже.
В общем, мода модой, но геометрическая алгебра мне кажется достаточно полезным инструментом, с которым имеет смысл познакомиться всякому, интересующемуся математикой, как прикладной, так и теоретической. В ней есть много красивых положений и стройных обобщений, которые, действительно позволяют существенно упростить описание движения твёрдого тела, проективных построений, релятивистских процессов, физических полей, уравнений матфизики и квантовой механики, конформных отображений и много чего ещё.
Конечно же, Хабр, не учебник, так что не ждите, пожалуйста, развёрнутого курса лекций. Вместо этого, я постараюсь поделиться логикой построения геометрической алгебры и тем, что меня самого очаровывает при работе с ними.
Зачем это нам, простым людям?
В геометрических алгебрах точки, прямые, плоскости и прочие линейные подпространства представляются объектами одного класса, которые рассматриваются, как своеобразные числа. Геометрические числа можно сравнивать, складывать и перемножать, они могут быть решениями алгебраических уравнений или аргументами различных элементарных функций (корней, экспонент, логарифмов и т. п.), но в то же самое время, они представляют те или иные геометрические объекты или их преобразования. Их можно комбинировать между собой богатым набором комбинаторов: различными типами умножения: геометрическим, внешним, внутренними, двумя сечениями, тремя видами инволюции, а также операциями, двойственными всем перечисленным выше. Эти комбинаторы не только корректно определены для любой геометрической алгебры, но и имеют геометрическое толкование, не зависящее от размерности геометрического пространства и конкретных координатных систем.
Возможно, вы обратили внимание на то, что я говорю о геометрических алгебрах во множественном числе. Начиная со знаменитой эрлангенской программы Феликса Клейна, различные геометрии сами становятся объектом исследования и определяются топологией пространства и группой его преобразований, сохраняющих некий инвариант. Геометрических алгебр, действительно, много: одни отражают геометрию в афинном векторном пространстве, другие — в более богатом евклидовом пространстве, допускающем сдвиги. Есть вариант, добавляющий идеальные точки и прямые в проективном смысле. Существует геометрическая алгебра, включающая в качестве базовых объектов не только точки, прямые и плоскости, но и окружности, сферы и диполи, расширяя евклидовы изометрии конформными отображениями. К элементам геометрических алгебр относятся не только геометрические объекты, но и полезные абстракции движений: кватернионы, спиноры, моторы, флексоры и другие. Самое замечательное то, что ключевые определения, операции и формулы во всех этих алгебрах остаются совершенно одинаковыми. Меняются базисные элементы алгебры и геометрические интерпретации геометрических чисел, как объектов и преобразований, но алгебраические законы остаются при этом универсальными. Это то, что в программировании называется полиморфизмом: когда одна функция или процедура может корректно работать с различными типами данных.
Более того, все базовые преобразования, которые по Клейну, и определяют геометрию: отражения, сдвиги, повороты, проекции, пересечения, прямые суммы, дополнения, инверсии и т. п. также выражаются через элементы и операции геометрической алгебры, то есть, через геометрические числа и их комбинаторы. Таким образом, в геометрических алгебрах объекты и их преобразования представляются в совершенно единообразной форме.
Однако, у такого единообразия есть и слабые стороны. Программистам хорошо знакомы парадигмы с девизами «всё есть [выражение, функция, объект, словарь...]». Как proof of concept некоторой философии они интересны и даже красивы, но на практике приходится жертвовать чистотой парадигмы. Гомоиконичность, слабая динамическая типизация и неявное приведение типов могут привести к семантически некорректным, но валидным выполняемым программам. В геометрической алгебре всё есть число (мультивектор): и точки и прямые и углы и их преобразования. Для дюжины операторов определённых в алгебре нет никаких ограничений на операнды (таких, например, как размерность, геометрическая или физическая), так что, в отличие от классической векторной алгебры, где, например, векторное произведение корректно определено только для двух векторов в трёхмерном пространстве, в геометрической алгебре не составит никаких проблем вычислить внешнее произведение (обобщение векторного произведения) от каких угодно элементов, получая какой-то результат, чаще всего, не имеющий геометрического смысла. Возможно, дальнейшее развитие теории геометрической алгебры позволит создать какие-то аналоги типизации или физической размерности, но пока геометрические вычисления становятся подобны коду на языке ассемблера, в котором соблюдение семантической целостности остаётся полностью на совести программиста.
Поскольку впереди нас ждёт довольно нетривиальный путь математических рассуждений, предлагаю сперва взглянуть на пару примеров, для поддержания любопытства.
Пример построения на плоскости
Для начала приведу простенький пример того, как производятся вычисления в двумерной проективной геометрической алгебре
Пусть нам дан треугольник, с вершинами
1. Находим высотв треугольника, как перпендикуляры, опущенные из точек
Ортоцентром будет точка пересечения этих прямых:
2. Находим срединныe перпендикуляры к сторонам
Циркументр — это точка пересечения срединных перпендикуляров:
3. Находим прямую Эйлера, как прямую, проходящую через ортоцентр и центр описанной окружности:
Результатом этих вычислений будут прямые и точки, выраженные геометрическими числами. Однако все указанные выше операции, определяются не через комбинации координат, а через обобщённые операции над геометрическими числами
А вот как выглядит программа, которая строит приведённый выше чертёж и проверяет, что центроид принадлежит прямой Эйлера:
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Algeometry
import Lucid.Svg.Algeometry
import Lucid.Svg
-- Построение на плоскости
fig1 :: Space (PGA 2) Bool
fig1 = do
-- треугольник
pA <- point [-15, 0] @ [id_ "A"]
pB <- point [15, -10] @ [id_ "B"]
pC <- point [0, 15] @ [id_ "C"]
polygon [pA, pB, pC] <@ [fill_ "wheat"]
-- высоты треугольника
a <- (pB ∧ pC) |= pA @ [id_ "a"] <@ [stroke_ "navy"]
b <- (pA ∧ pC) |= pB @ [id_ "b"] <@ [stroke_ "navy"]
-- срединные перпендикуляры
a' <- (pB ∧ pC) |= (pB + pC)/2 @ [id_ "a'"] <@ [stroke_ "gray"]
b' <- (pA ∧ pC) |= (pA + pC)/2 @ [id_ "b'"] <@ [stroke_ "gray"]
-- центры треугольника
pO <- a ∨ b @ [id_ "O"]
pO' <- a' ∨ b' @ [id_ "O'"]
pO'' <- (pA + pB + pC)/3 @ [id_ "O''"]
-- прямая Эйлера
e <- pO ∧ pO' @ [id_ "e"] <@ [ stroke_ "red"]
-- проверка коллинеарности центров
return (e ∧ pO'' == 0)
-- запись в файл
main = writeSVG "fig1.svg" $ chart fig1
Как видите, программа просто повторяет мои выкладки, что весьма удобно. Кроме картинки, она возвращает результат проверки нашего предположения.
λ> getResult fig1
True
Пример построения в пространстве
А вот как эту же задачу можно решить для трёх точек, расположенных в трёхмерном пространстве в проективной алгебре
1. Находим плоскости, проходящие через вершины
Ортоцентром будет точка пересечения плоскостей
2. Находим плоскости, проходящие через середины сторон треугольника и ортогональные им:
Циркумцентром будет точка пересечения этих трëх плоскостей и плоскости треугольника:
3. Прямая Эйлера соединяет эти две точки:
Пространство и объекты изменились, однако принципы вычислений и формулы остались прежними! Вот как это построение выглядит на чертеже и в программе:
fig2 :: Space (PGA 3) Bool
fig2 = do
-- треугольник
pA <- point [-15, 0, 10] @ [id_ "A"]
pB <- point [15, -10, 1] @ [id_ "B"]
pC <- point [0, 15, 15] @ [id_ "C"]
polygon [pA, pB, pC] <@ [fill_ "wheat"]
let
-- высоты треугольника
a = (pB ∧ pC) |= pA -- эти элементы в 3D
b = (pA ∧ pC) |= pB -- являются плоскостями,
-- срединные перпендикуляры
a' = (pB ∧ pC) |= (pB + pC)/2 -- поэтому их изображать
b' = (pA ∧ pC) |= (pA + pC)/2 -- не будем, а построим
-- плоскость треугольника
plP = pA ∧ pB ∧ pC -- пересечение с плоскоcтью P
-- центры треугольника
pO <- a ∨ b ∨ plP @ [id_ "O"]
pO' <- a' ∨ b' ∨ plP @ [id_ "O'"]
pO'' <- (pA + pB + pC)/3 @ [id_ "O''"]
-- прямая Эйлера
e <- pO' ∧ pO @ [id_ "e"] <@ [stroke_ "red"]
-- проверка коллинеарности центров
return (e ∧ pA == 0)
Вращение чертежа, построение двумерной проекции и создание анимации требует дополнительных вычислений:
main = runAnimation "fig2.gif" $ animate 80 (0, 2*pi) frame
where
frame α =
-- создание чертежа
chart `range` (-30,30) `size` (400,300) $
-- проецирование из 3D геометрии на 2D
viewFrom @(PGA 3) @(PGA 2) [0,0,50] $
-- вращение чертежа
mapSpace (rotateAt' (vect [0,1]) α) fig2
Примечательно, что даже если вершины треугольника окажутся на одной прямой, алгебраический метод вычисления прямой Эйлера не сломается. Ортоцентр превратится в идеальную точку «на бесконечности», центр описанной окружности окажется на середине самой длинной стороны, а прямая Эйлера совпадёт с прямой, на которой расположились вершины вырожденного треугольника.
Базовые ингридиенты алгебры Клиффорда
Ну, что же, перейдём, наконец, к нашей главной теме — к алгебростроению. Пора чётко определиться с тем, что мы в этих статьях будем называть словом «алгебра». Это линейное пространство (похожее по структуре на векторное), в котором определены операция сложения и умножения на число, а также определена операция умножения элементов этого пространства. Чтобы носить гордое имя «умножения» последняя упомянутая нами операция должна быть ассоциативной (должен выполняться сочетательный закон), унитальной (должен существовать единственный нейтральный элемент, эквивалентный вещественной единице) и дистрибутивной (должен выполняться распределительный закон).
Вместо введения особого умножения, можно с помощью матриц строить представления элементов алгебры после чего пользоваться хорошо известными методами линейной алгебры. Геометрическая алгебра предлагает альтернативный подход: последовательное расширение алгебры вещественных чисел дополнительными элементами. Наша задача на сегодня — выяснить какой может и должна быть «минимальная» алгебра, расширяющая поле вещественных чисел до геометрических чисел, моделирующих линейные пространства и операции над ними.
Гиперболические, дуальные и эллиптические числовые системы строятся как расширение некоторого базового поля (кольца) элементом, который определяется, как решение некоторого алгебраического уравнения с коэффициентами из базового поля. Так комплексные (эллиптические) числа строятся на добавлении к вещественным числам решения уравнения
Уравнения, определяющие числовую систему, могут иметь любой порядок, например, числа Ейзенштейна определяются уравнением третьей степени, но если мы ограничимся определяющими уравнениями только второго порядка, то это существенно облегчит нам жизнь: значение любого многочлена в такой алгебре будет линейной комбинацией вещественного числа и расширяющего элемента. Действительно, в какую бы степень мы не возвели выражение
Алгебры Клиффорда расширяют вещественные числа не одним, а сразу несколькими новыми независимыми элементами, не являющимися вещественными, но превращающимися в вещественные числа при возведении в квадрат. Эти дополнительные элементы называются генераторами алгебры.
Тут важно сделать паузу и уточнить, что означает слово «независимый», применительно к числам. Когда мы говорим о независимых векторах или направлениях, то имеем в виду линейную независимость: Векторы
Введём кое-какие обозначения. Для вещественных коэффициентов мы будем использовать строчные буквы
Умножение в алгебре Клиффорда называется произведением Клиффорда или, в контексте геометрических алгебр, геометрическим произведением. Для него практически во всей литературе принято обычное обозначение конкатенацией, то есть, отсутствием знака между множителями. Но Эрик Ленгэль предложил для геометрического произведения специальный знак
Алгебры, получаемые добавкой одной дополнительной единицы мы уже рассмотрели, перейдём к системам с двумя генераторами
Пусть
Это уравнение называется соотношением Клиффорда. Зачем в нём понадобилась двойка, мы скоро выясним. Давайте присмотримся к неизвестной до поры вещественнозначной функции от двух аргументов
Во-первых, она симметрична:
Такая функция соответствует билинейной квадратичной форме и в векторной алгебре имеет смысл скалярного произведения, с помощью которого вычисляется норма (длина) вектора
Мы строим геометрическую алгебру, и если будем интерпретировать единицы
Наконец, для линейно независимых элементов
Так в общем случае определяются алгебры Клиффорда, порождённые двумя генераторами. Конкретная алгебра однозначно задаётся значениями
С учётом антикоммутативности, в алгебре с двумя генераторами
Если генераторов будет не два, а больше, то увеличится и число их комбинаций, то есть базисных элементов. Число множителей в базисном элементе называется его рангом. Например, для трёх генераторов
Отсюда сразу можно сделать вывод, что построить альтернативную алгебру с двумя мнимыми единицами, не получив вместе с ними третью, не выйдет. Именно поэтому расширением комплексных чисел являются кватернионы (числа Гильберта) с одной вещественной и тремя мнимыми единицами, а их расширение — октонионы (числа Кэли) содержат сразу 7 мнимых единиц.
Подводим промежуточный итог. Произвольная алгебра Клиффорда строится с помощью
Таким образом, алгебры Клиффорда появляются не из хитрых определений в учебнике, а как естественное и непротиворечивое развитие идей, обобщающих комплексные, дуальные и двойные числа.
Поскольку алгебра Клиффорда однозначно определяется квадратами генераторов, её можно охарактеризовать так называемой сигнатурой — количеством базовых элементов, которые при возведении в квадрат дают
Алгебра Клиффорда над полем
Когда одной мнимой единицы мало
Знакомство с более сложными алгебрами мы начнём с гиперкомплексных чисел, потому что это, как ни странно, самый простой для понимания вариант.
Первой будет алгебра
Итак, получается, что четвёртый базисный элемент алгебры тоже представляет собой корень из
О геометрическом смысле мнимой единицы мы подробно говорили здесь. Если в качестве умножения использовать повторение некоторой операции или преобразования, то роль операции, которая при двукратном применении меняет объект на противоположный, может играть поворот на
Наши два генератора
Получается, что три невещественных элемента
Если ввести обозначения
Я не стану здесь рассказывать о том, как именно с помощью кватернионов задаётся вращение, потому что мы будем делать это средствами проективной геометрической алгебры почти таким же образом и даже лучше. Однако стоит заметить, что алгебра кватернионов заняла законное место в инструментарии программистов, чья работа связана с движениями твёрдого тела, или вращением трёхмерных сцен и объектов в играх.
Добавив третий мнимый генератор, мы получим алгебру, в которой
Кроме того, произвольный элемент алгебры
где
Наконец, все алгебры Клиффорда ассоциативны, так что порядок вычислений в произведении не имеет значения (в отличие от порядка множителей в произведении). Октонионы же представляют собой единственную алгебру с семью мнимыми компонентами, которая не распадается на более простые алгебры, но ценой потери ассоциативности умножения.
При добавлении в алгебру новых мнимых генераторов, мы будем получать всё более сложные алгебраические структуры над кватернионами, которые выражаются уже в матричном виде. Там есть о чём поговорить, но поскольку нам эти структуры не понадобятся, дальше в эту сторону мы не полезем. Сейчас нам важно было увидеть, что одни алгебры Клиффорда могут превращаться в другие, изменяя при этом базовую числовую систему.
В следующий раз мы рассмотрим алгебры Клиффорда с несколькими корнями из нуля и познакомимся с внешними алгебрами Грассмана. А напоследок, я хочу привести ещё один визуальный пример применения геометрической алгебры. И коль скоро речь у нас зашла о вращении, продемонстрируем как осуществляется вращение в проективной геометрической алгебре на примере построения и визуализации ленты Мёбиуса в трёхмерном пространстве.
-- Ротор: геометрическое число, поворачивающее пространство
-- на угол α вокруг прямой l при сопряжении.
rotor :: (Floating a, Geometric a) => Double -> a -> a
rotor α l = exp' (scalar' (α/2) ⟇ l)
-- Транслятор: геометрическое число, сдвигающее пространство
-- на расстояние d, вдоль прямой l при сопряжении.
trans :: (Floating a, Geometric a) => Double -> a -> a
trans d l = exp' (scalar (d/2) ⟇ l)
-- Сопряжение анти-геометрическим произведением (⟇)
conjugate' :: Clifford a => a -> a -> a
conjugate' t x = t ⟇ x ⟇ rev t
-- Лента Мёбиуса, заданная в форме линейчатой поверхности
moebius :: Space (PGA 3) ()
moebius =
sequence_ [ draw (transform (pi*k/50) <$> segment)
| k <- [0..200]]
where
-- базовый отрезок
segment = [point [-1,0,0], point [1,0,0]]
-- преобразование отрезка, как композиция поворотов и сдвига
transform α =
conjugate' (rotor α e03 ⟇ -- поворот относительно Oz
trans 2 e01 ⟇ -- сдвиг вдоль Ox
rotor (α/2) e02) -- поворот относительно Oy
-- отрисовка отрезка
draw s = polyline s <@ [opacity_ "0.5", stroke_ "blue"]
-- Проекция 3D объектов на плоскость и анимация
main =
runAnimation "moebius.gif" $ animate 20 (0, 2*pi) $
\β -> chart `range` (-3, 3) $
viewFrom @(PGA 3) @(PGA 2) [0,0,30] $
mapSpace (apply (rotor β (nvect [1,1,1]))) moebius
Читатель, знакомый с кватернионами, может признать в поворотах и сдвигах знакомый мотив. Эти преобразования осуществляют геометрические числа, с помощью особенного умножения (⟇), двойственного геометрическому, слева и справа с сопряжением. Обратите ещё внимание на то что, ротор, кодирующий поворот, выражен в экспоненциальной форме, как это делается в комплексной плоскости, с той лишь разницей, что вместо мнимой единицы используется геометрическое число, представляющее ось вращения. О том как именно всё это работает и как линейные комбинации элементов второго ранга