В цикле статей «Изобретаем числа» мы знакомились с разнообразной арифметической экзотикой: двойными и дуальными числами, числами Гаусса и Эйзенштейна. В перечисленных числовых системах поле вещественных чисел расширяется дополнительными невещественными элементами, которые я позволил себе неформально называть «квадратными корнями» из единицы, минус единицы или нуля, поскольку их квадраты равны ±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
Примечательно, что даже если вершины треугольника окажутся на одной прямой, алгебраический метод вычисления прямой Эйлера не сломается. Ортоцентр превратится в идеальную точку «на бесконечности», центр описанной окружности окажется на середине самой длинной стороны, а прямая Эйлера совпадёт с прямой, на которой расположились вершины вырожденного треугольника.
Базовые ингридиенты алгебры Клиффорда
Ну, что же, перейдём, наконец, к нашей главной теме — к алгебростроению. Пора чётко определиться с тем, что мы в этих статьях будем называть словом «алгебра». Это линейное пространство (похожее по структуре на векторное), в котором определены операция сложения и умножения на число, а также определена операция умножения элементов этого пространства. Чтобы носить гордое имя «умножения» последняя упомянутая нами операция должна быть ассоциативной (должен выполняться сочетательный закон), унитальной (должен существовать единственный нейтральный элемент, эквивалентный вещественной единице) и дистрибутивной (должен выполняться распределительный закон).
Вместо введения особого умножения, можно с помощью матриц строить представления элементов алгебры после чего пользоваться хорошо известными методами линейной алгебры. Геометрическая алгебра предлагает альтернативный подход: последовательное расширение алгебры вещественных чисел дополнительными элементами. Наша задача на сегодня — выяснить какой может и должна быть «минимальная» алгебра, расширяющая поле вещественных чисел до геометрических чисел, моделирующих линейные пространства и операции над ними.
Гиперболические, дуальные и эллиптические числовые системы строятся как расширение некоторого базового поля (кольца) элементом, который определяется, как решение некоторого алгебраического уравнения с коэффициентами из базового поля. Так комплексные (эллиптические) числа строятся на добавлении к вещественным числам решения уравнения , двойные (гиперболические) числа содержат число, которое является решением уравнения
, но при этом отлично от вещественной единицы. Дуальные (эллиптические) числа расширяют вещественные числа ненулевым решением уравнения
. Последние два варианта могут показаться странными и искусственными, поскольку в исходных числовых системах такие числа уже присутствуют, однако смысл в этом, всё же, есть.
Уравнения, определяющие числовую систему, могут иметь любой порядок, например, числа Ейзенштейна определяются уравнением третьей степени, но если мы ограничимся определяющими уравнениями только второго порядка, то это существенно облегчит нам жизнь: значение любого многочлена в такой алгебре будет линейной комбинацией вещественного числа и расширяющего элемента. Действительно, в какую бы степень мы не возвели выражение , если
при возведении в квадрат превращается в обыкновенное вещественное число, неважно, положительное или отрицательное, то результат вновь приобретёт линейный вид
. Это же относится и к многочлену
любой степени, в котором переменная
имеет вид
. Линейность произвольного элемента это ценное свойство, отказываться от него не стоит, так что мы ограничимся рассмотрением именно таких алгебр.
Алгебры Клиффорда расширяют вещественные числа не одним, а сразу несколькими новыми независимыми элементами, не являющимися вещественными, но превращающимися в вещественные числа при возведении в квадрат. Эти дополнительные элементы называются генераторами алгебры.
Тут важно сделать паузу и уточнить, что означает слово «независимый», применительно к числам. Когда мы говорим о независимых векторах или направлениях, то имеем в виду линейную независимость: Векторы и
независимы друг от друга, если их линейная комбинация
может быть равна нулю, только в том случае, если оба коэффициента
равны нулю. Такой же точно подход применим и к числам. Например,
и
независимы в поле рациональных чисел. Действительно, никакой линейной комбинацией этих двух иррациональных чисел с целыми или рациональными коэффициентами невозможно получить ноль. А вот, например, рациональные числа, добавленные к целым, независимыми уже не будут. Поскольку мы строим числа, как линейные комбинации вещественной единицы и невещественных генераторов, при построении таких чисел мы имеем все основания считать их независимыми именно в таком, векторном, смысле.
Введём кое-какие обозначения. Для вещественных коэффициентов мы будем использовать строчные буквы для генераторов — символы
. и, кроме того, отдельно введём обозначение для вещественной единицы —
. Элементы алгебры будут обозначаться жирным шрифтом.
Умножение в алгебре Клиффорда называется произведением Клиффорда или, в контексте геометрических алгебр, геометрическим произведением. Для него практически во всей литературе принято обычное обозначение конкатенацией, то есть, отсутствием знака между множителями. Но Эрик Ленгэль предложил для геометрического произведения специальный знак , вполне убедительное его обосновал и даже стал спонсором этого символа в Unicode. О нетривиальной семиотике геометрического произведения мы поговорим существенно позже, когда основательно поработаем с внешним произведением, аккуратно введём внутренние произведения и разберёмся с двойственностью. Для тех, кто уже знаком с геометрической алгеброй по другим источникам, такое обозначение может показаться непривычным и неудобным, но я продолжу использовать его даже по отношению к генераторам.
Алгебры, получаемые добавкой одной дополнительной единицы мы уже рассмотрели, перейдём к системам с двумя генераторами и
. Число в такой системе может быть линейной комбинацией:
Однако вычисляя геометрическое произведение с другими числами такого же вида, мы в силу распределительного закона, можем получить и другие произведения:
и
. По школьной привычке мы могли бы счесть их равными друг другу. И вот тут есть один очень важный момент: для умножения наших элементов вовсе не обязан выполняться перестановочный закон, справедливый для вещественных чисел. Более того, мы увидим, что он даже нежелателен. Однако, если в самом общем случае выражения
и
не будут связаны никакими дополнительными соотношениями, то в такой свободной алгебре появится бесконечно много элементов вида
,
и им подобных, ведь просто переставить элементы местами, чтобы упростить их, не получится. Значит, свободу в этом вопросе стоит как-то ограничить. Мы сможем определить каким должно быть это ограничение, отталкиваясь от основного свойства наших единиц: давать в квадрате вещественное число.
Пусть и
. Где числа
и
принимают какие-то известные вещественные значения. Имеет смысл потребовать (о том почему, поговорим чуть позже) чтобы любая линейная комбинация невещественных единиц при возведении в квадрат тоже давала вещественное число, то есть, чтобы выражение
было вещественным. Раскрывая квадрат, мы получим выражение
и увидим, что при коммутативном умножении, то есть, если
, получить ненулевой вещественный результат не выйдет. Само собой напрашивается очевидное решение — искусственно положить, что
, но перед тем как остановиться на этом варианте, давайте рассмотрим общий случай произведения двух элементов, который мы запишем так:
Это уравнение называется соотношением Клиффорда. Зачем в нём понадобилась двойка, мы скоро выясним. Давайте присмотримся к неизвестной до поры вещественнозначной функции от двух аргументов , которая определяется левой стороной соотношения Клиффорда:
Во-первых, она симметрична: , а во-вторых, линейна по обоим своим аргументам, то есть
Такая функция соответствует билинейной квадратичной форме и в векторной алгебре имеет смысл скалярного произведения, с помощью которого вычисляется норма (длина) вектора .
Мы строим геометрическую алгебру, и если будем интерпретировать единицы и
, как векторы, то числа
и
будут их нормами, а функция
— их скалярным произведением. При такой интерпретации наше указанное выше требование чтобы квадрат любой линейной комбинации
и
был вещественным, можно толковать так: сумма векторов тоже должна быть вектором и при возведении в квадрат тоже должна превращаться в скаляр, то есть, в норму этой суммы.
Наконец, для линейно независимых элементов и
их скалярное произведение должно быть равно нулю, а значит
, и следовательно, мы остаëмся с единственным полностью обоснованным антикоммутативным вариантом:
Ну, а для того, чтобы умножение элемента на самого себя было равно его квадрату, нам и понадобилась двойка в соотношении Клиффорда.
Так в общем случае определяются алгебры Клиффорда, порождённые двумя генераторами. Конкретная алгебра однозначно задаётся значениями и
которые могут быть положительными, нулевыми или отрицательными. Без нарушения общности генераторы алгебры можно считать нормированными, то есть, дающими при возведении в квадрат
или
.
С учётом антикоммутативности, в алгебре с двумя генераторами и
будет четыре линейно независимых элемента
и любой элемент алгебры будет их линейной комбинацией. Эти элементы составляют базис алгебры, а их количество её размерность. Для краткости, произведения генераторов (мономы)
обозначаются мультииндексом
.
Если генераторов будет не два, а больше, то увеличится и число их комбинаций, то есть базисных элементов. Число множителей в базисном элементе называется его рангом. Например, для трёх генераторов ,
и
мы получим дополнительно три несократимых произведения второго ранга:
,
,
, и одно — третьего ранга:
. Скаляры
имеют ранг 0. Таким образом, базис алгебры с тремя генераторами это множество
. Четыре генератора породят шесть базисных элементов второго ранга, четыре — третьего ранга, и один — четвёртого. Нетрудно индуктивно догадаться и доказать, что в алгебре с
генераторами будет всего
базисных элемента, а количество мономов ранга
будет равно биномиальному коэффициенту
, то есть, числу сочетаний по
из
.
Отсюда сразу можно сделать вывод, что построить альтернативную алгебру с двумя мнимыми единицами, не получив вместе с ними третью, не выйдет. Именно поэтому расширением комплексных чисел являются кватернионы (числа Гильберта) с одной вещественной и тремя мнимыми единицами, а их расширение — октонионы (числа Кэли) содержат сразу 7 мнимых единиц.
Подводим промежуточный итог. Произвольная алгебра Клиффорда строится с помощью независимых генераторов, еë элементы — линейные комбинации
базисных элементов, имеющих ранги от
до
. Она оснащена операцией поэлементного сложения (
) и дистрибутивной с ней ассоциативной антикоммутативной операцией умножения (
). При этом требования линейности и конечности алгебры, линейной независимости и нормированности её генераторов, а также того чтобы квадрат любого элемента ранга 1 был скаляром, определяют следующие соотношения для генераторов:
Таким образом, алгебры Клиффорда появляются не из хитрых определений в учебнике, а как естественное и непротиворечивое развитие идей, обобщающих комплексные, дуальные и двойные числа.
Поскольку алгебра Клиффорда однозначно определяется квадратами генераторов, её можно охарактеризовать так называемой сигнатурой — количеством базовых элементов, которые при возведении в квадрат дают или
. Она задаëтся тройкой индексов
которые говорят, что алгебра содержит
единиц,
мнимых единиц и
исчезающих элементов.
Алгебра Клиффорда над полем с такой сигнатурой обозначается
В дальнейшем, если конкретное поле не важно, то аргумент в скобках я буду опускать. Вот три элементарные алгебры Клиффорда:
Когда одной мнимой единицы мало
Знакомство с более сложными алгебрами мы начнём с гиперкомплексных чисел, потому что это, как ни странно, самый простой для понимания вариант.
Первой будет алгебра , в которой два генератора
и
, расширяют поле вещественных чисел и образуют четыре базисных элемента:
. При этом
. Посмотрим, как будет выглядеть таблица умножения на элемент второго ранга
:
Итак, получается, что четвёртый базисный элемент алгебры тоже представляет собой корень из . Кроме того, он при умножении меняет
на
и наоборот, но со сменой знака.
О геометрическом смысле мнимой единицы мы подробно говорили здесь. Если в качестве умножения использовать повторение некоторой операции или преобразования, то роль операции, которая при двукратном применении меняет объект на противоположный, может играть поворот на .
Наши два генератора и
линейно независимы, а значит, они не могут быть поворотами в одной плоскости, и должны действовать, как минимум, на трёхмерном пространстве и в разных плоскостях. Однако композицию (произведение) двух поворотов вокруг неколлинеарных осей всегда можно выразить одним поворотом вокруг некой третьей оси, независимой от первых двух. Это и есть третий мнимый элемент нашей алгебры, который неизбежно должен был появиться при введении двух генераторов.
Получается, что три невещественных элемента ,
и
описывают группу поворотов на
вокруг трёх независимых осей, а соответствующая алгебра Клиффорда с помощью линейных комбинаций позволяет описать более сложную группу вращений в пространстве. Умножение в этой алгебре представляет композицию преобразований, которые можно свести к поворотам.
Если ввести обозначения ,
,
, и выписать таблицу умножения для элементов алгебры
, то мы получим хорошо известную группу кватернионов, впервые описанную Джоном Гамильтоном задолго до выхода работ Вильяма Клиффорда. Эта группа задаётся восемью элементами:
и определяется соотношением
Я не стану здесь рассказывать о том, как именно с помощью кватернионов задаётся вращение, потому что мы будем делать это средствами проективной геометрической алгебры почти таким же образом и даже лучше. Однако стоит заметить, что алгебра кватернионов заняла законное место в инструментарии программистов, чья работа связана с движения твёрдого тела, или вращением трёхмерных сцен и объектов в играх.
Добавив третий мнимый генератор, мы получим алгебру, в которой элементов:
Наверняка, кто-то из читателей слышал про октонионы — систему, следующую за кватернионами в иерархии гиперкомплексных чисел. Так вот, это не они. Первым делом, заметим, что элемент третьего порядка
перестал быть мнимым, и при возведении квадрат равен единице:
Кроме того, произвольный элемент алгебры можно перегруппировать, вынеся за скобки элемент
из слагаемых второго и третьего ранга:
где и
это кватернионы, ведь все генераторы — это мнимые единицы. Получается, что алгебра
распадается на алгебру двойных чисел над кватернионами, то есть, на двумерное линейное пространство над кватернионами
Наконец, все алгебры Клиффорда ассоциативны, так что порядок вычислений в произведении не имеет значения (в отличие от порядка множителей в произведении). Октонионы же представляют собой единственную алгебру с семью мнимыми компонентами, которая не распадается на более простые алгебры, но ценой потери ассоциативности умножения.
При добавлении в алгебру новых мнимых генераторов, мы будем получать всё более сложные алгебраические структуры над кватернионами, которые выражаются уже в матричном виде. Там есть о чём поговорить, но поскольку нам эти структуры не понадобятся, дальше в эту сторону мы не полезем. Сейчас нам важно было увидеть, что одни алгебры Клиффорда могут превращаться в другие, изменяя при этом базовую числовую систему.
В следующий раз мы рассмотрим алгебры Клиффорда с несколькими корнями из нуля и познакомимся с внешними алгебрами Грассмана. А напоследок, я хочу привести ещё один визуальный пример применения геометрической алгебры. И коль скоро речь у нас зашла о вращении, продемонстрируем как осуществляется вращение в проективной геометрической алгебре на примере построения и визуализации ленты Мёбиуса в трёхмерном пространстве.

