Geometric algebra: Difference between revisions
Content deleted Content added
Line 232: | Line 232: | ||
[-7.29133, -8.2555, 0.985588, -1.48171, 2.4995, 4.5152, -1.1938, -2.29702, -2.34025, -2.16526, 10.2208, 7.0629, 0.552639, -0.437582, 7.18962, 2.63274, -3.25348, -4.07006, -0.883786, -3.09677, 1.1018, 2.91198, -0.0095405, 0.0123323, -2.69156, -1.30815, 3.36179, 3.26852, 3.09518, -0.166247, 6.74016, 3.20827] |
[-7.29133, -8.2555, 0.985588, -1.48171, 2.4995, 4.5152, -1.1938, -2.29702, -2.34025, -2.16526, 10.2208, 7.0629, 0.552639, -0.437582, 7.18962, 2.63274, -3.25348, -4.07006, -0.883786, -3.09677, 1.1018, 2.91198, -0.0095405, 0.0123323, -2.69156, -1.30815, 3.36179, 3.26852, 3.09518, -0.166247, 6.74016, 3.20827] |
||
[-7.29133, -8.2555, 0.985588, -1.48171, 2.4995, 4.5152, -1.1938, -2.29702, -2.34025, -2.16526, 10.2208, 7.0629, 0.552639, -0.437582, 7.18962, 2.63274, -3.25348, -4.07006, -0.883786, -3.09677, 1.1018, 2.91198, -0.0095405, 0.0123323, -2.69156, -1.30815, 3.36179, 3.26852, 3.09518, -0.166247, 6.74016, 3.20827] |
[-7.29133, -8.2555, 0.985588, -1.48171, 2.4995, 4.5152, -1.1938, -2.29702, -2.34025, -2.16526, 10.2208, 7.0629, 0.552639, -0.437582, 7.18962, 2.63274, -3.25348, -4.07006, -0.883786, -3.09677, 1.1018, 2.91198, -0.0095405, 0.0123323, -2.69156, -1.30815, 3.36179, 3.26852, 3.09518, -0.166247, 6.74016, 3.20827] |
||
[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|C#|C sharp}}== |
|||
{{trans|D}} |
|||
<lang csharp>using System; |
|||
using System.Text; |
|||
namespace GeometricAlgebra { |
|||
struct Vector { |
|||
private readonly double[] dims; |
|||
public Vector(double[] da) { |
|||
dims = da; |
|||
} |
|||
public static Vector operator -(Vector v) { |
|||
return v * -1.0; |
|||
} |
|||
public static Vector operator +(Vector lhs, Vector rhs) { |
|||
var result = new double[32]; |
|||
Array.Copy(lhs.dims, 0, result, 0, lhs.Length); |
|||
for (int i = 0; i < result.Length; i++) { |
|||
result[i] = lhs[i] + rhs[i]; |
|||
} |
|||
return new Vector(result); |
|||
} |
|||
public static Vector operator *(Vector lhs, Vector rhs) { |
|||
var result = new double[32]; |
|||
for (int i = 0; i < lhs.Length; i++) { |
|||
if (lhs[i] != 0.0) { |
|||
for (int j = 0; j < lhs.Length; j++) { |
|||
if (rhs[j] != 0.0) { |
|||
var s = ReorderingSign(i, j) * lhs[i] * rhs[j]; |
|||
var k = i ^ j; |
|||
result[k] += s;//there is an index out of bounds here |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return new Vector(result); |
|||
} |
|||
public static Vector operator *(Vector v, double scale) { |
|||
var result = (double[])v.dims.Clone(); |
|||
for (int i = 0; i < result.Length; i++) { |
|||
result[i] *= scale; |
|||
} |
|||
return new Vector(result); |
|||
} |
|||
public double this[int key] { |
|||
get { |
|||
return dims[key]; |
|||
} |
|||
set { |
|||
dims[key] = value; |
|||
} |
|||
} |
|||
public int Length { |
|||
get { |
|||
return dims.Length; |
|||
} |
|||
} |
|||
public Vector Dot(Vector rhs) { |
|||
return (this * rhs + rhs * this) * 0.5; |
|||
} |
|||
private static int BitCount(int i) { |
|||
i -= ((i >> 1) & 0x55555555); |
|||
i = (i & 0x33333333) + ((i >> 2) & 0x33333333); |
|||
i = (i + (i >> 4)) & 0x0F0F0F0F; |
|||
i += (i >> 8); |
|||
i += (i >> 16); |
|||
return i & 0x0000003F; |
|||
} |
|||
private static double ReorderingSign(int i, int j) { |
|||
int k = i >> 1; |
|||
int sum = 0; |
|||
while (k != 0) { |
|||
sum += BitCount(k & j); |
|||
k >>= 1; |
|||
} |
|||
return ((sum & 1) == 0) ? 1.0 : -1.0; |
|||
} |
|||
public override string ToString() { |
|||
var it = dims.GetEnumerator(); |
|||
StringBuilder sb = new StringBuilder("["); |
|||
if (it.MoveNext()) { |
|||
sb.Append(it.Current); |
|||
} |
|||
while (it.MoveNext()) { |
|||
sb.Append(", "); |
|||
sb.Append(it.Current); |
|||
} |
|||
sb.Append(']'); |
|||
return sb.ToString(); |
|||
} |
|||
} |
|||
class Program { |
|||
static double[] DoubleArray(uint size) { |
|||
double[] result = new double[size]; |
|||
for (int i = 0; i < size; i++) { |
|||
result[i] = 0.0; |
|||
} |
|||
return result; |
|||
} |
|||
static Vector E(int n) { |
|||
if (n > 4) { |
|||
throw new ArgumentException("n must be less than 5"); |
|||
} |
|||
var result = new Vector(DoubleArray(32)); |
|||
result[1 << n] = 1.0; |
|||
return result; |
|||
} |
|||
static readonly Random r = new Random(); |
|||
static Vector RandomVector() { |
|||
var result = new Vector(DoubleArray(32)); |
|||
for (int i = 0; i < 5; i++) { |
|||
var singleton = new double[] { r.NextDouble() }; |
|||
result += new Vector(singleton) * E(i); |
|||
} |
|||
return result; |
|||
} |
|||
static Vector RandomMultiVector() { |
|||
var result = new Vector(DoubleArray(32)); |
|||
for (int i = 0; i < result.Length; i++) { |
|||
result[i] = r.NextDouble(); |
|||
} |
|||
return result; |
|||
} |
|||
static void Main() { |
|||
for (int i = 0; i < 5; i++) { |
|||
for (int j = 0; j < 5; j++) { |
|||
if (i < j) { |
|||
if (E(i).Dot(E(j))[0] != 0.0) { |
|||
Console.WriteLine("Unexpected non-null sclar product."); |
|||
return; |
|||
} |
|||
} else if (i == j) { |
|||
if ((E(i).Dot(E(j)))[0] == 0.0) { |
|||
Console.WriteLine("Unexpected null sclar product."); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
var a = RandomMultiVector(); |
|||
var b = RandomMultiVector(); |
|||
var c = RandomMultiVector(); |
|||
var 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); |
|||
} |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre>[-2.7059639813936, -2.65443237395364, -1.03355975191747, 5.431067101183, 9.57183741787636, 7.41390675997241, -8.09043009371666, -7.30180304927878, -1.50642825479215, -4.14594595273162, -1.78857280373918, -0.484382016930444, -7.42401696794793, -4.78491995868705, -8.43252648860165, -4.47485336471182, -2.3458119817208, 3.6184495826099, -7.50802924695147, -2.10106278080463, 7.15782745037037, 7.60049996423655, -10.6945339837475, -6.9874232887485, -4.85603010723139, -9.8225346377117, 3.50534384939214, 3.08239272713895, -9.92019737517891, -10.1065306142574, -8.79795495448311, -4.01442257971653] |
|||
[-2.70596398139361, -2.65443237395364, -1.03355975191747, 5.43106710118299, 9.57183741787636, 7.41390675997241, -8.09043009371666, -7.30180304927878, -1.50642825479215, -4.14594595273162, -1.78857280373917, -0.484382016930444, -7.42401696794793, -4.78491995868705, -8.43252648860165, -4.47485336471182, -2.3458119817208, 3.6184495826099, -7.50802924695147, -2.10106278080463, 7.15782745037036, 7.60049996423655, -10.6945339837475, -6.9874232887485, -4.85603010723139, -9.8225346377117, 3.50534384939214, 3.08239272713894, -9.9201973751789, -10.1065306142574, -8.79795495448311, -4.01442257971653] |
|||
[-5.35792362178344, -2.83992055857095, -0.00435065203934659, 0.548701864561436, 7.31905167177133, 2.98280880755406, 2.54042778638867, -1.82513292511705, -4.07944497473881, -3.87206774796269, 2.05320674506366, 1.00599045579458, -3.72912260067605, -3.4226426940923, 1.62806109332525, 3.26554642532303, -2.2232872618717, -2.06401927877361, 3.31046340349916, 3.21397515180161, 4.84963949791875, 1.98923326842668, 2.28775873178049, -0.927084258496161, -3.99100687576943, -1.67065148926557, 2.70438629346319, 0.400654313359669, -0.74522009023782, 0.737528754412463, 4.53246775536051, 5.82111882775243] |
|||
[-5.35792362178344, -2.83992055857095, -0.0043506520393467, 0.548701864561437, 7.31905167177133, 2.98280880755406, 2.54042778638867, -1.82513292511705, -4.0794449747388, -3.87206774796269, 2.05320674506366, 1.00599045579458, -3.72912260067605, -3.4226426940923, 1.62806109332525, 3.26554642532303, -2.2232872618717, -2.06401927877361, 3.31046340349916, 3.21397515180161, 4.84963949791875, 1.98923326842668, 2.28775873178049, -0.92708425849616, -3.99100687576943, -1.67065148926557, 2.70438629346319, 0.40065431335967, -0.745220090237821, 0.737528754412463, 4.53246775536051, 5.82111882775243] |
|||
[-6.85152530876464, -2.6466613868296, -0.814269203555543, -2.63807771948643, 6.89540453623166, 4.70804372948965, 2.78512631505336, 2.03877626337364, -1.77047482836463, 1.52836763170898, 0.71565745873906, 0.886707645932111, -2.25661460785133, -1.08891196061849, 3.44949857952115, 5.8645384965889, -3.09249704978979, -1.41518183096078, 1.87603297737169, 2.45042504250642, 3.66908389117503, 1.85358883025892, 1.23206155683761, -0.216105143607701, -1.88866851071821, -0.131570581491294, 5.7355274883507, 4.22029797577044, -0.212906215521922, -0.323884694190184, 4.41630150883192, 5.94513377054442] |
|||
[-6.85152530876464, -2.6466613868296, -0.814269203555542, -2.63807771948643, 6.89540453623166, 4.70804372948965, 2.78512631505335, 2.03877626337364, -1.77047482836463, 1.52836763170898, 0.715657458739061, 0.886707645932111, -2.25661460785133, -1.08891196061849, 3.44949857952115, 5.8645384965889, -3.09249704978979, -1.41518183096078, 1.87603297737169, 2.45042504250642, 3.66908389117503, 1.85358883025892, 1.23206155683761, -0.216105143607701, -1.88866851071821, -0.131570581491294, 5.7355274883507, 4.22029797577044, -0.212906215521922, -0.323884694190183, 4.41630150883192, 5.94513377054442] |
|||
[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]</pre> |