All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jscl.math.Clifford Maven / Gradle / Ivy

There is a newer version: 1.0.11
Show newest version
package jscl.math;

/**
 * User: serso
 * Date: 12/26/11
 * Time: 9:45 AM
 */
class Clifford {
	int p, n;
	int operator[][];

	Clifford(int algebra[]) {
		this(algebra[0], algebra[1]);
	}

	Clifford(int p, int q) {
		this.p = p;
		n = p + q;
		int m = 1 << n;
		operator = new int[m][m];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < m; j++) {
				int a = combination(i, n);
				int b = combination(j, n);
				int c = a ^ b;
				int l = location(c, n);
				boolean s = sign(a, b);
				int k = l + 1;
				operator[i][j] = s ? -k : k;
			}
		}
	}

	boolean sign(int a, int b) {
		boolean s = false;
		for (int i = 0; i < n; i++) {
			if ((b & (1 << i)) > 0) {
				for (int j = i; j < n; j++) {
					if ((a & (1 << j)) > 0 && (j > i || i >= p)) s = !s;
				}
			}
		}
		return s;
	}

	static int combination(int l, int n) {
		if (n <= 2) return l;
		int b[] = new int[1];
		int l1 = decimation(l, n, b);
		int c = combination(l1, n - 1);
		return (c << 1) + b[0];
	}

	static int location(int c, int n) {
		if (n <= 2) return c;
		int c1 = c >> 1;
		int b = c & 1;
		int l1 = location(c1, n - 1);
		return dilatation(l1, n, new int[]{b});
	}

	static int decimation(int l, int n, int b[]) {
		int p = grade(l, n - 1, 1);
		int p1 = (p + 1) >> 1;
		b[0] = p & 1;
		return l - sum(p1, n - 1);
	}

	static int dilatation(int l, int n, int b[]) {
		int p1 = grade(l, n - 1);
		return l + sum(p1 + b[0], n - 1);
	}

	static int grade(int l, int n) {
		return grade(l, n, 0);
	}

	static int grade(int l, int n, int d) {
		int s = 0, p = 0;
		while (true) {
			s += binomial(n, p >> d);
			if (s <= l) p++;
			else break;
		}
		return p;
	}

	static int sum(int p, int n) {
		int q = 0, s = 0;
		while (q < p) s += binomial(n, q++);
		return s;
	}

	static int binomial(int n, int p) {
		int a = 1, b = 1;
		for (int i = n - p + 1; i <= n; i++) a *= i;
		for (int i = 2; i <= p; i++) b *= i;
		return a / b;
	}

	static int log2e(int n) {
		int i;
		for (i = 0; n > 1; n >>= 1) i++;
		return i;
	}

	int[][] operator() {
		return operator;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy