biVector forum

Translating between the "Bivector" and "Lengyel" models of PGA

Loosely, there seem to be at least two different notations & jargons for describing geometric objects and operators in 3D PGA.

What I’m calling the “BiVector” model: the 2019 Siggraph course, alot of the discussion on, and the Klein library.

And the “Lengyel” model, as outlined at

As I understand it, mathematically, the two models are consistent. But there are alot of differences, both in the jargon used and also in the notation; egs Antivectors, e0 vs e4, “bulk norms”, “weight norms”, “ideal norms”, the way that Points and Planes are represented.

I’d like to develop an ability to mentally translate back and forth between the notational conventions, so as to reconcile the material in both places into one coherent system.

Does anyone have a cheat sheet for mapping between the terminology? or some pointers to how to build such a mapping…

You may or may not be looking for the hodge dual.

Assuredly, the Hodge dual lies at the heart of the differences between presentations.

What I find myself wanting is the expansion of the differences out to the various terms and operators that are mentioned, in places like the Siggraph PGA cheat sheet and Lengyel’s wiki.

To give a practical example of the sorts of questions/doubts in my mind: What Lengyel calls the Bulk Norm would be written as X in the Bivector model…? (solve for X ;P)

Meanwhile, the Siggraph materials talk about Ideal Norm, which doesnt get a mention in the Lengyel model. How does that map across?

Im actually tentatively working out the translation myself, which if nothing else is driving me to understand things better. If I reach something Im confident to share, I’ll post it here.

In Section 7.1 of the course notes, the “bivector” model defines the norm as

\Vert \mathbf x\Vert = \sqrt{|\mathbf x^2|},

where the squaring inside the radical is done with the geometric product. It defines the “ideal norm” (or “infinity norm”) in a case-by-case manner for points, lines, and pseudoscalars without providing a general formula or addressing planes, motors, and reflection operators, and it utterly fails to recognize the symmetry at work.

First, the norm as defined in the course notes isn’t quite correct. It should be

\Vert \mathbf x\Vert = \sqrt{\mathbf x\mathbf{\widetilde x}},

which gets rid of the embarrassing need for the absolute value.

In the “Lengyel” model, the “bulk norm” and “weight norm” are defined as

