Geometric algebra: Difference between revisions
Content added Content deleted
Line 1,903: | Line 1,903: | ||
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]</pre> |
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]</pre> |
||
=={{header|Visual Basic .NET}}== |
|||
{{trans|C#}} |
|||
<lang vbnet>Option Strict On |
|||
Imports System.Text |
|||
Module Module1 |
|||
Structure Vector |
|||
Private ReadOnly dims() As Double |
|||
Public Sub New(da() As Double) |
|||
dims = da |
|||
End Sub |
|||
Public Shared Operator -(v As Vector) As Vector |
|||
Return v * -1.0 |
|||
End Operator |
|||
Public Shared Operator +(lhs As Vector, rhs As Vector) As Vector |
|||
Dim result(31) As Double |
|||
Array.Copy(lhs.dims, 0, result, 0, lhs.Length) |
|||
For i = 1 To result.Length |
|||
Dim i2 = i - 1 |
|||
result(i2) = lhs(i2) + rhs(i2) |
|||
Next |
|||
Return New Vector(result) |
|||
End Operator |
|||
Public Shared Operator *(lhs As Vector, rhs As Vector) As Vector |
|||
Dim result(31) As Double |
|||
For i = 1 To lhs.Length |
|||
Dim i2 = i - 1 |
|||
If lhs(i2) <> 0.0 Then |
|||
For j = 1 To lhs.Length |
|||
Dim j2 = j - 1 |
|||
If rhs(j2) <> 0.0 Then |
|||
Dim s = ReorderingSign(i2, j2) * lhs(i2) * rhs(j2) |
|||
Dim k = i2 Xor j2 |
|||
result(k) += s |
|||
End If |
|||
Next |
|||
End If |
|||
Next |
|||
Return New Vector(result) |
|||
End Operator |
|||
Public Shared Operator *(v As Vector, scale As Double) As Vector |
|||
Dim result = CType(v.dims.Clone, Double()) |
|||
For i = 1 To result.Length |
|||
Dim i2 = i - 1 |
|||
result(i2) *= scale |
|||
Next |
|||
Return New Vector(result) |
|||
End Operator |
|||
Default Public Property Index(key As Integer) As Double |
|||
Get |
|||
Return dims(key) |
|||
End Get |
|||
Set(value As Double) |
|||
dims(key) = value |
|||
End Set |
|||
End Property |
|||
Public ReadOnly Property Length As Integer |
|||
Get |
|||
Return dims.Length |
|||
End Get |
|||
End Property |
|||
Public Function Dot(rhs As Vector) As Vector |
|||
Return (Me * rhs + rhs * Me) * 0.5 |
|||
End Function |
|||
Private Shared Function BitCount(i As Integer) As Integer |
|||
i -= ((i >> 1) And &H55555555) |
|||
i = (i And &H33333333) + ((i >> 2) And &H33333333) |
|||
i = (i + (i >> 4)) And &HF0F0F0F |
|||
i += (i >> 8) |
|||
i += (i >> 16) |
|||
Return i And &H3F |
|||
End Function |
|||
Private Shared Function ReorderingSign(i As Integer, j As Integer) As Double |
|||
Dim k = i >> 1 |
|||
Dim sum = 0 |
|||
While k <> 0 |
|||
sum += BitCount(k And j) |
|||
k >>= 1 |
|||
End While |
|||
Return If((sum And 1) = 0, 1.0, -1.0) |
|||
End Function |
|||
Public Overrides Function ToString() As String |
|||
Dim it = dims.GetEnumerator |
|||
Dim sb As New StringBuilder("[") |
|||
If it.MoveNext() Then |
|||
sb.Append(it.Current) |
|||
End If |
|||
While it.MoveNext |
|||
sb.Append(", ") |
|||
sb.Append(it.Current) |
|||
End While |
|||
sb.Append("]") |
|||
Return sb.ToString |
|||
End Function |
|||
End Structure |
|||
Function DoubleArray(size As Integer) As Double() |
|||
Dim result(size - 1) As Double |
|||
For i = 1 To size |
|||
Dim i2 = i - 1 |
|||
result(i2) = 0.0 |
|||
Next |
|||
Return result |
|||
End Function |
|||
Function E(n As Integer) As Vector |
|||
If n > 4 Then |
|||
Throw New ArgumentException("n must be less than 5") |
|||
End If |
|||
Dim result As New Vector(DoubleArray(32)) |
|||
result(1 << n) = 1.0 |
|||
Return result |
|||
End Function |
|||
ReadOnly r As New Random() |
|||
Function RandomVector() As Vector |
|||
Dim result As New Vector(DoubleArray(32)) |
|||
For i = 1 To 5 |
|||
Dim i2 = i - 1 |
|||
Dim singleton() As Double = {r.NextDouble()} |
|||
result += New Vector(singleton) * E(i2) |
|||
Next |
|||
Return result |
|||
End Function |
|||
Function RandomMultiVector() As Vector |
|||
Dim result As New Vector(DoubleArray(32)) |
|||
For i = 1 To result.Length |
|||
Dim i2 = i - 1 |
|||
result(i2) = r.NextDouble() |
|||
Next |
|||
Return result |
|||
End Function |
|||
Sub Main() |
|||
For i = 1 To 5 |
|||
Dim i2 = i - 1 |
|||
For j = 1 To 5 |
|||
Dim j2 = j - 1 |
|||
If i2 < j2 Then |
|||
If E(i2).Dot(E(j2))(0) <> 0.0 Then |
|||
Console.Error.WriteLine("Unexpected non-null scalar product") |
|||
Return |
|||
End If |
|||
ElseIf i2 = j2 Then |
|||
If E(i2).Dot(E(j2))(0) = 0.0 Then |
|||
Console.Error.WriteLine("Unexpected null scalar product") |
|||
Return |
|||
End If |
|||
End If |
|||
Next |
|||
Next |
|||
Dim a = RandomMultiVector() |
|||
Dim b = RandomMultiVector() |
|||
Dim c = RandomMultiVector() |
|||
Dim x = RandomVector() |
|||
' (ab)c == a(bc) |
|||
Console.WriteLine((a * b) * c) |
|||
Console.WriteLine(a * (b * c)) |
|||
Console.WriteLine() |
|||
' a(b+c) == ab + ac |
|||
Console.WriteLine(a * (b + c)) |
|||
Console.WriteLine(a * b + a * c) |
|||
Console.WriteLine() |
|||
' (a+b)c == ac + bc |
|||
Console.WriteLine((a + b) * c) |
|||
Console.WriteLine(a * c + b * c) |
|||
Console.WriteLine() |
|||
' x^2 is real |
|||
Console.WriteLine(x * x) |
|||
End Sub |
|||
End Module</lang> |
|||
{{out}} |
|||
<pre>[0.574263754349833, -1.04033308353824, -0.776121961159351, 2.00792496222078, 3.16921091358851, 6.73557610270275, -13.4327886840529, -7.74195172209513, -7.21674283588092, -5.86045645950882, 2.22312083899981, 1.32215440847646, -6.14796858424355, -6.31067579900569, -8.24016821785677, -7.13138966213629, 1.70037903072841, -1.61670055512076, -1.53920826677554, 0.0830404550813257, 3.93618132588852, 7.40029585163889, -6.36594388310886, 2.14605789872596, -12.3353817163416, -9.51720072572794, 4.57164353732716, 3.11601890765627, -3.45821025466289, -4.2333151576991, -5.88080545860622, -6.53549242641427] |
|||
[0.574263754349836, -1.04033308353825, -0.776121961159348, 2.00792496222078, 3.16921091358851, 6.73557610270275, -13.4327886840529, -7.74195172209514, -7.21674283588092, -5.86045645950883, 2.2231208389998, 1.32215440847646, -6.14796858424355, -6.31067579900569, -8.24016821785676, -7.13138966213629, 1.70037903072841, -1.61670055512076, -1.53920826677554, 0.0830404550813244, 3.93618132588852, 7.40029585163889, -6.36594388310886, 2.14605789872596, -12.3353817163416, -9.51720072572794, 4.57164353732716, 3.11601890765627, -3.4582102546629, -4.2333151576991, -5.88080545860622, -6.53549242641427] |
|||
[-4.47297646716049, -5.51675159908628, -2.0422292306007, -2.10280367601528, 4.45365145957714, 3.36803601730516, -1.14571129439412, -0.425208328771765, 1.55145295736126, 1.59542278752789, 5.96209903766593, 3.43000773717995, -1.93701906000176, -0.282031417434974, 2.27435916727966, 5.57909608271093, -4.5313823118833, -5.23492105300004, -1.61573387363407, -2.77225954890565, 2.7749883436186, 2.47317184825279, -1.66854919690689, -1.04001004327011, 0.314038463700274, 0.354414497531512, 6.65882395905864, 4.84274526210668, -1.26994943017024, 0.867830239054973, 5.4316876690133, 8.85070336472853] |
|||
[-4.47297646716048, -5.51675159908628, -2.0422292306007, -2.10280367601528, 4.45365145957714, 3.36803601730516, -1.14571129439412, -0.425208328771764, 1.55145295736126, 1.59542278752789, 5.96209903766592, 3.43000773717995, -1.93701906000176, -0.282031417434974, 2.27435916727966, 5.57909608271093, -4.5313823118833, -5.23492105300004, -1.61573387363407, -2.77225954890565, 2.7749883436186, 2.47317184825279, -1.66854919690689, -1.04001004327011, 0.314038463700274, 0.354414497531512, 6.65882395905864, 4.84274526210668, -1.26994943017024, 0.867830239054973, 5.4316876690133, 8.85070336472853] |
|||
[-5.22293180574195, -5.83486719133951, -1.69911127655253, -0.239172378976677, 2.88101068267363, 3.97970294192276, -3.56156896393757, -2.61790431554284, -0.736020241689734, -0.776473740587332, 3.0171422268862, 2.15992705303214, -3.20043960767084, -0.644050812810021, 0.714338263909879, 1.74591314489993, -4.38202839888319, -3.26051280533051, -4.05531615492948, -2.93703039040279, 3.56583825504966, 4.17636250632614, -1.11524349520128, -3.21090579244331, 1.27680857237575, 2.37418947249269, 4.48848909104827, 3.7920821695994, -3.71929857788004, 0.286175312382222, 6.0485010014393, 8.27326094456212] |
|||
[-5.22293180574195, -5.83486719133951, -1.69911127655253, -0.239172378976677, 2.88101068267363, 3.97970294192276, -3.56156896393757, -2.61790431554284, -0.736020241689734, -0.776473740587333, 3.0171422268862, 2.15992705303214, -3.20043960767084, -0.644050812810022, 0.71433826390988, 1.74591314489993, -4.38202839888319, -3.2605128053305, -4.05531615492948, -2.93703039040279, 3.56583825504966, 4.17636250632614, -1.11524349520128, -3.21090579244331, 1.27680857237575, 2.37418947249269, 4.48848909104827, 3.7920821695994, -3.71929857788004, 0.286175312382223, 6.0485010014393, 8.27326094456212] |
|||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</pre> |