It seems that there is historically a great deal of confusion around this topic. In my opinion, this controversy can be resolved by relying on the differential geometric algebra formalism from my paper combined with the definitions of conformal geometric algebra. As stated in my post above, the definition is `⋆ω == (~ω)*I`

,

As I have mentioned many times before, the right-handed complement is the one and only true complement which I use, since it works in all forms of geometric algebra and co/homology theory. To properly do homology and cohomology with the correct orientation, I found that only the right complement works .

To address the situation when a degenerate basis is involved, it is also as I have stated before:

Essentially, I consider 3 types of degeneracy (basis elements squaring to zero):

- regular Grassmann basis element with metric set to zero
- null-basis element derived as sum of a positive and negative non-degenerate metric
- symmetric Leibniz basis element with 1st order differentiability

In the first kind, we are talking about a traditional Grassmann basis \langle v_1,v_2,v_3,v_4\rangle with also a degenerate bilinear metric defined on it, e.g. `D"1,1,1,0"`

in the DirectSum.jl formalism. This would naturally behave as

```
julia> @basis D"1,1,1,0"
(⟨1,1,1,0⟩, v, v₁, v₂, v₃, v₄, v₁₂, v₁₃, v₁₄, v₂₃, v₂₄, v₃₄, v₁₂₃, v₁₂₄, v₁₃₄, v₂₃₄, v₁₂₃₄)
julia> v1^2, v2^2, v3^2, v4^2
(1v, 1v, 1v, 0v)
julia> V(I) # pseudoscalar
v₁₂₃₄
julia> ⋆v1, ⋆v2, ⋆v3, ⋆v4
(1v₂₃₄, -1v₁₃₄, 1v₁₂₄, 0v₁₂₃)
```

It’s clear that with an actually degenerate metric, the geometric product and complement will also be degenerate when that index is involved. That is naturally to be expected with a degenerate metric.

Now let’s suppose we are talking about a space with the null-basis, e.g. `S"∞∅++"`

which is isomorphic to a space with non-degenerate metric `S"+-++"`

. However, the null-basis are a sum of the positive and negative metric elements. Therefore, the null-basis behaves differently under complement,

```
julia> @basis S"∞∅++"
(⟨∞∅++⟩, v, v∞, v∅, v₁, v₂, v∞∅, v∞₁, v∞₂, v∅₁, v∅₂, v₁₂, v∞∅₁, v∞∅₂, v∞₁₂, v∅₁₂, v∞∅₁₂)
julia> v∞^2, v∅^2, v1^2, v2^2
(0v, 0v, v, v)
julia> V(I) # pseudoscalar
1v∞∅₁₂
julia> ⋆v∞, ⋆v∅, ⋆v1, ⋆v2
(v∞₁₂, -1v∅₁₂, v∞∅₂, -1v∞∅₁)
julia> ⋆v∞∅
-1v₁₂
```

In this case it is as if the index of the null-basis element is ignored.

Last but not least, there is the first order `tangent(V)`

space, which shares certain aspects of the first two.

For example, `tangent(ℝ^3)`

has an additional element `∂1`

which is degenerate, but behaves more like a scalar (and thus is similar to the null-basis; however, the similarity is due to it being a symmetric Leibniz derivation as opposed to an anti-symmetric Grassmann tensor or composite null-basis element).

```
julia> @basis tangent(ℝ^3)
(⟨+++₁⟩, v, v₁, v₂, v₃, ∂₁, v₁₂, v₁₃, ∂₁v₁, v₂₃, ∂₁v₂, ∂₁v₃, v₁₂₃, ∂₁v₁₂, ∂₁v₁₃, ∂₁v₂₃, ∂₁v₁₂₃)
julia> v1^2, v2^2, v3^2, ∂1^2
(v, v, v, 0v)
julia> V(I) # pseudoscalar
1v₁₂₃
julia> ⋆v1, ⋆v2, ⋆v3, ⋆∂1
(v₂₃, -1v₁₃, v₁₂, ∂₁v₁₂₃)
```

The most important aspect of the symmetric Leibniz derivations is that they do NOT make the complement degenerate unlike an anti-symmetric basis with degenerate metric, while still squaring to zero.

In other words, if a regular anti-symmetric basis with degenerate metric is used, then the definition of complement will also involve degeneracy due to the metric of the pseudoscalar. If a null-basis is used, then the pseudoscalar metric is not actually degenerate, although the composite null-basis squares to zero. Finally, with a symmetric Leibniz derivation, the pseudoscalar does not actually include the symmetric basis element in its psuedoscalar, since the psuedoscalar is the highest grade Grassmann element by definition. Therefore, the metric of the psueodscalar is always non-degenerate.

As you can see, the complement will in fact be degenerate if a degenerate metric is actually used. Ways to avoid a degenerate complement would be to either use a null-basis (based on non-degenerate metric) or to use what I call the symmetric Leibniz derivation basis (which does not add to the pseudoscalar grade).

The newly released `v0.3.1`

of Grassmann.jl supports all of the 3 types of degeneracy I mentioned here. This is the first computer algebra software I know of which properly disambiguates between all 3 of these types of degeneracy. Thanks to the formalism in my paper, the foundations are also consistent.