1   /*
2    * Created on Feb 21, 2004
3    * 
4    * To change the template for this generated file go to Window - Preferences -
5    * Java - Code Generation - Code and Comments
6    */
7   package net.sourceforge.kamiwaai.geometricalgebra;
8   
9   import junit.framework.TestCase;
10  
11  /***
12   * @author Ginanjar Utama
13   * 
14   * To change the template for this generated type comment go to Window -
15   * Preferences - Java - Code Generation - Code and Comments
16   */
17  public class MultiVectorTest extends TestCase {
18  	ComplexNumber c1 = new ComplexNumber(1.0, 2.0);
19  	ComplexNumber c2 = new ComplexNumber(3.0, 4.0);
20  	ComplexNumber c3 = new ComplexNumber(5.0, 6.0);
21  	ComplexNumber c4 = new ComplexNumber(7.0, 8.0);
22  	ComplexNumber[] c1234 = { c1, c2, c3, c4 };
23  	ComplexNumber[] c2341 = { c2, c3, c4, c1 };
24  	ComplexNumber[] c3412 = { c3, c4, c1, c2 };
25  	ComplexNumber[] c4123 = { c4, c1, c2, c3 };
26  	ComplexQuat cq1 = new ComplexQuat(c1234);
27  	ComplexQuat cq2 = new ComplexQuat(c2341);
28  	ComplexQuat cq3 = new ComplexQuat(c3412);
29  	ComplexQuat cq4 = new ComplexQuat(c4123);
30  	ComplexQuat[] cq1234 = { cq1, cq2, cq3, cq4 };
31  	ComplexQuat[] cq2341 = { cq2, cq3, cq4, cq1 };
32  	MultiVector mv1 = new MultiVector(cq1234);
33  	MultiVector mv2 = new MultiVector(cq2341);
34  
35  	public void testAddMultiVector() {
36  		ComplexQuat[] cq12341 =
37  			{ cq1.add(cq2), cq2.add(cq3), cq3.add(cq4), cq4.add(cq1)};
38  		MultiVector mv3 = new MultiVector(cq12341);
39  		assertEquals(mv3, mv1.add(mv2));
40  		assertFalse(mv1.equals(mv1.add(mv2)));
41  	}
42  	public void testSubMultiVector() {
43  		ComplexQuat[] cq12341 =
44  			{ cq1.sub(cq2), cq2.sub(cq3), cq3.sub(cq4), cq4.sub(cq1)};
45  		MultiVector mv3 = new MultiVector(cq12341);
46  		assertEquals(mv3, mv1.sub(mv2));
47  		assertFalse(mv1.equals(mv1.sub(mv2)));
48  	}
49  	public void testMultiplyMultiVector() {
50  		ComplexNumber c12 = new ComplexNumber(16.0, -128.0);
51  		ComplexNumber c23 = new ComplexNumber(0.0, 16.0);
52  		ComplexNumber c34 = new ComplexNumber(16.0, -160.0);
53  		ComplexNumber c41 = new ComplexNumber(0.0, 80.0);
54  		ComplexNumber[] c12341 = { c12, c23, c34, c41 };
55  		ComplexQuat cq12341 = new ComplexQuat(c12341);
56  
57  		ComplexNumber c45 = new ComplexNumber(60.0, -400.0);
58  		ComplexNumber c56 = new ComplexNumber(-20.0, -56.0);
59  		ComplexNumber c67 = new ComplexNumber(-44.0, 224.0);
60  		ComplexNumber c74 = new ComplexNumber(-20.0, 72.0);
61  		ComplexNumber[] c45675 = { c45, c56, c67, c74 };
62  		ComplexQuat cq45675 = new ComplexQuat(c45675);
63  
64  		ComplexNumber c78 = new ComplexNumber(20.0, -56.0);
65  		ComplexNumber c89 = new ComplexNumber(-44.0, 176.0);
66  		ComplexNumber c90 = new ComplexNumber(-36.0, 136.0);
67  		ComplexNumber c07 = new ComplexNumber(-44.0, 208.0);
68  		ComplexNumber[] c78907 = { c78, c89, c90, c07 };
69  		ComplexQuat cq78907 = new ComplexQuat(c78907);
70  
71  		ComplexNumber c01 = new ComplexNumber(44.0, -176.0);
72  		ComplexNumber c02 = new ComplexNumber(-20.0, 40.0);
73  		ComplexNumber c03 = new ComplexNumber(-44.0, 272.0);
74  		ComplexNumber c04 = new ComplexNumber(-36.0, 88.0);
75  		ComplexNumber[] c01234 = { c01, c02, c03, c04 };
76  		ComplexQuat cq01235 = new ComplexQuat(c01234);
77  
78  		ComplexQuat[] cqarray = { cq12341, cq45675, cq78907, cq01235 };
79  
80  		MultiVector mv3 = new MultiVector(cqarray);
81  		assertEquals(mv3, mv1.mult(mv2));
82  		assertFalse(mv1.equals(mv1.mult(mv2)));
83  	}
84  	public void testGetGrade0() {
85  		ComplexNumber c12 = new ComplexNumber(1.0, 0.0);
86  		ComplexNumber[] c0 =
87  			{ c12, ComplexNumber.ZERO, ComplexNumber.ZERO, ComplexNumber.ZERO };
88  		ComplexQuat cq0 = new ComplexQuat(c0);
89  		ComplexQuat[] cq0123 =
90  			{ cq0, ComplexQuat.ZERO, ComplexQuat.ZERO, ComplexQuat.ZERO };
91  		MultiVector grade0 = new MultiVector(cq0123);
92  		assertEquals(grade0, mv1.getGrade0());
93  		assertFalse(mv1 == mv1.getGrade0());
94  	}
95  	public void testGetGrade1() {
96  		ComplexNumber grade1n0 = new ComplexNumber(3.0, 0.0);
97  		ComplexNumber[] grade1n =
98  			{
99  				grade1n0,
100 				ComplexNumber.ZERO,
101 				ComplexNumber.ZERO,
102 				ComplexNumber.ZERO };
103 		ComplexQuat cqGrade1n = new ComplexQuat(grade1n);
104 
105 		ComplexNumber grade1nb0 = new ComplexNumber(5.0, 0.0);
106 		ComplexNumber[] grade1nb =
107 			{
108 				grade1nb0,
109 				ComplexNumber.ZERO,
110 				ComplexNumber.ZERO,
111 				ComplexNumber.ZERO };
112 		ComplexQuat cqGrade1nb = new ComplexQuat(grade1nb);
113 
114 		ComplexNumber grade1nnb1 = new ComplexNumber(0.0, 2.0);
115 		ComplexNumber grade1nnb2 = new ComplexNumber(0.0, 4.0);
116 		ComplexNumber grade1nnb3 = new ComplexNumber(0.0, 6.0);
117 		ComplexNumber[] grade1nnb =
118 			{ ComplexNumber.ZERO, grade1nnb1, grade1nnb2, grade1nnb3 };
119 		ComplexQuat cqGrade1nnb = new ComplexQuat(grade1nnb);
120 		ComplexQuat[] cq0123 =
121 			{ ComplexQuat.ZERO, cqGrade1n, cqGrade1nb, cqGrade1nnb };
122 
123 		MultiVector grade1 = new MultiVector(cq0123);
124 		assertEquals(grade1, mv1.getGrade1());
125 		assertFalse(mv1 == mv1.getGrade1());
126 	}
127 	public void testGetGrade2() {
128 		ComplexNumber grade2Sc1 = new ComplexNumber(3.0, 0.0);
129 		ComplexNumber grade2Sc2 = new ComplexNumber(5.0, 0.0);
130 		ComplexNumber grade2Sc3 = new ComplexNumber(7.0, 0.0);
131 		ComplexNumber[] grade2Sc =
132 			{ ComplexNumber.ZERO, grade2Sc1, grade2Sc2, grade2Sc3 };
133 
134 		ComplexNumber grade2n1 = new ComplexNumber(0.0, 6.0);
135 		ComplexNumber grade2n2 = new ComplexNumber(0.0, 8.0);
136 		ComplexNumber grade2n3 = new ComplexNumber(0.0, 2.0);
137 		ComplexNumber[] grade2n =
138 			{ ComplexNumber.ZERO, grade2n1, grade2n2, grade2n3 };
139 
140 		ComplexNumber grade2nb1 = new ComplexNumber(0.0, 8.0);
141 		ComplexNumber grade2nb2 = new ComplexNumber(0.0, 2.0);
142 		ComplexNumber grade2nb3 = new ComplexNumber(0.0, 4.0);
143 		ComplexNumber[] grade2nb =
144 			{ ComplexNumber.ZERO, grade2nb1, grade2nb2, grade2nb3 };
145 
146 		ComplexNumber grade2nnb0 = new ComplexNumber(7.0, 0.0);
147 		ComplexNumber[] grade2nnb =
148 			{
149 				grade2nnb0,
150 				ComplexNumber.ZERO,
151 				ComplexNumber.ZERO,
152 				ComplexNumber.ZERO };
153 
154 		ComplexQuat cqGrade2sc = new ComplexQuat(grade2Sc);
155 		ComplexQuat cqGrade2n = new ComplexQuat(grade2n);
156 		ComplexQuat cqGrade2nb = new ComplexQuat(grade2nb);
157 		ComplexQuat cqGrade2nnb = new ComplexQuat(grade2nnb);
158 		ComplexQuat[] cqGrade2 =
159 			{ cqGrade2sc, cqGrade2n, cqGrade2nb, cqGrade2nnb };
160 
161 		MultiVector grade2 = new MultiVector(cqGrade2);
162 		//		System.out.println(mv1);
163 		//		System.out.println(mv1.getGrade2());
164 		//		System.out.println(grade2);
165 		assertEquals(grade2, mv1.getGrade2());
166 		assertFalse(mv1 == mv1.getGrade2());
167 	}
168 	public void testGetGrade3() {
169 		ComplexNumber grade3Sc1 = new ComplexNumber(0.0, 4.0);
170 		ComplexNumber grade3Sc2 = new ComplexNumber(0.0, 6.0);
171 		ComplexNumber grade3Sc3 = new ComplexNumber(0.0, 8.0);
172 		ComplexNumber[] grade3Sc =
173 			{ ComplexNumber.ZERO, grade3Sc1, grade3Sc2, grade3Sc3 };
174 
175 		ComplexNumber grade3n1 = new ComplexNumber(5.0, 0.0);
176 		ComplexNumber grade3n2 = new ComplexNumber(7.0, 0.0);
177 		ComplexNumber grade3n3 = new ComplexNumber(1.0, 0.0);
178 		ComplexNumber[] grade3n =
179 			{ ComplexNumber.ZERO, grade3n1, grade3n2, grade3n3 };
180 
181 		ComplexNumber grade3nb1 = new ComplexNumber(7.0, 0.0);
182 		ComplexNumber grade3nb2 = new ComplexNumber(1.0, 0.0);
183 		ComplexNumber grade3nb3 = new ComplexNumber(3.0, 0.0);
184 		ComplexNumber[] grade3nb =
185 			{ ComplexNumber.ZERO, grade3nb1, grade3nb2, grade3nb3 };
186 
187 		ComplexNumber grade3nnb0 = new ComplexNumber(0.0, 8.0);
188 		ComplexNumber[] grade3nnb =
189 			{
190 				grade3nnb0,
191 				ComplexNumber.ZERO,
192 				ComplexNumber.ZERO,
193 				ComplexNumber.ZERO };
194 
195 		ComplexQuat cqGrade3Sc = new ComplexQuat(grade3Sc);
196 		ComplexQuat cqGrade3n = new ComplexQuat(grade3n);
197 		ComplexQuat cqGrade3nb = new ComplexQuat(grade3nb);
198 		ComplexQuat cqGrade3nnb = new ComplexQuat(grade3nnb);
199 		ComplexQuat[] cqGrade3 =
200 			{ cqGrade3Sc, cqGrade3n, cqGrade3nb, cqGrade3nnb };
201 		MultiVector grade3 = new MultiVector(cqGrade3);
202 		assertEquals(grade3, mv1.getGrade3());
203 		assertFalse(mv1 == mv1.getGrade3());
204 	}
205 	public void testGetGrade4() {
206 		ComplexNumber grade4n0 = new ComplexNumber(0.0, 4.0);
207 		ComplexNumber[] grade4n =
208 			{
209 				grade4n0,
210 				ComplexNumber.ZERO,
211 				ComplexNumber.ZERO,
212 				ComplexNumber.ZERO };
213 
214 		ComplexNumber grade4nb0 = new ComplexNumber(0.0, 6.0);
215 		ComplexNumber[] grade4nb =
216 			{
217 				grade4nb0,
218 				ComplexNumber.ZERO,
219 				ComplexNumber.ZERO,
220 				ComplexNumber.ZERO };
221 
222 		ComplexNumber grade4nnb1 = new ComplexNumber(1.0, 0.0);
223 		ComplexNumber grade4nnb2 = new ComplexNumber(3.0, 0.0);
224 		ComplexNumber grade4nnb3 = new ComplexNumber(5.0, 0.0);
225 		ComplexNumber[] grade4nnb =
226 			{ ComplexNumber.ZERO, grade4nnb1, grade4nnb2, grade4nnb3 };
227 
228 		ComplexQuat cqGrade4n = new ComplexQuat(grade4n);
229 		ComplexQuat cqGrade4nb = new ComplexQuat(grade4nb);
230 		ComplexQuat cqGrade4nnb = new ComplexQuat(grade4nnb);
231 		ComplexQuat[] cqGrade4 =
232 			{ ComplexQuat.ZERO, cqGrade4n, cqGrade4nb, cqGrade4nnb };
233 		MultiVector grade4 = new MultiVector(cqGrade4);
234 		assertEquals(grade4, mv1.getGrade4());
235 		assertFalse(mv1 == mv1.getGrade4());
236 	}
237 	public void testGetGrade5() {
238 		ComplexNumber grade5Sc0 = new ComplexNumber(0.0, 2.0);
239 		ComplexNumber[] grade5Sc =
240 			{
241 				grade5Sc0,
242 				ComplexNumber.ZERO,
243 				ComplexNumber.ZERO,
244 				ComplexNumber.ZERO };
245 
246 		ComplexQuat cqGrade5Sc = new ComplexQuat(grade5Sc);
247 		ComplexQuat[] cqGrade5 =
248 			{
249 				cqGrade5Sc,
250 				ComplexQuat.ZERO,
251 				ComplexQuat.ZERO,
252 				ComplexQuat.ZERO };
253 		MultiVector grade5 = new MultiVector(cqGrade5);
254 		assertEquals(grade5, mv1.getGrade5());
255 		assertFalse(mv1 == mv1.getGrade5());
256 	}
257 	public void testGetGradeByInt() {
258 		assertEquals(mv1.getGrade(0), mv1.getGrade0());
259 		assertEquals(mv1.getGrade(1), mv1.getGrade1());
260 		assertEquals(mv1.getGrade(2), mv1.getGrade2());
261 		assertEquals(mv1.getGrade(3), mv1.getGrade3());
262 		assertEquals(mv1.getGrade(4), mv1.getGrade4());
263 		assertEquals(mv1.getGrade(5), mv1.getGrade5());
264 	}
265 	public void testMagnitude(){
266 		assertEquals("magnitude should be the same", mv1.magnitude(), 8.48528137423857, 0.0000000001);
267 		assertEquals("magnitude should be the same", mv2.magnitude(), 8.48528137423857, 0.0000000001);
268 	}
269 	public void testNormalize(){
270 		ComplexNumber c12 = new ComplexNumber(0.11785113019775793, 0.23570226039551587);
271 		ComplexNumber c23 = new ComplexNumber(0.3535533905932738, 0.47140452079103173);
272 		ComplexNumber c34 = new ComplexNumber(0.5892556509887896, 0.7071067811865476);
273 		ComplexNumber c41 = new ComplexNumber(0.8249579113843055, 0.9428090415820635);
274 		ComplexNumber[] c12341 = { c12, c23, c34, c41 };
275 		ComplexQuat cq12341 = new ComplexQuat(c12341);
276 
277 		ComplexNumber c45 = new ComplexNumber(0.3535533905932738, 0.47140452079103173);
278 		ComplexNumber c56 = new ComplexNumber(0.5892556509887896, 0.7071067811865476);
279 		ComplexNumber c67 = new ComplexNumber(0.8249579113843055, 0.9428090415820635);
280 		ComplexNumber c74 = new ComplexNumber(0.11785113019775793, 0.23570226039551587);
281 		ComplexNumber[] c45675 = { c45, c56, c67, c74 };
282 		ComplexQuat cq45675 = new ComplexQuat(c45675);
283 
284 		ComplexNumber c78 = new ComplexNumber(0.5892556509887896, 0.7071067811865476);
285 		ComplexNumber c89 = new ComplexNumber(0.8249579113843055, 0.9428090415820635);
286 		ComplexNumber c90 = new ComplexNumber(0.11785113019775793, 0.23570226039551587);
287 		ComplexNumber c07 = new ComplexNumber(0.3535533905932738, 0.47140452079103173);
288 		ComplexNumber[] c78907 = { c78, c89, c90, c07 };
289 		ComplexQuat cq78907 = new ComplexQuat(c78907);
290 
291 		ComplexNumber c01 = new ComplexNumber(0.8249579113843055, 0.9428090415820635);
292 		ComplexNumber c02 = new ComplexNumber(0.11785113019775793, 0.23570226039551587);
293 		ComplexNumber c03 = new ComplexNumber(0.3535533905932738, 0.47140452079103173);
294 		ComplexNumber c04 = new ComplexNumber(0.5892556509887896, 0.7071067811865476);
295 		ComplexNumber[] c01234 = { c01, c02, c03, c04 };
296 		ComplexQuat cq01235 = new ComplexQuat(c01234);
297 
298 		ComplexQuat[] cqarray = { cq12341, cq45675, cq78907, cq01235 };
299 
300 		MultiVector mv3 = new MultiVector(cqarray);
301 		assertEquals(mv3, mv1.normalize());
302 		assertFalse(mv1 == mv1.mult(mv2));
303 	}
304 	public void testReverse(){
305 		ComplexNumber c12 = new ComplexNumber(1.0, 2.0);
306 		ComplexNumber c23 = new ComplexNumber(-3.0, -4.0);
307 		ComplexNumber c34 = new ComplexNumber(-5.0, -6.0);
308 		ComplexNumber c41 = new ComplexNumber(-7.0, -8.0);
309 		ComplexNumber[] c12341 = { c12, c23, c34, c41 };
310 		ComplexQuat cq12341 = new ComplexQuat(c12341);
311 
312 		ComplexNumber c45 = new ComplexNumber(3.0, 4.0);
313 		ComplexNumber c56 = new ComplexNumber(-5.0, -6.0);
314 		ComplexNumber c67 = new ComplexNumber(-7.0, -8.0);
315 		ComplexNumber c74 = new ComplexNumber(-1.0, -2.0);
316 		ComplexNumber[] c45675 = { c45, c56, c67, c74 };
317 		ComplexQuat cq45675 = new ComplexQuat(c45675);
318 
319 		ComplexNumber c78 = new ComplexNumber(5.0, 6.0);
320 		ComplexNumber c89 = new ComplexNumber(-7.0, -8.0);
321 		ComplexNumber c90 = new ComplexNumber(-1.0, -2.0);
322 		ComplexNumber c07 = new ComplexNumber(-3.0, -4.0);
323 		ComplexNumber[] c78907 = { c78, c89, c90, c07 };
324 		ComplexQuat cq78907 = new ComplexQuat(c78907);
325 
326 		ComplexNumber c01 = new ComplexNumber(-7.0, -8.0);
327 		ComplexNumber c02 = new ComplexNumber(1.0, 2.0);
328 		ComplexNumber c03 = new ComplexNumber(3.0, 4.0);
329 		ComplexNumber c04 = new ComplexNumber(5.0, 6.0);
330 		ComplexNumber[] c01234 = { c01, c02, c03, c04 };
331 		ComplexQuat cq01235 = new ComplexQuat(c01234);
332 
333 		ComplexQuat[] cqarray = { cq12341, cq45675, cq78907, cq01235 };
334 
335 		MultiVector mv3 = new MultiVector(cqarray);
336 		assertEquals(mv3, mv1.reverse());
337 		assertFalse(mv1 == mv1.reverse());
338 	}
339 	public void testPowerOf(){
340 		try{
341 		mv1.Powerof(-3);
342 		fail();
343 		} catch (IllegalArgumentException ignore) {
344 			
345 		}
346 		assertEquals(MultiVectors.One(), mv1.Powerof(0));
347 		assertEquals(mv1, mv1.Powerof(1));
348 		ComplexNumber c12 = new ComplexNumber(0.0, -16.0);
349 		ComplexNumber c23 = new ComplexNumber(16.0, -160.0);
350 		ComplexNumber c34 = new ComplexNumber(0.0, -48.0);
351 		ComplexNumber c41 = new ComplexNumber(-16.0, 128.0);
352 		ComplexNumber[] c12341 = { c12, c23, c34, c41 };
353 		ComplexQuat cq12341 = new ComplexQuat(c12341);
354 
355 		ComplexNumber c45 = new ComplexNumber(52.0, -264.0);
356 		ComplexNumber c56 = new ComplexNumber(-12.0, -64.0);
357 		ComplexNumber c67 = new ComplexNumber(-52.0, 232.0);
358 		ComplexNumber c74 = new ComplexNumber(-28.0, 80.0);
359 		ComplexNumber[] c45675 = { c45, c56, c67, c74 };
360 		ComplexQuat cq45675 = new ComplexQuat(c45675);
361 
362 		ComplexNumber c78 = new ComplexNumber(44.0, -208.0);
363 		ComplexNumber c89 = new ComplexNumber(-36.0, 104.0);
364 		ComplexNumber c90 = new ComplexNumber(-12.0, -16.0);
365 		ComplexNumber c07 = new ComplexNumber(-52.0, 280.0);
366 		ComplexNumber[] c78907 = { c78, c89, c90, c07 };
367 		ComplexQuat cq78907 = new ComplexQuat(c78907);
368 
369 		ComplexNumber c01 = new ComplexNumber(36.0, -216.0);
370 		ComplexNumber c02 = new ComplexNumber(-12.0, 16.0);
371 		ComplexNumber c03 = new ComplexNumber(-36.0, 216.0);
372 		ComplexNumber c04 = new ComplexNumber(-60.0, 448.0);
373 		ComplexNumber[] c01234 = { c01, c02, c03, c04 };
374 		ComplexQuat cq01235 = new ComplexQuat(c01234);
375 
376 		ComplexQuat[] cqarray = { cq12341, cq45675, cq78907, cq01235 };
377 
378 		MultiVector mv3 = new MultiVector(cqarray);
379 		assertEquals(mv3, mv1.Powerof(2));
380 		assertFalse(mv1 == mv1.Powerof(2));
381 		assertEquals(mv3.mult(mv1), mv1.Powerof(3));
382 	}
383 	public void testScProd(){
384 		assertEquals("scalar product should be the same", 16.0, mv1.ScProd(mv2), 0.00000000000001);
385 		assertEquals("scalar product should be simetric", mv2.ScProd(mv1), mv1.ScProd(mv2), 0.00000000000001);
386 	}
387 	public void testOutProd(){
388 		ComplexNumber c12 = new ComplexNumber(3.0, -128.0);
389 		ComplexNumber c23 = new ComplexNumber(10.0, -80.0);
390 		ComplexNumber c34 = new ComplexNumber(30.0, -16.0);
391 		ComplexNumber c41 = new ComplexNumber(18.0, 16.0);
392 		ComplexNumber[] c12341 = { c12, c23, c34, c41 };
393 		ComplexQuat cq12341 = new ComplexQuat(c12341);
394 
395 		ComplexNumber c45 = new ComplexNumber(14.0, -200.0);
396 		ComplexNumber c56 = new ComplexNumber(100.0, 28.0);
397 		ComplexNumber c67 = new ComplexNumber(-12.0, 24.0);
398 		ComplexNumber c74 = new ComplexNumber(76.0, 4.0);
399 		ComplexNumber[] c45675 = { c45, c56, c67, c74 };
400 		ComplexQuat cq45675 = new ComplexQuat(c45675);
401 
402 		ComplexNumber c78 = new ComplexNumber(22.0, -40.0);
403 		ComplexNumber c89 = new ComplexNumber(76.0, 20.0);
404 		ComplexNumber c90 = new ComplexNumber(124.0, 8.0);
405 		ComplexNumber c07 = new ComplexNumber(28.0, 20.0);
406 		ComplexNumber[] c78907 = { c78, c89, c90, c07 };
407 		ComplexQuat cq78907 = new ComplexQuat(c78907);
408 
409 		ComplexNumber c01 = new ComplexNumber(18.0, -116.0);
410 		ComplexNumber c02 = new ComplexNumber(12.0, 10.0);
411 		ComplexNumber c03 = new ComplexNumber(116.0, 18.0);
412 		ComplexNumber c04 = new ComplexNumber(28.0, 26.0);
413 		ComplexNumber[] c01234 = { c01, c02, c03, c04 };
414 		ComplexQuat cq01235 = new ComplexQuat(c01234);
415 
416 		ComplexQuat[] cqarray = { cq12341, cq45675, cq78907, cq01235 };
417 
418 		MultiVector mv3 = new MultiVector(cqarray);
419 		assertEquals(mv3, mv1.OutProd(mv2));
420 	}
421 	public void testLContract(){
422 		ComplexNumber c12 = new ComplexNumber(16.0, 4.0);
423 		ComplexNumber c23 = new ComplexNumber(64.0, 20.0);
424 		ComplexNumber c34 = new ComplexNumber(72.0, 24.0);
425 		ComplexNumber c41 = new ComplexNumber(16.0, 32.0);
426 		ComplexNumber[] c12341 = { c12, c23, c34, c41 };
427 		ComplexQuat cq12341 = new ComplexQuat(c12341);
428 
429 		ComplexNumber c45 = new ComplexNumber(-8.0, 18.0);
430 		ComplexNumber c56 = new ComplexNumber(4.0, 24.0);
431 		ComplexNumber c67 = new ComplexNumber(8.0, 156.0);
432 		ComplexNumber c74 = new ComplexNumber(52.0, 24.0);
433 		ComplexNumber[] c45675 = { c45, c56, c67, c74 };
434 		ComplexQuat cq45675 = new ComplexQuat(c45675);
435 
436 		ComplexNumber c78 = new ComplexNumber(36.0, 28.0);
437 		ComplexNumber c89 = new ComplexNumber(-62.0, 76.0);
438 		ComplexNumber c90 = new ComplexNumber(-62.0, 48.0);
439 		ComplexNumber c07 = new ComplexNumber(-94.0, 116.0);
440 		ComplexNumber[] c78907 = { c78, c89, c90, c07 };
441 		ComplexQuat cq78907 = new ComplexQuat(c78907);
442 
443 		ComplexNumber c01 = new ComplexNumber(-58.0, 24.0);
444 		ComplexNumber c02 = new ComplexNumber(-5.0, 24.0);
445 		ComplexNumber c03 = new ComplexNumber(-11.0, 144.0);
446 		ComplexNumber c04 = new ComplexNumber(-17.0, 32.0);
447 		ComplexNumber[] c01234 = { c01, c02, c03, c04 };
448 		ComplexQuat cq01235 = new ComplexQuat(c01234);
449 
450 		ComplexQuat[] cqarray = { cq12341, cq45675, cq78907, cq01235 };
451 
452 		MultiVector mv3 = new MultiVector(cqarray);
453 		assertEquals(mv3, mv1.Lcontract(mv2));
454 	}
455 	public void testRContract(){
456 		ComplexNumber c12 = new ComplexNumber(16.0, 6.0);
457 		ComplexNumber c23 = new ComplexNumber(-48.0, 28.0);
458 		ComplexNumber c34 = new ComplexNumber(-72.0, 20.0);
459 		ComplexNumber c41 = new ComplexNumber(-16.0, 32.0);
460 		ComplexNumber[] c12341 = { c12, c23, c34, c41 };
461 		ComplexQuat cq12341 = new ComplexQuat(c12341);
462 
463 		ComplexNumber c45 = new ComplexNumber(68.0, 22.0);
464 		ComplexNumber c56 = new ComplexNumber(-22.0, 24.0);
465 		ComplexNumber c67 = new ComplexNumber(-22.0, 156.0);
466 		ComplexNumber c74 = new ComplexNumber(-62.0, 32.0);
467 		ComplexNumber[] c45675 = { c45, c56, c67, c74 };
468 		ComplexQuat cq45675 = new ComplexQuat(c45675);
469 
470 		ComplexNumber c78 = new ComplexNumber(-16.0, 32.0);
471 		ComplexNumber c89 = new ComplexNumber(48.0, 76.0);
472 		ComplexNumber c90 = new ComplexNumber(52.0, 48.0);
473 		ComplexNumber c07 = new ComplexNumber(80.0, 124.0);
474 		ComplexNumber[] c78907 = { c78, c89, c90, c07 };
475 		ComplexQuat cq78907 = new ComplexQuat(c78907);
476 
477 		ComplexNumber c01 = new ComplexNumber(102.0, 24.0);
478 		ComplexNumber c02 = new ComplexNumber(-5.0, 16.0);
479 		ComplexNumber c03 = new ComplexNumber(-3.0, 128.0);
480 		ComplexNumber c04 = new ComplexNumber(-1.0, 56.0);
481 		ComplexNumber[] c01234 = { c01, c02, c03, c04 };
482 		ComplexQuat cq01235 = new ComplexQuat(c01234);
483 
484 		ComplexQuat[] cqarray = { cq12341, cq45675, cq78907, cq01235 };
485 
486 		MultiVector mv3 = new MultiVector(cqarray);
487 		assertEquals(mv3, mv1.Rcontract(mv2));
488 	}
489 	public void testMultiplyByScalar(){
490 		ComplexNumber c12 = new ComplexNumber(3.0, 6.0);
491 		ComplexNumber c23 = new ComplexNumber(9.0, 12.0);
492 		ComplexNumber c34 = new ComplexNumber(15.0, 18.0);
493 		ComplexNumber c41 = new ComplexNumber(21.0, 24.0);
494 		ComplexNumber[] c12341 = { c12, c23, c34, c41 };
495 		ComplexQuat cq12341 = new ComplexQuat(c12341);
496 
497 		ComplexNumber c45 = new ComplexNumber(9.0, 12.0);
498 		ComplexNumber c56 = new ComplexNumber(15.0, 18.0);
499 		ComplexNumber c67 = new ComplexNumber(21.0, 24.0);
500 		ComplexNumber c74 = new ComplexNumber(3.0, 6.0);
501 		ComplexNumber[] c45675 = { c45, c56, c67, c74 };
502 		ComplexQuat cq45675 = new ComplexQuat(c45675);
503 
504 		ComplexNumber c78 = new ComplexNumber(15.0, 18.0);
505 		ComplexNumber c89 = new ComplexNumber(21.0, 24.0);
506 		ComplexNumber c90 = new ComplexNumber(3.0, 6.0);
507 		ComplexNumber c07 = new ComplexNumber(9.0, 12.0);
508 		ComplexNumber[] c78907 = { c78, c89, c90, c07 };
509 		ComplexQuat cq78907 = new ComplexQuat(c78907);
510 
511 		ComplexNumber c01 = new ComplexNumber(21.0, 24.0);
512 		ComplexNumber c02 = new ComplexNumber(3.0, 6.0);
513 		ComplexNumber c03 = new ComplexNumber(9.0, 12.0);
514 		ComplexNumber c04 = new ComplexNumber(15.0, 18.0);
515 		ComplexNumber[] c01234 = { c01, c02, c03, c04 };
516 		ComplexQuat cq01235 = new ComplexQuat(c01234);
517 
518 		ComplexQuat[] cqarray = { cq12341, cq45675, cq78907, cq01235 };
519 
520 		MultiVector mv3 = new MultiVector(cqarray);
521 		assertEquals(mv3, mv1.multSc(3));
522 		assertEquals(mv1, mv1.multSc(1));
523 		assertEquals(MultiVectors.Zero(), mv1.multSc(0));
524 	}
525 	public void test3DMVector(){
526 		assertEquals(mv1.get3DMVector(), mv1.getGrade1().OutProd(MultiVectors.N()).mult(MultiVectors.N()));
527 		assertFalse(mv1.get3DMVector() == mv1.getGrade1().OutProd(MultiVectors.N()).mult(MultiVectors.N()));
528 	}
529 	public static void main(String[] args) {
530 //		ComplexNumber c1 = new ComplexNumber(1.0, 2.0);
531 //		ComplexNumber c2 = new ComplexNumber(3.0, 4.0);
532 //		ComplexNumber c3 = new ComplexNumber(5.0, 6.0);
533 //		ComplexNumber c4 = new ComplexNumber(7.0, 8.0);
534 //		ComplexNumber[] c1234 = { c1, c2, c3, c4 };
535 //		ComplexNumber[] c2341 = { c2, c3, c4, c1 };
536 //		ComplexNumber[] c3412 = { c3, c4, c1, c2 };
537 //		ComplexNumber[] c4123 = { c4, c1, c2, c3 };
538 //		ComplexQuat cq1 = new ComplexQuat(c1234);
539 //		ComplexQuat cq2 = new ComplexQuat(c2341);
540 //		ComplexQuat cq3 = new ComplexQuat(c3412);
541 //		ComplexQuat cq4 = new ComplexQuat(c4123);
542 //		ComplexQuat[] cq1234 = { cq1, cq2, cq3, cq4 };
543 //		ComplexQuat[] cq2341 = { cq2, cq3, cq4, cq1 };
544 //		MultiVector mv1 = new MultiVector(cq1234);
545 //		MultiVector mv2 = new MultiVector(cq2341);
546 		MultiVectorTest test = new MultiVectorTest();
547 		System.out.println(test.mv1);
548 		//System.out.println(mv2);
549 		//System.out.println(mv1.mult(mv2));
550 		//System.out.println(mv1.get3DMVector());
551 		//System.out.println(mv2.get3DMVector());
552 		System.out.println(test.mv1.getGrade0());
553 		System.out.println(test.mv1.getGrade1());
554 		System.out.println(test.mv1.getGrade2());
555 		System.out.println(test.mv1.getGrade3());
556 		System.out.println(test.mv1.getGrade4());
557 		System.out.println(test.mv1.getGrade5());
558 		//System.out.println(mv2.getGrade1());
559 		System.out.println(test.mv2);
560 		System.out.println(test.mv2.getGrade0());
561 		System.out.println(test.mv2.getGrade1());
562 		System.out.println(test.mv2.getGrade2());
563 		System.out.println(test.mv2.getGrade3());
564 		System.out.println(test.mv2.getGrade4());
565 		System.out.println(test.mv2.getGrade5());
566 		System.out.println(test.mv1.magnitude());
567 		System.out.println(test.mv2.magnitude());
568 		System.out.println(test.mv1.normalize());
569 		System.out.println(test.mv2.normalize());
570 		System.out.println(test.mv1.reverse());
571 		System.out.println(test.mv2.reverse());
572 		//System.out.println(mv1.Powerof(-3));
573 		System.out.println(test.mv1.Powerof(0));
574 		System.out.println(test.mv1.Powerof(1));
575 		System.out.println(test.mv1.Powerof(2));
576 		System.out.println(test.mv1);
577 		test.mv1.show();
578 		System.out.println(test.mv1.ScProd(test.mv2));
579 		System.out.println(test.mv1.OutProd(test.mv2));
580 		System.out.println(test.mv2.OutProd(test.mv1));
581 		System.out.println(test.mv1.Lcontract(test.mv2));
582 		System.out.println(test.mv1.Rcontract(test.mv2));
583 		System.out.println(test.mv2.Lcontract(test.mv1));
584 		System.out.println(test.mv2.Rcontract(test.mv1));
585 		System.out.println(test.mv1.multSc(3));
586 		System.out.println(test.mv1.get3DMVector());
587 		System.out.println(test.mv2.get3DMVector());
588 	}
589 }