Geometric algebra: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
(Added Wren) |
||
Line 2,282: | Line 2,282: | ||
[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> |
||
=={{header|Wren}}== |
|||
{{trans|Kotlin}} |
|||
<lang ecmascript>import "random" for Random |
|||
var bitCount = Fn.new { |i| |
|||
i = i - ((i >> 1) & 0x55555555) |
|||
i = (i & 0x33333333) + ((i >> 2) & 0x33333333) |
|||
i = (i + (i >> 4)) & 0x0f0f0f0f |
|||
i = i + (i >> 8) |
|||
i = i + (i >> 16) |
|||
return i & 0x0000003F |
|||
} |
|||
var ReorderingSign = Fn.new { |i, j| |
|||
var k = i >> 1 |
|||
var sum = 0 |
|||
while (k != 0) { |
|||
sum = sum + bitCount.call(k & j) |
|||
k = k >> 1 |
|||
} |
|||
return (sum & 1 == 0) ? 1 : -1 |
|||
} |
|||
class Vector { |
|||
construct new(dims) { |
|||
_dims = dims |
|||
} |
|||
dims { _dims } |
|||
dot(rhs) { (this * rhs + rhs * this) * 0.5 } |
|||
- { this * -1 } |
|||
+(rhs) { |
|||
var result = List.filled(32, 0) |
|||
for (i in 0..._dims.count) result[i] = _dims[i] |
|||
for (i in 0...rhs.dims.count) result[i] = result[i] + rhs[i] |
|||
return Vector.new(result) |
|||
} |
|||
*(rhs) { |
|||
if (rhs is Vector) { |
|||
var result = List.filled(32, 0) |
|||
for (i in 0..._dims.count) { |
|||
if (_dims[i] != 0) { |
|||
for (j in 0...rhs.dims.count) { |
|||
if (rhs[j] != 0) { |
|||
var s = ReorderingSign.call(i, j) * _dims[i] * rhs[j] |
|||
var k = i ^ j |
|||
result[k] = result[k] + s |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return Vector.new(result) |
|||
} else if (rhs is Num) { |
|||
var result = _dims.toList |
|||
for (i in 0..4) dims[i] = dims[i] * rhs |
|||
return Vector.new(result) |
|||
} else { |
|||
Fiber.abort("rhs must either be a Vector or a number") |
|||
} |
|||
} |
|||
[index] { _dims[index] } |
|||
[index]=(value) { _dims[index] = value } |
|||
toString { "(" + _dims.join(", ") + ")" } |
|||
} |
|||
var e = Fn.new { |n| |
|||
if (n > 4) Fiber.abort("n must be less than 5") |
|||
var result = Vector.new(List.filled(32, 0)) |
|||
result[1 << n] = 1 |
|||
return result |
|||
} |
|||
var rand = Random.new() |
|||
var randomVector = Fn.new { |
|||
var result = Vector.new(List.filled(32, 0)) |
|||
for (i in 0..4) { |
|||
result = result + Vector.new([rand.float()]) * e.call(i) |
|||
} |
|||
return result |
|||
} |
|||
var randomMultiVector = Fn.new { |
|||
var result = Vector.new(List.filled(32, 0)) |
|||
for (i in 0..31) result[i] = rand.float() |
|||
return result |
|||
} |
|||
for (i in 0..4) { |
|||
for (j in 0..4) { |
|||
if (i < j) { |
|||
if (e.call(i).dot(e.call(j))[0] != 0) { |
|||
System.print("Unexpected non-null scalar product.") |
|||
return |
|||
} else if (i == j) { |
|||
if (e.call(i).dot(e.call(j))[0] == 0) { |
|||
System.print("Unexpected null scalar product.") |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
var a = randomMultiVector.call() |
|||
var b = randomMultiVector.call() |
|||
var c = randomMultiVector.call() |
|||
var x = randomVector.call() |
|||
// (ab)c == a(bc) |
|||
System.print((a * b) * c) |
|||
System.print(a * (b * c)) |
|||
System.print() |
|||
// a(b+c) == ab + ac |
|||
System.print(a * (b + c)) |
|||
System.print(a * b + a * c) |
|||
System.print() |
|||
// (a+b)c == ac + bc |
|||
System.print((a + b) * c) |
|||
System.print(a * c + b * c) |
|||
System.print() |
|||
// x^2 is real |
|||
System.print(x * x)</lang> |
|||
{{out}} |
|||
<pre> |
|||
(-6.1279343499972, -12.172471890613, -0.43596654360835, -9.4733600789769, 7.7468131011607, -1.0197449680744, -8.3386053167094, -4.514411938465, -0.85417113341489, 5.814264590591, 4.7534441812565, 3.6983892972325, -1.9487633151975, 1.0081516771802, 3.793528331478, -0.71739309800609, -5.0930834896765, -10.389798935116, -0.21991874396827, -9.2747185990727, 2.4902263109011, -1.217404792573, -7.5648404539069, -5.1713187775853, -4.9297458419615, -2.5365579590808, 5.6741886500532, -5.3820954955896, 0.84309276379896, -0.83865672543758, -6.6627947524069, -6.5068089919902) |
|||
(-6.1279343499972, -12.172471890613, -0.43596654360835, -9.4733600789769, 7.7468131011607, -1.0197449680744, -8.3386053167094, -4.514411938465, -0.85417113341489, 5.814264590591, 4.7534441812565, 3.6983892972325, -1.9487633151975, 1.0081516771802, 3.793528331478, -0.71739309800609, -5.0930834896765, -10.389798935116, -0.21991874396827, -9.2747185990727, 2.4902263109011, -1.217404792573, -7.5648404539069, -5.1713187775853, -4.9297458419615, -2.5365579590808, 5.6741886500532, -5.3820954955896, 0.84309276379896, -0.83865672543757, -6.6627947524069, -6.5068089919902) |
|||
(-4.5670205884692, -5.406285276749, 0.20435321499717, -4.7297569961965, 3.1536400277791, 4.3228858614581, -2.648422809333, -1.1833380429978, -1.7564258015137, 3.3290322042955, 4.1877600392827, 5.7622202559563, -2.6969120760046, 1.6040264499734, 1.7140507294369, 3.3982272822008, -2.7897066050195, -2.800819409065, 2.2770258183891, -1.3567979021271, 2.4379457462826, 4.9315720878673, -1.8523904994524, 0.57286280886659, 0.78942446076958, 3.2321401010964, 2.7052700803603, 4.1875465627791, -1.9573353620592, 3.042768958901, 0.55331226143665, 3.4813647018728) |
|||
(-4.5670205884692, -5.406285276749, 0.20435321499716, -4.7297569961965, 3.1536400277791, 4.3228858614581, -2.648422809333, -1.1833380429978, -1.7564258015137, 3.3290322042955, 4.1877600392827, 5.7622202559563, -2.6969120760046, 1.6040264499734, 1.7140507294369, 3.3982272822008, -2.7897066050195, -2.800819409065, 2.2770258183891, -1.3567979021271, 2.4379457462826, 4.9315720878673, -1.8523904994524, 0.57286280886659, 0.78942446076958, 3.2321401010964, 2.7052700803603, 4.1875465627791, -1.9573353620592, 3.042768958901, 0.55331226143665, 3.4813647018728) |
|||
(-6.4947965411446, -7.5334457985612, -0.48336700984287, -2.6235798111818, 3.6406622303652, 3.6398682775911, -1.8835092927705, -4.0165723310492, 1.6332945757193, 5.2056992102457, 4.202039318349, 7.3784879794787, -2.4843920053947, -0.47893361628939, 1.1220802570638, 2.693375877108, -1.278951846965, -2.5982492127516, 0.85382005828955, -0.077629574978695, 5.211354827205, 6.5199779982554, 0.85742615796087, -0.062281151554669, -1.4540738133743, 1.6710486134883, 3.8433969630048, 6.4484021393956, 2.8236029776283, 2.9302728085944, 1.3066828942527, 3.7490534064109) |
|||
(-6.4947965411446, -7.5334457985612, -0.48336700984287, -2.6235798111818, 3.6406622303652, 3.6398682775912, -1.8835092927705, -4.0165723310492, 1.6332945757193, 5.2056992102457, 4.202039318349, 7.3784879794787, -2.4843920053947, -0.47893361628939, 1.1220802570638, 2.693375877108, -1.278951846965, -2.5982492127516, 0.85382005828955, -0.077629574978696, 5.211354827205, 6.5199779982554, 0.85742615796087, -0.062281151554668, -1.4540738133743, 1.6710486134883, 3.8433969630048, 6.4484021393956, 2.8236029776283, 2.9302728085944, 1.3066828942527, 3.7490534064109) |
|||
(0.96552083436649, 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> |