-- Ротор: геометрическое число, поворачивающее пространство
-- на угол α вокруг прямой 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
Читатель, знакомый с кватернионами, может признать в поворотах и сдвигах знакомый мотив. Эти преобразования осуществляют геометрические числа, с помощью особенного умножения (⟇), двойственного геометрическому, слева и справа с сопряжением. Обратите ещё внимание на то что, ротор, кодирующий поворот, выражен в экспоненциальной форме, как это делается в комплексной плоскости, с той лишь разницей, что вместо мнимой единицы используется геометрическое число, представляющее ось вращения. О том как именно всё это работает и как линейные комбинации элементов второго ранга ,
и
образуют прямые в трёхмерной проективной алгебре мы поговорим достаточно подробно в третьей и четвёртой частях.
Комментарии (10)
Tyusha
05.06.2025 09:58Замечательно! Отличный подход к повествованию. Отсылки и взгляд на знакомые структуры с обобщённой стороны очень помогают.
lgorSL
05.06.2025 09:58Огромное спасибо за статью! Очень не хватало высокоуровневого математического взгляда на происходящее, в рунете релевантной информации почти нет, да и на английском немного.
Возможно, дальнейшее развитие теории геометрической алгебры позволит создать какие-то аналоги типизации или физической размерности, но пока геометрические вычисления становятся подобны коду на языке ассемблера, в котором соблюдение семантической целостности остаётся полностью на совести программиста.
Можно и сейчас, и с типами сильно удобнее. Мне правда не хватило выразительной мощи системы типов в Scala и я пошёл по пути кодогенерации для какого-то подмножества типов и ограничился только одной алгеброй - проективной для 3д: https://github.com/Kright/ScalaGameMath/tree/master/pga3d/shared/src/main/scala/com/github/kright/pga3d
Классы, которые я решил выделить - скаляр, плоскость, идеальная плоскость, бивектор, бивектор с компонентами с e_w, бивектор с компонентами без e_w, кватернион, мотор, транслятор, тривектор, точка, вектор и точка в начале координат и мнимая единица (тут коллизия в названий, вектор это тривектор где e_xyz = 0, у точки e_xyz = 1, а у тривектора e_xyz произвольный).
В разделение нормализованный/не нормализованный я не стал лезть, потому что из-за погрешности вычислений произведение двух нормализованных элементов уже не совсем нормализованное.
Мне очень понравилось, что отдельные типы для точек и плоскостей реально содержат только по 3-4 переменных и код получается такой же эффективный без лишних элементов и вычислений. И система типов языка программирования начинает помогать, потому что теперь она чётко знает, что, например, при вращении плоскости кватернионом получится именно плоскость, а при вращении точки - снова точка.
Вдобавок, если для мультивекторов использовать sandwich произведения, то из-за погрешности вычислений некоторые элементы в результирующем мультивекторе могут оказаться ненулевыми, хотя математически там всё должно сократиться. И тут меня спасает то, что для кодогенерации я использовал символьные вычисления и всё это сокращается.
Из минусов - для N типов потребуется сгенерировать N^2 бинарных операций и примерно половина из них дают ненулевой результат. Вполне возможно что в итоговой программе большая часть операций не пригодится.
В целом я очень доволен, поверх геометрической алгебры написал физический движок и он работает!
Вот мини-демонстрация: https://www.youtube.com/watch?v=wqt0ylxBqnU и часть кода для сил, инерции, движения и т.п.: https://github.com/Kright/ScalaGameMath/tree/master/pga3dphysicsЕщё заметил, что вы довольно лихо используете экспоненту, а я с ней какое-то время мучился, выводя эффективное вычисление экспоненты и логарифма и аккуратно обходя всякие случаи типа деления на ноль. Сложность вывода сильно зависит от количества генераторов в алгебре. Вот, например, экспонента: https://github.com/Kright/ScalaGameMath/blob/master/pga3d/shared/src/main/scala/com/github/kright/pga3d/Pga3dBivector.scala#L228
P.S. с размерностью действительно есть нюансы, потому что если элемент описывает одновременно и вращение и перемещение, то в нём хранятся и расстояние с какой-то размерностью и углы (вернее, скорее синусы и косинусы), но суть в том что они безразмерные. Как это строго математически описать - не очень понятно.
P.P.S. В Вашей статье очень понравилась идея, почему e_a e_b = -e_b e_a. Обычно это постулируют, хотя оказалось что к этому можно прийти из логических рассуждений и желаемых свойств.
P.P.P.S. Ещё вы написали, что пространство CL(0, 3, 0) распадается на линейное пространство над двумя кватернионами, но не будет ли возможен совершенно аналогичный "распад" кватернионов на линейное пространство над двумя комплексными числами? Если это так, то логичнее с комплексных чисел начинать и для кватерниона просто будет частный случай более общего.
samsergey Автор
05.06.2025 09:58Спасибо, что поделились своими наработками! Отличная библиотека. Я, в конце-концов, пришёл к аналогу динамической типизации, которая позволяет единообразно описывать любую геометрическую алгебру. Но главного принципа: непредставимости некорректных данных мне добиться пока не удалось.
samsergey Автор
05.06.2025 09:58С трансцендентными функциями, действительно, много возни, особых случаев, разных подходов. Это оказалось целой темой исследований. В результате получилась комбинация спец случаев, аппроксимаций Паде, рядов Тэйлора и метода Ньютона :)
volaand
05.06.2025 09:58Двойственность это свойство языка, или объекта, который он описывает?
samsergey Автор
05.06.2025 09:58Философский вопрос.. Я бы сказал, что это свойство языка выражать двойственность, как отношение между объектами. Объект сам по себе не может быть двойственным.
Впрочем, возможно, я не понял вашего вопроса.
volaand
05.06.2025 09:58Например, на проективной плоскости,
точки и прямые - двойственные объекты. Это их врождённое свойство безотносительно языка(проективной геометрии), или свойство проективной геометрии как языка описания точек и прямых(в другом языке описания(например евклидовой геометрии), двойственности уже не будет)?
andy_p
05.06.2025 09:58Я видел несколько другое представление кватернионов - а именно как подалгебры Клиффорда в трёхмерном пространстве, где i,j,k - это суть бивекторы.
lgorSL
05.06.2025 09:58Для бивекторов место i, j, k = e_1, e_2, e_12 можно использовать i, j, k = e_12, e_13, e_23. В итоге правила умножения для i j k точно такие же и всё остальное тоже идентично.
wataru
Хабр - торт. Спасибо за статью!