Bulk norm: \Vert\mathbf x\Vert_\bullet = \sqrt{\mathbf x \mathbin{\char"27D1} \mathbf{\widetilde x}}

Weight norm: \Vert\mathbf x\Vert_\circ = \sqrt{\mathbf x \mathbin{\char"27C7} \mathbf{\utilde x}\vphantom{\mathbf{\widetilde x}}} ,

where \char"27D1 is the geometric product, and \char"27C7 is the geometric antiproduct. For the objects in PGA that we care about, the bulk norm is a scalar, and the weight norm is an antiscalar (pseudoscalar).

The “ideal norm” is mathematically the same as the weight norm, but (incorrectly) dualized to be a scalar instead of an antiscalar. Unfortunately, it cannot be expressed quite as symmetrically because the “bivector” model lacks the antiproduct, but you could write

Ideal norm: \Vert\mathbf x\Vert_\infty = \sqrt{\mathbf x^*\widetilde{\mathbf x^*}} ,

where * is any dualization operator.

Note that because the “bivector” model describes geometries and isometry operators with empty dimensions instead of full dimensions, the meaning of the two norms is reversed. So the “bivector” norm gives you the magnitude of the weight of an object, and the ideal norm gives you the magnitude of its bulk. (Or to use the terminology suggested by the “bivector” crowd, the norm gives you the magnitude of the tangent space aspect of the object, and the ideal norm gives you the magnitude of its positional aspect.)

The projected magnitude or geometric norm of an object \mathbf x, which is the distance from the origin for something regarded as a geometry and half the distance the origin is moved for something regarded as an isometry operator, is given by the ratio of the norms. Using the notation m(\mathbf x) for the projected magnitude here to avoid conflicts with other notation, in the “bivector” model,

m(\mathbf x) = \dfrac{\Vert\mathbf x\Vert_\infty}{\Vert\mathbf x\Vert} = \dfrac{\sqrt{\mathbf x^*\widetilde{\mathbf x^*}}}{\sqrt{\mathbf x\mathbf{\widetilde x}}} ,

and in the “Lengyel” model,

m(\mathbf x) = \dfrac{\Vert\mathbf x\Vert_\bullet}{\Vert\mathbf x\Vert_\circ} = \dfrac{\sqrt{\mathbf x \mathbin{\char"27D1} \mathbf{\widetilde x}}}{\sqrt{\mathbf x \mathbin{\char"27C7} \mathbf{\utilde x}\vphantom{\mathbf{\widetilde x}}}} .

(Note: with the appropriate definitions of wedge and dot products involving scalars, all of the geometric products above can be replaced with dot products and antidot products.)

1 Like

Hi @elengyel
Thanks for the detailed comments regarding the ideal norm.
First, a quick feedback regarding the course notes. Since February, 2020, motivated partly by a discussion on this forum, the section in the course notes on the ideal norm has included a subsection entitled “Ideal norm via Poincare duality” which I include here:

Another neat way to compute the ideal norm is provided by Poincare duality. The discussion of Poincare duality above … took place at the level of the Grassmann algebra. It’s possible to consider this map to be between geometric algebras, in this case, J: P(\mathbb{R}^*_{2,0,1})\rightarrow P(\mathbb{R}_{2,0,1}). We leave it as an exercise for the reader to verify that for ideal \mathbf{x} \in P(\mathbb{R}^*_{2,0,1}), \| \mathbf{x} \|_\infty = \| J(\mathbf{x})\| (where by sleight-of-hand the scalar on the right-hand side is interpreted as a scalar in P(\mathbb{R}^*_{2,0,1})). That is, the ideal norm in the euclidean plane is the ordinary norm in the dual euclidean plane. Naturally the same holds for arbitrary dimension. Whether this \quot{trick} has a deeper meaning remains a subject of research.

(Perhaps you have an older copy? I’m constantly updating them as my views on the subject develop. Best place to remain updated is

Note that this section also addresses the issue of whether the ideal norm should be considered a pseudoscalar or a scalar in the original algebra and acknowledges the need for further research, exactly the sort which your post contains.

I have been planning for weeks to post a reply to the original message on this thread: I think it’s misleading to refer to a monolithic “bivector” model: there are some quite sharp differences among the views represented there. And if and when I get around to that, I’ll try to address the interesting points you make regarding the bulk and weight norms.

1 Like

Here is the easiest thing to do. Use Grassmann.jl to define @basis “1,1,1,0”. You don’t have to use the interger ordering from Lengyel’s sources. Simply use Grassmann.jl default ordering. Then define left complement, (the right one you already have, !), anti reverse, antiwedgedot, bulk and weight norm, etc. as simple functions (since you don’t have available binary operators as those symbols used by Lengyel. It would be nice if Julia people could add those to the language so that they could be typed naturally instead of making function calls. Then, generate desired operators in your favorite language as given in bivector tools. I used python files and replaced those definitions in R301 class. I am still preparing for this actually, while I’m working out everything in Julia and testing. I’m comparing with my R*(3,01) implementation from bivector where I built a lot of geometry on top of their class. They only have minimal stuff inside to get you started, but I added everything I could imagine. Now in R(3,0,1) everything works just as Lengyel said with his additional operators. Soon you get used to the antiwedgedot and bold and empty 1 while you already feel at home with points being vectors etc. You don’t have to flip that which always bothered me with R*(3,0,1). It did feel as upside down to me. I also derived a closed form for logarithm of general motors and exponential of bivectors directly in R(3,0,1) using new symbols and new operators. Lengyel has judicious picking of various elements for logarithm on his website which is unnecessary since a closed form formula for line from a motor exists. But everything works, getting a motor for 3 points staring position to 3 points final position, and then getting nth root to interpolate in between.

There was a long thread 2 years ago here between two approaches which are actually equivalent. So, it’s a matter of taste. But, in my opinion I feel at home in R(3,01) and don’t mind a new symbol antiwededot at all. Left and right complement are great because multiplying with “I” to get to dual space was never my favorite. I think Leo Dorst should include R(3,0,1) in his rewrite of chapter 11 in his book. Genie is out of the bottle and probably a lot of people would not want to have to flip vectors to represent planes.

1 Like

The link here is bad. The correct link is this