"Testing 123"

check(abs(-1.0) == 1.0)
check(adj(((a,b),(c,d))) == ((d,-b),(-c,a)))
check(adj(((a11,a12,a13),(a21,a22,a23),(a31,a32,a33))) == ((a22 a33 - a23 a32,-a12 a33 + a13 a32,a12 a23 - a13 a22),(-a21 a33 + a23 a31,a11 a33 - a13 a31,-a11 a23 + a13 a21),(a21 a32 - a22 a31,-a11 a32 + a12 a31,a11 a22 - a12 a21)))
check(and(1,2) == 1)
check(arccos(1.0) == 0.0)
check(arccosh(1.0) == 0.0)
check(arcsin(0.0) == 0.0)
check(arcsinh(0.0) == 0.0)
check(arctan(0.0) == 0.0)
check(arctanh(0.0) == 0.0)
check(arg(0.0) == 0.0)
check(ceiling(1.2) == 2)
check(expform(sin(x)) == -1/2 i exp(i x) + 1/2 i exp(-i x))
check(prefixform(clock(1-i)) == "(* (^ 2 1/2) (^ -1 -1/4))")
check(conj(1 - i) == 1 + i)
check(contract(((a,b),(c,d))) == a + d)
check(cos(0.0) == 1.0)
check(cosh(0.0) == 1.0)
check(defint(x,x,1,2) == 3/2)
check(denominator(a/b) == b)
check(derivative(x,x) == 1)
check(det(((a,b),(c,d))) == a d - b c)
check(do(a,b,c) == c)
check(dot((a,b),(c,d)) == a c + b d)
check(eval(2 x,x,3) == 6)
check(exp(0.0) == 1.0)
check(expcos(x) == 1/2 exp(i x) + 1/2 exp(-i x))
check(expcosh(x) == 1/2 exp(-x) + 1/2 exp(x))
check(expsin(x) == -1/2 i exp(i x) + 1/2 i exp(-i x))
check(expsinh(x) == -1/2 exp(-x) + 1/2 exp(x))
check(exptan(x) == i / (exp(2 i x) + 1) - i exp(2 i x) / (exp(2 i x) + 1))
check(exptanh(x) == -1 / (exp(2 x) + 1) + exp(2 x) / (exp(2 x) + 1))
check(factorial(6) == 720)
check(prefixform(float(1/2)) == "0.5")
check(floor(3/2) == 1)
check(for(k,1,3,k) == nil)
check(imag(2 - 3 i) == -3)
check(inner((a,b),(c,d)) == a c + b d)
check(integral(x,x) == 1/2 x^2)
check(inv(((a,b),(c,d))) == ((d / (a d - b c),-b / (a d - b c)),(-c / (a d - b c),a / (a d - b c))))
check(log(1.0) == 0.0)
check(mag(2 - 3 i) == 13^(1/2))
check(not(0) == 1)
check(number(1) == 1)
check(numerator(a/b) == a)
check(or(0,0) == 0)
check(outer((a,b),(c,d)) == ((a c,a d),(b c,b d)))
check(prefixform(polar(2 - 3 i)) == "(* (^ 13 1/2) (^ $e (* -1 (^ -1 1/2) (arctan 3 2))))")
check(product(k,1,4,k) == 24)
check(prefixform(quote(1 + 2)) == "(+ 1 2)")
check(rank(outer((1,2),(3,4),(5,6))) == 3)
check(prefixform(rationalize(1/a + 1/b)) == "(* (^ a -1) (^ b -1) (+ a b))")
check(real(2 - 3 i) == 2)
check(rect((-1)^(1/8)) == cos(1/8 pi) + i sin(1/8 pi))
check(sin(0) == 0)
check(sinh(0) == 0)
check(prefixform(sqrt(2)) == "(^ 2 1/2)")
check(sum(k,1,4,k) == 10)
check(tan(0) == 0)
check(tanh(0) == 0)
check(test(a == b,1,0) == 0)
check(transpose(((a,b),(c,d))) == ((a,c),(b,d)))
check(unit(2) == ((1,0),(0,1)))
check(zero(2,3) == ((0,0,0),(0,0,0)))

check(prefixform(a-b)="(+ a (* -1 b))")
check(prefixform(b-a)="(+ (* -1 a) b)")

-- test parser

T =
+
1
check(T=1)

T =
-
1
check(T=-1)

T =
1 +
2
check(T=3)

T =
2 *
3
check(T=6)

T =
(
1
+
2
)
check(T=3)

T =
a[
1
]
check(T=a[1])

T =
a[
1
,
2
]
check(T=a[1,2])

T =
f(
1
)
check(T=f(1))

T = f(
1
,
2
)
check(T=f(1,2))

-- test sort order

T = 3+4*i
check(infixform(T)="3 + 4 i")
T = x^2*y
check(infixform(T)="x^2 y")
T = y*x^2
check(infixform(T)="x^2 y")
T = x*y^2
check(infixform(T)="x y^2")
T = y^2*x
check(infixform(T)="x y^2")
T = (x+1)^2
check(infixform(T)="x^2 + 2 x + 1")
T = (a+b)^2
check(infixform(T)="a^2 + 2 a b + b^2")
T = (a+b)^3
check(infixform(T)="a^3 + 3 a^2 b + 3 a b^2 + b^3")
T = x*cos(x)
check(infixform(T)="x cos(x)")
T = cos(x)*x
check(infixform(T)="x cos(x)")

-- term sort ignores coeff

check(prefixform(a-b)="(+ a (* -1 b))")
check(prefixform(b-a)="(+ (* -1 a) b)")

-- test addition

A=((0,0),(0,0))
B=((0,0),(0,0))
T = A+B
check(infixform(T)="((0,0),(0,0))")

A=2
B=3
check(A-B=-1)
check(B-A=1)
A=-2
B=3
check(A-B=-5)
check(B-A=5)
A=2
B=-3
check(A-B=5)
check(B-A=-5)
A=-2
B=-3
check(A-B=1)
check(B-A=-1)
A=quote(A)
B=quote(B)

-- test multiplication

N = 2*3^100
M = N/sqrt(2)
check(M^2=N^2/2)
check(infixform(M) = "515377520732011331036461129765621272702107522001 2^(1/2)")
M = sqrt(2)/N
check(M^2=2/N^2)
check(infixform(M) = "1 / (515377520732011331036461129765621272702107522001 2^(1/2))")
M = N/2^(2/3)
check(M^3=N^3/4)
check(infixform(M) = "515377520732011331036461129765621272702107522001 2^(1/3)")
M = 2^(2/3)/N
check(M^3=4/N^3)
check(infixform(M) = "1 / (515377520732011331036461129765621272702107522001 2^(1/3))")

N = -2^10 * 3^10 / 5^10 / 7^10 * x * y
M = 2^(2/3) * 3^(2/3) / 5^(2/3) / 7^(2/3)
check(N/M = -2^(10-2/3) * 3^(10-2/3) / 5^(10-2/3) / 7^(10-2/3) * x * y)
check(N*M = -2^(10+2/3) * 3^(10+2/3) / 5^(10+2/3) / 7^(10+2/3) * x * y)

A = 1.0 * sqrt(2) * sqrt(3) * x * y
B = sqrt(2.0) * sqrt(3.0) * x * y
check(infixform(A) = "2.44949 x y")
check(infixform(B) = "2.44949 x y")

-- test power function

clear

T = 0^a
check(infixform(T)="0^a")

T = 2^(3/2)
check(infixform(T)="2 2^(1/2)")

T = 858/sqrt(2)
check(infixform(T)="429 2^(1/2)")

T = (-3)^(3/2)
check(infixform(T)="-3 3^(1/2) i")

T = (10^10)^(4/3)
check(infixform(T)="10000000000 10000000000^(1/3)")

check(exp(i*pi)=-1)
check(prefixform(exp(i*pi+a))="(* -1 (^ $e a))")

T = 6*sqrt(2)*sqrt(3)
check(infixform(T)="6 2^(1/2) 3^(1/2)")

T = (a+b)*(a+b)
check(infixform(T)="a^2 + 2 a b + b^2")

T = (a+b)*(a+b)*(a+b)
check(infixform(T)="a^3 + 3 a^2 b + 3 a b^2 + b^3")

T = 1/(a+b)^2
check(infixform(T)="1 / (a + b)^2")

T = (a+b*i)/(c+d*i)
check(infixform(T)="a / (c + i d) + i b / (c + i d)")

T = ((2+3*i)^2)^(-1)
check(infixform(T)="-5/169 - 12/169 i")

T = ((2+3*i)^(-1))^2
check(infixform(T)="-5/169 - 12/169 i")

T = s^(-8*pi*i)
check(infixform(T)="s^(-8 i pi)")

T = exp(-8*pi*i)
check(T=1)

N = 102/2^64
M = sqrt(N)
T = N - M^2
check(T=0)

N = 2^64/102
M = sqrt(N)
T = N - M^2
check(T=0)

-- set component

clear
I = ((1,1,1,1),(1,1,1,1))
A = (I,I,I)
A[1] = a I
A[2] = b I
A[3] = c I
check(A == (((a,a,a,a),(a,a,a,a)),((b,b,b,b),(b,b,b,b)),((c,c,c,c),(c,c,c,c))))

-- setq

clear
check(infixform(A) == "A")
check(infixform(binding(A)) == "A")

A = nil
check(infixform(A) == "A")
check(infixform(binding(A)) == "A")

A = quote(A)
check(infixform(A) == "A")
check(infixform(binding(A)) == "A")

A = A
check(infixform(A) == "A")
check(infixform(binding(A)) == "A")

-- convert to integer

n = 1
check(sum(k,n,n,k) == 1)
n = 9/10
check(sum(k,n,n,k) == 0)
n = 1/10
check(sum(k,n,n,k) == 0)
n = 0
check(sum(k,n,n,k) == 0)
n = -1/10
check(sum(k,n,n,k) == 0)
n = -9/10
check(sum(k,n,n,k) == 0)
n = -1
check(sum(k,n,n,k) == -1)

n = 1.0
check(sum(k,n,n,k) == 1)
n = 0.9
check(sum(k,n,n,k) == 0)
n = 0.1
check(sum(k,n,n,k) == 0)
n = 0
check(sum(k,n,n,k) == 0)
n = -0.1
check(sum(k,n,n,k) == 0)
n = -0.9
check(sum(k,n,n,k) == 0)
n = -1.0
check(sum(k,n,n,k) == -1)
"Testing abs"

clear
check(infixform(abs(x)) == "abs(x)")
check(infixform(abs(-x)) == "abs(x)")
check(abs(1) == 1)
check(abs(-1) == 1)
check(abs(pi) == pi)
check(abs(-pi) == pi)
check(abs(exp(1)) == exp(1))
check(abs(-exp(1)) == exp(1))
check(abs(sqrt(2)) == sqrt(2))
check(abs(-sqrt(2)) == sqrt(2))
check(abs(1/sqrt(2)) == 1/sqrt(2))
check(abs(-1/sqrt(2)) == 1/sqrt(2))
check(abs(1/x) == 1/abs(x))
check(abs(-1/x) == 1/abs(x))
check(abs(sqrt(1/x)) == 1/abs(sqrt(x)))
check(abs(-sqrt(1/x)) == 1/abs(sqrt(x)))
check(abs(pi-1) == pi-1)
check(abs(1-pi) == pi-1)
check(abs(x*y) == abs(x)*abs(y))
check(abs(-x*y) == abs(x)*abs(y))
check(abs(1+2i) == sqrt(5))
check(abs((1+2i,3+4i)) == sqrt(5+25))
check(abs((x,y)) == sqrt(abs(x)^2+abs(y)^2))
check(abs(a-b) == abs(b-a))
check(abs(r exp(i theta)) == abs(r))

t = abs(2)
check(t = 2)
t = abs(2.0)
check(t = 2)
t = abs(-2)
check(t = 2)
t = abs(-2.0)
check(t = 2)
t = abs(a)
check(t = abs(a))
t = abs(-a)
check(t = abs(a))
t = abs(2*a)
check(t = 2*abs(a))
t = abs(-2*a)
check(t = 2*abs(a))
t = abs(2.0*a)
check(t = 2*abs(a))
t = abs(-2.0*a)
check(t = 2*abs(a))
t = abs(a-b)+abs(b-a)
check(t = 2*abs(a-b))
t = abs(3 + 4 i)
check(t = 5)
t = abs((2,3,4))
check(t = 29^(1/2))
t = abs(a*b)
check(t = abs(a)*abs(b))
t = abs(a/b)
check(t = abs(a)/abs(b))
t = abs(1/a^b)
check(t = 1/(abs(a^b)))
"Testing adj"

clear

T = adj(((a,b),(c,d)))
check(T = ((d,-b),(-c,a)))
T = adj(((1,2),(3,4)))
check(T = ((4,-2),(-3,1)))
T = adj(((2,3,-2,5),(6,-2,1,4),(5,10,3,-2),(-1,2,2,3)))
check(T = ((-4,-177,-73,194),(-117,117,-99,-27),(310,-129,-44,-374),(-130,-51,71,-211)))
"Testing arccos"

clear

check(arccos((x,y)) == (arccos(x),arccos(y)))

check(arccos(1 / sqrt(2)) == 1/4 pi)
check(arccos(-1 / sqrt(2)) == 3/4 pi)

check(arccos(-1) == pi)
check(arccos(-1/2) == 2/3 pi)
check(arccos(0) == 1/2 pi)
check(arccos(1/2) == 1/3 pi)
check(arccos(1) == 0)

-- compare intrinsic

for(x,-12,12,
  d = float(arccos(x/12)) - arccos(float(x/12)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-2,2,for(y,-2,2,
  z = 1/3.0 (x + i y),
  w = -i log(z + i sqrt(1 - z^2)),
  check(abs(arccos(z) - float(w)) < 1.0 10^(-6))
))

z1 =  0.2 + 0.3 i
z2 =  0.2 - 0.3 i
z3 = -0.2 + 0.3 i
z4 = -0.2 - 0.3 i

check(cos(z1) == cos(z4)) -- because cos(-x) = cos(x)
check(cos(z2) == cos(z3)) -- because cos(-x) = cos(x)

check(infixform(arccos(cos(z1))) == infixform(z1))
check(infixform(arccos(cos(z2))) == infixform(z2))
check(infixform(arccos(cos(z3))) == infixform(z2)) -- because cos(-x) = cos(x)
check(infixform(arccos(cos(z4))) == infixform(z1)) -- because cos(-x) = cos(x)

-- test domain beyond [-1,1]

for(x,-10,10,
  d = cos(arccos(x/3.0)) - x/3.0,
  check(abs(d) < 1.0 10^(-6))
)
"Testing arccosh"

clear

check(arccosh(1) == 0)
check(arccosh(cosh(x)) == x)
check(arccosh((x,y)) == (arccosh(x),arccosh(y)))

-- compare intrinsic

for(x,-12,12,
  d = float(arccosh(x/12)) - arccosh(float(x/12)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,0,3,for(y,0,3,
  z = 1/3.0 (x + i y),
  w = log(z + sqrt(z^2 - 1)),
  check(abs(arccosh(z) - float(w)) < 1.0 10^(-6))
))

z1 =  0.2 + 0.3 i
z2 =  0.2 - 0.3 i
z3 = -0.2 + 0.3 i
z4 = -0.2 - 0.3 i

check(infixform(cosh(z3)) == infixform(cosh(z2))) -- because cosh(-x) = cosh(x)
check(infixform(cosh(z4)) == infixform(cosh(z1))) -- because cosh(-x) = cosh(x)

check(infixform(arccosh(cosh(z1))) == infixform(z1))
check(infixform(arccosh(cosh(z2))) == infixform(z2))
check(infixform(arccosh(cosh(z3))) == infixform(z2)) -- because cosh(-x) = cosh(x)
check(infixform(arccosh(cosh(z4))) == infixform(z1)) -- because cosh(-x) = cosh(x)
"Testing arcsin"

clear

check(arcsin(-x) == -arcsin(x))
check(arcsin((x,y)) == (arcsin(x),arcsin(y)))

check(arcsin(1 / sqrt(2)) == 1/4 pi)
check(arcsin(-1 / sqrt(2)) == -1/4 pi)

check(arcsin(-1) == -1/2 pi)
check(arcsin(-1/2) == -1/6 pi)
check(arcsin(0) == 0)
check(arcsin(1/2) == 1/6 pi)
check(arcsin(1) == 1/2 pi)

-- compare intrinsic

for(x,-12,12,
  d = float(arcsin(x/12)) - arcsin(float(x/12)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  w = -i log(i z + sqrt(1 - z^2)),
  check(abs(arcsin(z) - w) < 1.0 10^(-6))
))

z1 =  0.2 + 0.3 i
z2 =  0.2 - 0.3 i
z3 = -0.2 + 0.3 i
z4 = -0.2 - 0.3 i

check(infixform(arcsin(sin(z1))) == infixform(z1))
check(infixform(arcsin(sin(z2))) == infixform(z2))
check(infixform(arcsin(sin(z3))) == infixform(z3))
check(infixform(arcsin(sin(z4))) == infixform(z4))

-- test domain beyond [-1,1]

for(x,-10,10,
  d = sin(arcsin(x/3.0)) - x/3.0,
  check(abs(d) < 1.0 10^(-6))
)
"Testing arcsinh"

clear

check(arcsinh(0) == 0)
check(arcsinh(sinh(x)) == x)
check(arcsinh(-x) == -arcsinh(x))
check(arcsinh((x,y)) == (arcsinh(x),arcsinh(y)))

-- compare intrinsic

for(x,-12,12,
  d = float(arcsinh(x/12)) - arcsinh(float(x/12)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  w = log(z + sqrt(z^2 + 1)),
  check(abs(arcsinh(z) - w) < 1.0 10^(-6))
))

z1 =  0.2 + 0.3 i
z2 =  0.2 - 0.3 i
z3 = -0.2 + 0.3 i
z4 = -0.2 - 0.3 i

check(infixform(arcsinh(sinh(z1))) == infixform(z1))
check(infixform(arcsinh(sinh(z2))) == infixform(z2))
check(infixform(arcsinh(sinh(z3))) == infixform(z3))
check(infixform(arcsinh(sinh(z4))) == infixform(z4))
"Testing arctan"

clear

check(arctan(-y,x) == -arctan(y,x))
check(arctan((y1,y2),x) == (arctan(y1,x),arctan(y2,x)))
check(infixform(arctan(x))="arctan(x,1)")

check(arctan(1,1)=pi/4)
check(arctan(1,-1)=3*pi/4)
check(arctan(-1,1)=-pi/4)
check(arctan(-1,-1)=-3*pi/4)

check(arctan(0,3)=0)
check(arctan(0,-3)=-pi)
check(arctan(3,0)=pi/2)
check(arctan(-3,0)=-pi/2)

check(arctan(3,3)=pi/4)
check(arctan(3,-3)=3*pi/4)
check(arctan(-3,3)=-pi/4)
check(arctan(-3,-3)=-3*pi/4)

check(infixform(arctan(2,4))="arctan(1,2)")
check(infixform(arctan(2,-4))="arctan(1,-2)")
check(infixform(arctan(-2,4))="-arctan(1,2)")
check(infixform(arctan(-2,-4))="-arctan(1,-2)")

check(infixform(arctan(1/2))="arctan(1,2)")

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  test(and(i - z,i + z),do(
    w = -1/2 i log((i - z) / (i + z)),
    check(abs(arctan(z) - w) < 1.0 10^(-6))
  ))
))

z1 =  0.2 + 0.3 i
z2 =  0.2 - 0.3 i
z3 = -0.2 + 0.3 i
z4 = -0.2 - 0.3 i

check(infixform(arctan(tan(z1))) == infixform(z1))
check(infixform(arctan(tan(z2))) == infixform(z2))
check(infixform(arctan(tan(z3))) == infixform(z3))
check(infixform(arctan(tan(z4))) == infixform(z4))
"Testing arctanh"

clear

check(arctanh(0) == 0)
check(arctanh(tanh(x)) == x)
check(arctanh(-x) == -arctanh(x))
check(arctanh((x,y)) == (arctanh(x),arctanh(y)))

check(prefixform(arctanh(1)) == "(arctanh 1)")
check(prefixform(arctanh(-1)) == "(arctanh -1)")

check(prefixform(arctanh(1.0)) == "(arctanh 1.0)")
check(prefixform(arctanh(-1.0)) == "(arctanh -1.0)")

-- compare intrinsic

for(x,-2,2,
  d = float(arctanh(x/3)) - arctanh(float(x/3)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-2,2,for(y,-2,2,
  z = 1/3.0 (x + i y),
  test(and(1 + z,1 - z),do(
    w = 1/2 log(1 + z) - 1/2 log(1 - z),
    check(abs(arctanh(z) - w) < 1.0 10^(-6))
  ))
))

z1 =  0.2 + 0.3 i
z2 =  0.2 - 0.3 i
z3 = -0.2 + 0.3 i
z4 = -0.2 - 0.3 i

check(infixform(arctanh(tanh(z1))) == infixform(z1))
check(infixform(arctanh(tanh(z2))) == infixform(z2))
check(infixform(arctanh(tanh(z3))) == infixform(z3))
check(infixform(arctanh(tanh(z4))) == infixform(z4))
"Testing arg"

clear

check(arg((a + i b) / (c + i d)) == arctan(b,a) - arctan(d,c))

check(infixform(arg(1)) == "0")
check(infixform(arg(-1)) == "-pi")
check(infixform(arg(i)) == "1/2 pi")
check(infixform(arg(-i)) == "-1/2 pi")

check(infixform(arg(a)) == "0")
check(infixform(arg(-a)) == "-pi")
check(infixform(arg(i a)) == "1/2 pi")
check(infixform(arg(-i a)) == "-1/2 pi")

check(infixform(arg(a b)) == "0")
check(infixform(arg(-a b)) == "-pi")
check(infixform(arg(i a b)) == "1/2 pi")
check(infixform(arg(-i a b)) == "-1/2 pi")

check(infixform(arg(a + b)) == "0")
check(infixform(arg(-a - b)) == "0")
check(infixform(arg(i a + i b)) == "1/2 pi")
check(infixform(arg(-i a - i b)) == "1/2 pi")

z1 = x1 + i y1
z2 = x2 + i y2
check(arg((z1,z2)) == (arctan(y1,x1),arctan(y2,x2)))

T = arg(-1)
check(prefixform(T)="(* -1 pi)")

T = arg(-1.0)
check(prefixform(T)="-3.14159")

check(arg(2 + 3 i) == arg(polar(2 + 3 i)))
check(arg(2 - 3 i) == arg(polar(2 - 3 i)))
check(arg(-2 + 3 i) == arg(polar(-2 + 3 i)))
check(arg(-2 - 3 i) == arg(polar(-2 - 3 i)))

check(arg(2 + 3 i) == arg(clock(2 + 3 i)))
check(arg(2 - 3 i) == arg(clock(2 - 3 i)))
check(arg(-2 + 3 i) == arg(clock(-2 + 3 i)))
check(arg(-2 - 3 i) == arg(clock(-2 - 3 i)))

-- use prefixform to compare floating point numbers

check(prefixform(arg(2.0 + 3.0 i)) == prefixform(arg(polar(2.0 + 3.0 i))))
check(prefixform(arg(2.0 - 3.0 i)) == prefixform(arg(polar(2.0 - 3.0 i))))
check(prefixform(arg(-2.0 + 3.0 i)) == prefixform(arg(polar(-2.0 + 3.0 i))))
check(prefixform(arg(-2.0 - 3.0 i)) == prefixform(arg(polar(-2.0 - 3.0 i))))

check(prefixform(arg(2.0 + 3.0 i)) == prefixform(arg(clock(2.0 + 3.0 i))))
check(prefixform(arg(2.0 - 3.0 i)) == prefixform(arg(clock(2.0 - 3.0 i))))
check(prefixform(arg(-2.0 + 3.0 i)) == prefixform(arg(clock(-2.0 + 3.0 i))))
check(prefixform(arg(-2.0 - 3.0 i)) == prefixform(arg(clock(-2.0 - 3.0 i))))

T = arg(1+i)
check(T = 1/4*pi)
T = arg(1-i)
check(T = -1/4*pi)
T = arg(-1+i)
check(T = 3/4*pi)
T = arg(-1-i)
check(T = -3/4*pi)
T = arg(a)
check(T = 0)
T = arg(a*exp(b+i*pi/5))
check(T = 1/5*pi)
T = arg(-1)
check(T = -pi)
T = arg(a)
check(T = 0)
T = arg(-a)
check(T = -pi)
T = arg(-exp(i*pi/3))
check(T = -2/3*pi)
T = arg(-i)
check(T = -1/2*pi)
T = arg((a+b*i)/(c+d*i))
check(T = arctan(b,a)-arctan(d,c))

check(infixform(arg(sqrt(-sqrt(-1)))) == "3/4 pi") -- bug fix

for(x,-2,2,for(y,-2,2,
  check(arg(x + i y) == arctan(y,x))
))

for(x,-2,2,for(y,-2,2,
  x = float(x),
  y = float(y),
  check(abs(arg(x + i y) - arctan(y,x)) < 0.000001)
))
"Testing associativity"

clear

-- associativity was broken due to exp (now fixed)

ket0 = (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket1 = (0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket2 = (0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket3 = (0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0)
ket4 = (0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0)
ket5 = (0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0)
ket6 = (0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0)
ket7 = (0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0)
ket8 = (0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0)
ket9 = (0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0)
ket10 = (0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0)
ket11 = (0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0)
ket12 = (0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0)
ket13 = (0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0)
ket14 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0)
ket15 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)

H0 =
sqrt(1/2) outer(ket0,ket0 + ket1) +
sqrt(1/2) outer(ket1,ket0 - ket1) +
sqrt(1/2) outer(ket2,ket2 + ket3) +
sqrt(1/2) outer(ket3,ket2 - ket3) +
sqrt(1/2) outer(ket4,ket4 + ket5) +
sqrt(1/2) outer(ket5,ket4 - ket5) +
sqrt(1/2) outer(ket6,ket6 + ket7) +
sqrt(1/2) outer(ket7,ket6 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket9) +
sqrt(1/2) outer(ket9,ket8 - ket9) +
sqrt(1/2) outer(ket10,ket10 + ket11) +
sqrt(1/2) outer(ket11,ket10 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket13) +
sqrt(1/2) outer(ket13,ket12 - ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P0(phi) = I - P0M + exp(i phi) P0M

P0M =
outer(ket1,ket1) +
outer(ket3,ket3) +
outer(ket5,ket5) +
outer(ket7,ket7) +
outer(ket9,ket9) +
outer(ket11,ket11) +
outer(ket13,ket13) +
outer(ket15,ket15)

X0 =
outer(ket0,ket1) +
outer(ket1,ket0) +
outer(ket2,ket3) +
outer(ket3,ket2) +
outer(ket4,ket5) +
outer(ket5,ket4) +
outer(ket6,ket7) +
outer(ket7,ket6) +
outer(ket8,ket9) +
outer(ket9,ket8) +
outer(ket10,ket11) +
outer(ket11,ket10) +
outer(ket12,ket13) +
outer(ket13,ket12) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y0 =
outer(ket0,i ket1) +
outer(ket1,-i ket0) +
outer(ket2,i ket3) +
outer(ket3,-i ket2) +
outer(ket4,i ket5) +
outer(ket5,-i ket4) +
outer(ket6,i ket7) +
outer(ket7,-i ket6) +
outer(ket8,i ket9) +
outer(ket9,-i ket8) +
outer(ket10,i ket11) +
outer(ket11,-i ket10) +
outer(ket12,i ket13) +
outer(ket13,-i ket12) +
outer(ket14,i ket15) +
outer(ket15,-i ket14)

Z0 =
outer(ket0,ket0) +
outer(ket1,-ket1) +
outer(ket2,ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,-ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,-ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

H00 =
sqrt(1/2) outer(ket0,ket0 + ket1) +
sqrt(1/2) outer(ket1,ket0 - ket1) +
sqrt(1/2) outer(ket2,ket2 + ket3) +
sqrt(1/2) outer(ket3,ket2 - ket3) +
sqrt(1/2) outer(ket4,ket4 + ket5) +
sqrt(1/2) outer(ket5,ket4 - ket5) +
sqrt(1/2) outer(ket6,ket6 + ket7) +
sqrt(1/2) outer(ket7,ket6 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket9) +
sqrt(1/2) outer(ket9,ket8 - ket9) +
sqrt(1/2) outer(ket10,ket10 + ket11) +
sqrt(1/2) outer(ket11,ket10 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket13) +
sqrt(1/2) outer(ket13,ket12 - ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P00(phi) = I - P00M + exp(i phi) P00M

P00M =
outer(ket1,ket1) +
outer(ket3,ket3) +
outer(ket5,ket5) +
outer(ket7,ket7) +
outer(ket9,ket9) +
outer(ket11,ket11) +
outer(ket13,ket13) +
outer(ket15,ket15)

X00 =
outer(ket0,ket1) +
outer(ket1,ket0) +
outer(ket2,ket3) +
outer(ket3,ket2) +
outer(ket4,ket5) +
outer(ket5,ket4) +
outer(ket6,ket7) +
outer(ket7,ket6) +
outer(ket8,ket9) +
outer(ket9,ket8) +
outer(ket10,ket11) +
outer(ket11,ket10) +
outer(ket12,ket13) +
outer(ket13,ket12) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y00 =
outer(ket0,i ket1) +
outer(ket1,-i ket0) +
outer(ket2,i ket3) +
outer(ket3,-i ket2) +
outer(ket4,i ket5) +
outer(ket5,-i ket4) +
outer(ket6,i ket7) +
outer(ket7,-i ket6) +
outer(ket8,i ket9) +
outer(ket9,-i ket8) +
outer(ket10,i ket11) +
outer(ket11,-i ket10) +
outer(ket12,i ket13) +
outer(ket13,-i ket12) +
outer(ket14,i ket15) +
outer(ket15,-i ket14)

Z00 =
outer(ket0,ket0) +
outer(ket1,-ket1) +
outer(ket2,ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,-ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,-ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W00 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H10 =
outer(ket0,ket0) +
outer(ket1,ket1) +
sqrt(1/2) outer(ket2,ket2 + ket3) +
sqrt(1/2) outer(ket3,ket2 - ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
sqrt(1/2) outer(ket6,ket6 + ket7) +
sqrt(1/2) outer(ket7,ket6 - ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
sqrt(1/2) outer(ket10,ket10 + ket11) +
sqrt(1/2) outer(ket11,ket10 - ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P10(phi) = I - P10M + exp(i phi) P10M

P10M =
outer(ket3,ket3) +
outer(ket7,ket7) +
outer(ket11,ket11) +
outer(ket15,ket15)

X10 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket3) +
outer(ket3,ket2) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket7) +
outer(ket7,ket6) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket11) +
outer(ket11,ket10) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y10 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,i ket3) +
outer(ket3,-i ket2) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,i ket7) +
outer(ket7,-i ket6) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,i ket11) +
outer(ket11,-i ket10) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,i ket15) +
outer(ket15,-i ket14)

Z10 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W10 =
outer(ket0,ket0) +
outer(ket1,ket2) +
outer(ket2,ket1) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket6) +
outer(ket6,ket5) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket10) +
outer(ket10,ket9) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket14) +
outer(ket14,ket13) +
outer(ket15,ket15)

H20 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
sqrt(1/2) outer(ket4,ket4 + ket5) +
sqrt(1/2) outer(ket5,ket4 - ket5) +
sqrt(1/2) outer(ket6,ket6 + ket7) +
sqrt(1/2) outer(ket7,ket6 - ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
sqrt(1/2) outer(ket12,ket12 + ket13) +
sqrt(1/2) outer(ket13,ket12 - ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P20(phi) = I - P20M + exp(i phi) P20M

P20M =
outer(ket5,ket5) +
outer(ket7,ket7) +
outer(ket13,ket13) +
outer(ket15,ket15)

X20 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket5) +
outer(ket5,ket4) +
outer(ket6,ket7) +
outer(ket7,ket6) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket13) +
outer(ket13,ket12) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y20 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,i ket5) +
outer(ket5,-i ket4) +
outer(ket6,i ket7) +
outer(ket7,-i ket6) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,i ket13) +
outer(ket13,-i ket12) +
outer(ket14,i ket15) +
outer(ket15,-i ket14)

Z20 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,-ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W20 =
outer(ket0,ket0) +
outer(ket1,ket4) +
outer(ket2,ket2) +
outer(ket3,ket6) +
outer(ket4,ket1) +
outer(ket5,ket5) +
outer(ket6,ket3) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket12) +
outer(ket10,ket10) +
outer(ket11,ket14) +
outer(ket12,ket9) +
outer(ket13,ket13) +
outer(ket14,ket11) +
outer(ket15,ket15)

H30 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
sqrt(1/2) outer(ket8,ket8 + ket9) +
sqrt(1/2) outer(ket9,ket8 - ket9) +
sqrt(1/2) outer(ket10,ket10 + ket11) +
sqrt(1/2) outer(ket11,ket10 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket13) +
sqrt(1/2) outer(ket13,ket12 - ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P30(phi) = I - P30M + exp(i phi) P30M

P30M =
outer(ket9,ket9) +
outer(ket11,ket11) +
outer(ket13,ket13) +
outer(ket15,ket15)

X30 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket9) +
outer(ket9,ket8) +
outer(ket10,ket11) +
outer(ket11,ket10) +
outer(ket12,ket13) +
outer(ket13,ket12) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y30 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,i ket9) +
outer(ket9,-i ket8) +
outer(ket10,i ket11) +
outer(ket11,-i ket10) +
outer(ket12,i ket13) +
outer(ket13,-i ket12) +
outer(ket14,i ket15) +
outer(ket15,-i ket14)

Z30 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,-ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W30 =
outer(ket0,ket0) +
outer(ket1,ket8) +
outer(ket2,ket2) +
outer(ket3,ket10) +
outer(ket4,ket4) +
outer(ket5,ket12) +
outer(ket6,ket6) +
outer(ket7,ket14) +
outer(ket8,ket1) +
outer(ket9,ket9) +
outer(ket10,ket3) +
outer(ket11,ket11) +
outer(ket12,ket5) +
outer(ket13,ket13) +
outer(ket14,ket7) +
outer(ket15,ket15)

H1 =
sqrt(1/2) outer(ket0,ket0 + ket2) +
sqrt(1/2) outer(ket1,ket1 + ket3) +
sqrt(1/2) outer(ket2,ket0 - ket2) +
sqrt(1/2) outer(ket3,ket1 - ket3) +
sqrt(1/2) outer(ket4,ket4 + ket6) +
sqrt(1/2) outer(ket5,ket5 + ket7) +
sqrt(1/2) outer(ket6,ket4 - ket6) +
sqrt(1/2) outer(ket7,ket5 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket10) +
sqrt(1/2) outer(ket9,ket9 + ket11) +
sqrt(1/2) outer(ket10,ket8 - ket10) +
sqrt(1/2) outer(ket11,ket9 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket14) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
sqrt(1/2) outer(ket14,ket12 - ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P1(phi) = I - P1M + exp(i phi) P1M

P1M =
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

X1 =
outer(ket0,ket2) +
outer(ket1,ket3) +
outer(ket2,ket0) +
outer(ket3,ket1) +
outer(ket4,ket6) +
outer(ket5,ket7) +
outer(ket6,ket4) +
outer(ket7,ket5) +
outer(ket8,ket10) +
outer(ket9,ket11) +
outer(ket10,ket8) +
outer(ket11,ket9) +
outer(ket12,ket14) +
outer(ket13,ket15) +
outer(ket14,ket12) +
outer(ket15,ket13)

Y1 =
outer(ket0,i ket2) +
outer(ket1,i ket3) +
outer(ket2,-i ket0) +
outer(ket3,-i ket1) +
outer(ket4,i ket6) +
outer(ket5,i ket7) +
outer(ket6,-i ket4) +
outer(ket7,-i ket5) +
outer(ket8,i ket10) +
outer(ket9,i ket11) +
outer(ket10,-i ket8) +
outer(ket11,-i ket9) +
outer(ket12,i ket14) +
outer(ket13,i ket15) +
outer(ket14,-i ket12) +
outer(ket15,-i ket13)

Z1 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,-ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

H01 =
outer(ket0,ket0) +
sqrt(1/2) outer(ket1,ket1 + ket3) +
outer(ket2,ket2) +
sqrt(1/2) outer(ket3,ket1 - ket3) +
outer(ket4,ket4) +
sqrt(1/2) outer(ket5,ket5 + ket7) +
outer(ket6,ket6) +
sqrt(1/2) outer(ket7,ket5 - ket7) +
outer(ket8,ket8) +
sqrt(1/2) outer(ket9,ket9 + ket11) +
outer(ket10,ket10) +
sqrt(1/2) outer(ket11,ket9 - ket11) +
outer(ket12,ket12) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
outer(ket14,ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P01(phi) = I - P01M + exp(i phi) P01M

P01M =
outer(ket3,ket3) +
outer(ket7,ket7) +
outer(ket11,ket11) +
outer(ket15,ket15)

X01 =
outer(ket0,ket0) +
outer(ket1,ket3) +
outer(ket2,ket2) +
outer(ket3,ket1) +
outer(ket4,ket4) +
outer(ket5,ket7) +
outer(ket6,ket6) +
outer(ket7,ket5) +
outer(ket8,ket8) +
outer(ket9,ket11) +
outer(ket10,ket10) +
outer(ket11,ket9) +
outer(ket12,ket12) +
outer(ket13,ket15) +
outer(ket14,ket14) +
outer(ket15,ket13)

Y01 =
outer(ket0,ket0) +
outer(ket1,i ket3) +
outer(ket2,ket2) +
outer(ket3,-i ket1) +
outer(ket4,ket4) +
outer(ket5,i ket7) +
outer(ket6,ket6) +
outer(ket7,-i ket5) +
outer(ket8,ket8) +
outer(ket9,i ket11) +
outer(ket10,ket10) +
outer(ket11,-i ket9) +
outer(ket12,ket12) +
outer(ket13,i ket15) +
outer(ket14,ket14) +
outer(ket15,-i ket13)

Z01 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W01 =
outer(ket0,ket0) +
outer(ket1,ket2) +
outer(ket2,ket1) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket6) +
outer(ket6,ket5) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket10) +
outer(ket10,ket9) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket14) +
outer(ket14,ket13) +
outer(ket15,ket15)

H11 =
sqrt(1/2) outer(ket0,ket0 + ket2) +
sqrt(1/2) outer(ket1,ket1 + ket3) +
sqrt(1/2) outer(ket2,ket0 - ket2) +
sqrt(1/2) outer(ket3,ket1 - ket3) +
sqrt(1/2) outer(ket4,ket4 + ket6) +
sqrt(1/2) outer(ket5,ket5 + ket7) +
sqrt(1/2) outer(ket6,ket4 - ket6) +
sqrt(1/2) outer(ket7,ket5 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket10) +
sqrt(1/2) outer(ket9,ket9 + ket11) +
sqrt(1/2) outer(ket10,ket8 - ket10) +
sqrt(1/2) outer(ket11,ket9 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket14) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
sqrt(1/2) outer(ket14,ket12 - ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P11(phi) = I - P11M + exp(i phi) P11M

P11M =
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

X11 =
outer(ket0,ket2) +
outer(ket1,ket3) +
outer(ket2,ket0) +
outer(ket3,ket1) +
outer(ket4,ket6) +
outer(ket5,ket7) +
outer(ket6,ket4) +
outer(ket7,ket5) +
outer(ket8,ket10) +
outer(ket9,ket11) +
outer(ket10,ket8) +
outer(ket11,ket9) +
outer(ket12,ket14) +
outer(ket13,ket15) +
outer(ket14,ket12) +
outer(ket15,ket13)

Y11 =
outer(ket0,i ket2) +
outer(ket1,i ket3) +
outer(ket2,-i ket0) +
outer(ket3,-i ket1) +
outer(ket4,i ket6) +
outer(ket5,i ket7) +
outer(ket6,-i ket4) +
outer(ket7,-i ket5) +
outer(ket8,i ket10) +
outer(ket9,i ket11) +
outer(ket10,-i ket8) +
outer(ket11,-i ket9) +
outer(ket12,i ket14) +
outer(ket13,i ket15) +
outer(ket14,-i ket12) +
outer(ket15,-i ket13)

Z11 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,-ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W11 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
sqrt(1/2) outer(ket4,ket4 + ket6) +
sqrt(1/2) outer(ket5,ket5 + ket7) +
sqrt(1/2) outer(ket6,ket4 - ket6) +
sqrt(1/2) outer(ket7,ket5 - ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
sqrt(1/2) outer(ket12,ket12 + ket14) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
sqrt(1/2) outer(ket14,ket12 - ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P21(phi) = I - P21M + exp(i phi) P21M

P21M =
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket14,ket14) +
outer(ket15,ket15)

X21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket6) +
outer(ket5,ket7) +
outer(ket6,ket4) +
outer(ket7,ket5) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket14) +
outer(ket13,ket15) +
outer(ket14,ket12) +
outer(ket15,ket13)

Y21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,i ket6) +
outer(ket5,i ket7) +
outer(ket6,-i ket4) +
outer(ket7,-i ket5) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,i ket14) +
outer(ket13,i ket15) +
outer(ket14,-i ket12) +
outer(ket15,-i ket13)

Z21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket4) +
outer(ket3,ket5) +
outer(ket4,ket2) +
outer(ket5,ket3) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket12) +
outer(ket11,ket13) +
outer(ket12,ket10) +
outer(ket13,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

H31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
sqrt(1/2) outer(ket8,ket8 + ket10) +
sqrt(1/2) outer(ket9,ket9 + ket11) +
sqrt(1/2) outer(ket10,ket8 - ket10) +
sqrt(1/2) outer(ket11,ket9 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket14) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
sqrt(1/2) outer(ket14,ket12 - ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P31(phi) = I - P31M + exp(i phi) P31M

P31M =
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

X31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket10) +
outer(ket9,ket11) +
outer(ket10,ket8) +
outer(ket11,ket9) +
outer(ket12,ket14) +
outer(ket13,ket15) +
outer(ket14,ket12) +
outer(ket15,ket13)

Y31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,i ket10) +
outer(ket9,i ket11) +
outer(ket10,-i ket8) +
outer(ket11,-i ket9) +
outer(ket12,i ket14) +
outer(ket13,i ket15) +
outer(ket14,-i ket12) +
outer(ket15,-i ket13)

Z31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket8) +
outer(ket3,ket9) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket12) +
outer(ket7,ket13) +
outer(ket8,ket2) +
outer(ket9,ket3) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket6) +
outer(ket13,ket7) +
outer(ket14,ket14) +
outer(ket15,ket15)

H2 =
sqrt(1/2) outer(ket0,ket0 + ket4) +
sqrt(1/2) outer(ket1,ket1 + ket5) +
sqrt(1/2) outer(ket2,ket2 + ket6) +
sqrt(1/2) outer(ket3,ket3 + ket7) +
sqrt(1/2) outer(ket4,ket0 - ket4) +
sqrt(1/2) outer(ket5,ket1 - ket5) +
sqrt(1/2) outer(ket6,ket2 - ket6) +
sqrt(1/2) outer(ket7,ket3 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket12) +
sqrt(1/2) outer(ket9,ket9 + ket13) +
sqrt(1/2) outer(ket10,ket10 + ket14) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
sqrt(1/2) outer(ket12,ket8 - ket12) +
sqrt(1/2) outer(ket13,ket9 - ket13) +
sqrt(1/2) outer(ket14,ket10 - ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P2(phi) = I - P2M + exp(i phi) P2M

P2M =
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X2 =
outer(ket0,ket4) +
outer(ket1,ket5) +
outer(ket2,ket6) +
outer(ket3,ket7) +
outer(ket4,ket0) +
outer(ket5,ket1) +
outer(ket6,ket2) +
outer(ket7,ket3) +
outer(ket8,ket12) +
outer(ket9,ket13) +
outer(ket10,ket14) +
outer(ket11,ket15) +
outer(ket12,ket8) +
outer(ket13,ket9) +
outer(ket14,ket10) +
outer(ket15,ket11)

Y2 =
outer(ket0,i ket4) +
outer(ket1,i ket5) +
outer(ket2,i ket6) +
outer(ket3,i ket7) +
outer(ket4,-i ket0) +
outer(ket5,-i ket1) +
outer(ket6,-i ket2) +
outer(ket7,-i ket3) +
outer(ket8,i ket12) +
outer(ket9,i ket13) +
outer(ket10,i ket14) +
outer(ket11,i ket15) +
outer(ket12,-i ket8) +
outer(ket13,-i ket9) +
outer(ket14,-i ket10) +
outer(ket15,-i ket11)

Z2 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,-ket4) +
outer(ket5,-ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

H02 =
outer(ket0,ket0) +
sqrt(1/2) outer(ket1,ket1 + ket5) +
outer(ket2,ket2) +
sqrt(1/2) outer(ket3,ket3 + ket7) +
outer(ket4,ket4) +
sqrt(1/2) outer(ket5,ket1 - ket5) +
outer(ket6,ket6) +
sqrt(1/2) outer(ket7,ket3 - ket7) +
outer(ket8,ket8) +
sqrt(1/2) outer(ket9,ket9 + ket13) +
outer(ket10,ket10) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
outer(ket12,ket12) +
sqrt(1/2) outer(ket13,ket9 - ket13) +
outer(ket14,ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P02(phi) = I - P02M + exp(i phi) P02M

P02M =
outer(ket5,ket5) +
outer(ket7,ket7) +
outer(ket13,ket13) +
outer(ket15,ket15)

X02 =
outer(ket0,ket0) +
outer(ket1,ket5) +
outer(ket2,ket2) +
outer(ket3,ket7) +
outer(ket4,ket4) +
outer(ket5,ket1) +
outer(ket6,ket6) +
outer(ket7,ket3) +
outer(ket8,ket8) +
outer(ket9,ket13) +
outer(ket10,ket10) +
outer(ket11,ket15) +
outer(ket12,ket12) +
outer(ket13,ket9) +
outer(ket14,ket14) +
outer(ket15,ket11)

Y02 =
outer(ket0,ket0) +
outer(ket1,i ket5) +
outer(ket2,ket2) +
outer(ket3,i ket7) +
outer(ket4,ket4) +
outer(ket5,-i ket1) +
outer(ket6,ket6) +
outer(ket7,-i ket3) +
outer(ket8,ket8) +
outer(ket9,i ket13) +
outer(ket10,ket10) +
outer(ket11,i ket15) +
outer(ket12,ket12) +
outer(ket13,-i ket9) +
outer(ket14,ket14) +
outer(ket15,-i ket11)

Z02 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,-ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W02 =
outer(ket0,ket0) +
outer(ket1,ket4) +
outer(ket2,ket2) +
outer(ket3,ket6) +
outer(ket4,ket1) +
outer(ket5,ket5) +
outer(ket6,ket3) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket12) +
outer(ket10,ket10) +
outer(ket11,ket14) +
outer(ket12,ket9) +
outer(ket13,ket13) +
outer(ket14,ket11) +
outer(ket15,ket15)

H12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
sqrt(1/2) outer(ket2,ket2 + ket6) +
sqrt(1/2) outer(ket3,ket3 + ket7) +
outer(ket4,ket4) +
outer(ket5,ket5) +
sqrt(1/2) outer(ket6,ket2 - ket6) +
sqrt(1/2) outer(ket7,ket3 - ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
sqrt(1/2) outer(ket10,ket10 + ket14) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
outer(ket12,ket12) +
outer(ket13,ket13) +
sqrt(1/2) outer(ket14,ket10 - ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P12(phi) = I - P12M + exp(i phi) P12M

P12M =
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket14,ket14) +
outer(ket15,ket15)

X12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket6) +
outer(ket3,ket7) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket2) +
outer(ket7,ket3) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket14) +
outer(ket11,ket15) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket10) +
outer(ket15,ket11)

Y12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,i ket6) +
outer(ket3,i ket7) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-i ket2) +
outer(ket7,-i ket3) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,i ket14) +
outer(ket11,i ket15) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-i ket10) +
outer(ket15,-i ket11)

Z12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket4) +
outer(ket3,ket5) +
outer(ket4,ket2) +
outer(ket5,ket3) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket12) +
outer(ket11,ket13) +
outer(ket12,ket10) +
outer(ket13,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

H22 =
sqrt(1/2) outer(ket0,ket0 + ket4) +
sqrt(1/2) outer(ket1,ket1 + ket5) +
sqrt(1/2) outer(ket2,ket2 + ket6) +
sqrt(1/2) outer(ket3,ket3 + ket7) +
sqrt(1/2) outer(ket4,ket0 - ket4) +
sqrt(1/2) outer(ket5,ket1 - ket5) +
sqrt(1/2) outer(ket6,ket2 - ket6) +
sqrt(1/2) outer(ket7,ket3 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket12) +
sqrt(1/2) outer(ket9,ket9 + ket13) +
sqrt(1/2) outer(ket10,ket10 + ket14) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
sqrt(1/2) outer(ket12,ket8 - ket12) +
sqrt(1/2) outer(ket13,ket9 - ket13) +
sqrt(1/2) outer(ket14,ket10 - ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P22(phi) = I - P22M + exp(i phi) P22M

P22M =
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X22 =
outer(ket0,ket4) +
outer(ket1,ket5) +
outer(ket2,ket6) +
outer(ket3,ket7) +
outer(ket4,ket0) +
outer(ket5,ket1) +
outer(ket6,ket2) +
outer(ket7,ket3) +
outer(ket8,ket12) +
outer(ket9,ket13) +
outer(ket10,ket14) +
outer(ket11,ket15) +
outer(ket12,ket8) +
outer(ket13,ket9) +
outer(ket14,ket10) +
outer(ket15,ket11)

Y22 =
outer(ket0,i ket4) +
outer(ket1,i ket5) +
outer(ket2,i ket6) +
outer(ket3,i ket7) +
outer(ket4,-i ket0) +
outer(ket5,-i ket1) +
outer(ket6,-i ket2) +
outer(ket7,-i ket3) +
outer(ket8,i ket12) +
outer(ket9,i ket13) +
outer(ket10,i ket14) +
outer(ket11,i ket15) +
outer(ket12,-i ket8) +
outer(ket13,-i ket9) +
outer(ket14,-i ket10) +
outer(ket15,-i ket11)

Z22 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,-ket4) +
outer(ket5,-ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W22 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
sqrt(1/2) outer(ket8,ket8 + ket12) +
sqrt(1/2) outer(ket9,ket9 + ket13) +
sqrt(1/2) outer(ket10,ket10 + ket14) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
sqrt(1/2) outer(ket12,ket8 - ket12) +
sqrt(1/2) outer(ket13,ket9 - ket13) +
sqrt(1/2) outer(ket14,ket10 - ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P32(phi) = I - P32M + exp(i phi) P32M

P32M =
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket12) +
outer(ket9,ket13) +
outer(ket10,ket14) +
outer(ket11,ket15) +
outer(ket12,ket8) +
outer(ket13,ket9) +
outer(ket14,ket10) +
outer(ket15,ket11)

Y32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,i ket12) +
outer(ket9,i ket13) +
outer(ket10,i ket14) +
outer(ket11,i ket15) +
outer(ket12,-i ket8) +
outer(ket13,-i ket9) +
outer(ket14,-i ket10) +
outer(ket15,-i ket11)

Z32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket8) +
outer(ket5,ket9) +
outer(ket6,ket10) +
outer(ket7,ket11) +
outer(ket8,ket4) +
outer(ket9,ket5) +
outer(ket10,ket6) +
outer(ket11,ket7) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H3 =
sqrt(1/2) outer(ket0,ket0 + ket8) +
sqrt(1/2) outer(ket1,ket1 + ket9) +
sqrt(1/2) outer(ket2,ket2 + ket10) +
sqrt(1/2) outer(ket3,ket3 + ket11) +
sqrt(1/2) outer(ket4,ket4 + ket12) +
sqrt(1/2) outer(ket5,ket5 + ket13) +
sqrt(1/2) outer(ket6,ket6 + ket14) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
sqrt(1/2) outer(ket8,ket0 - ket8) +
sqrt(1/2) outer(ket9,ket1 - ket9) +
sqrt(1/2) outer(ket10,ket2 - ket10) +
sqrt(1/2) outer(ket11,ket3 - ket11) +
sqrt(1/2) outer(ket12,ket4 - ket12) +
sqrt(1/2) outer(ket13,ket5 - ket13) +
sqrt(1/2) outer(ket14,ket6 - ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P3(phi) = I - P3M + exp(i phi) P3M

P3M =
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X3 =
outer(ket0,ket8) +
outer(ket1,ket9) +
outer(ket2,ket10) +
outer(ket3,ket11) +
outer(ket4,ket12) +
outer(ket5,ket13) +
outer(ket6,ket14) +
outer(ket7,ket15) +
outer(ket8,ket0) +
outer(ket9,ket1) +
outer(ket10,ket2) +
outer(ket11,ket3) +
outer(ket12,ket4) +
outer(ket13,ket5) +
outer(ket14,ket6) +
outer(ket15,ket7)

Y3 =
outer(ket0,i ket8) +
outer(ket1,i ket9) +
outer(ket2,i ket10) +
outer(ket3,i ket11) +
outer(ket4,i ket12) +
outer(ket5,i ket13) +
outer(ket6,i ket14) +
outer(ket7,i ket15) +
outer(ket8,-i ket0) +
outer(ket9,-i ket1) +
outer(ket10,-i ket2) +
outer(ket11,-i ket3) +
outer(ket12,-i ket4) +
outer(ket13,-i ket5) +
outer(ket14,-i ket6) +
outer(ket15,-i ket7)

Z3 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,-ket8) +
outer(ket9,-ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

H03 =
outer(ket0,ket0) +
sqrt(1/2) outer(ket1,ket1 + ket9) +
outer(ket2,ket2) +
sqrt(1/2) outer(ket3,ket3 + ket11) +
outer(ket4,ket4) +
sqrt(1/2) outer(ket5,ket5 + ket13) +
outer(ket6,ket6) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
outer(ket8,ket8) +
sqrt(1/2) outer(ket9,ket1 - ket9) +
outer(ket10,ket10) +
sqrt(1/2) outer(ket11,ket3 - ket11) +
outer(ket12,ket12) +
sqrt(1/2) outer(ket13,ket5 - ket13) +
outer(ket14,ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P03(phi) = I - P03M + exp(i phi) P03M

P03M =
outer(ket9,ket9) +
outer(ket11,ket11) +
outer(ket13,ket13) +
outer(ket15,ket15)

X03 =
outer(ket0,ket0) +
outer(ket1,ket9) +
outer(ket2,ket2) +
outer(ket3,ket11) +
outer(ket4,ket4) +
outer(ket5,ket13) +
outer(ket6,ket6) +
outer(ket7,ket15) +
outer(ket8,ket8) +
outer(ket9,ket1) +
outer(ket10,ket10) +
outer(ket11,ket3) +
outer(ket12,ket12) +
outer(ket13,ket5) +
outer(ket14,ket14) +
outer(ket15,ket7)

Y03 =
outer(ket0,ket0) +
outer(ket1,i ket9) +
outer(ket2,ket2) +
outer(ket3,i ket11) +
outer(ket4,ket4) +
outer(ket5,i ket13) +
outer(ket6,ket6) +
outer(ket7,i ket15) +
outer(ket8,ket8) +
outer(ket9,-i ket1) +
outer(ket10,ket10) +
outer(ket11,-i ket3) +
outer(ket12,ket12) +
outer(ket13,-i ket5) +
outer(ket14,ket14) +
outer(ket15,-i ket7)

Z03 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,-ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W03 =
outer(ket0,ket0) +
outer(ket1,ket8) +
outer(ket2,ket2) +
outer(ket3,ket10) +
outer(ket4,ket4) +
outer(ket5,ket12) +
outer(ket6,ket6) +
outer(ket7,ket14) +
outer(ket8,ket1) +
outer(ket9,ket9) +
outer(ket10,ket3) +
outer(ket11,ket11) +
outer(ket12,ket5) +
outer(ket13,ket13) +
outer(ket14,ket7) +
outer(ket15,ket15)

H13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
sqrt(1/2) outer(ket2,ket2 + ket10) +
sqrt(1/2) outer(ket3,ket3 + ket11) +
outer(ket4,ket4) +
outer(ket5,ket5) +
sqrt(1/2) outer(ket6,ket6 + ket14) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
sqrt(1/2) outer(ket10,ket2 - ket10) +
sqrt(1/2) outer(ket11,ket3 - ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
sqrt(1/2) outer(ket14,ket6 - ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P13(phi) = I - P13M + exp(i phi) P13M

P13M =
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

X13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket10) +
outer(ket3,ket11) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket14) +
outer(ket7,ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket2) +
outer(ket11,ket3) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket6) +
outer(ket15,ket7)

Y13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,i ket10) +
outer(ket3,i ket11) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,i ket14) +
outer(ket7,i ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-i ket2) +
outer(ket11,-i ket3) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-i ket6) +
outer(ket15,-i ket7)

Z13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket8) +
outer(ket3,ket9) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket12) +
outer(ket7,ket13) +
outer(ket8,ket2) +
outer(ket9,ket3) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket6) +
outer(ket13,ket7) +
outer(ket14,ket14) +
outer(ket15,ket15)

H23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
sqrt(1/2) outer(ket4,ket4 + ket12) +
sqrt(1/2) outer(ket5,ket5 + ket13) +
sqrt(1/2) outer(ket6,ket6 + ket14) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
sqrt(1/2) outer(ket12,ket4 - ket12) +
sqrt(1/2) outer(ket13,ket5 - ket13) +
sqrt(1/2) outer(ket14,ket6 - ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P23(phi) = I - P23M + exp(i phi) P23M

P23M =
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket12) +
outer(ket5,ket13) +
outer(ket6,ket14) +
outer(ket7,ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket4) +
outer(ket13,ket5) +
outer(ket14,ket6) +
outer(ket15,ket7)

Y23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,i ket12) +
outer(ket5,i ket13) +
outer(ket6,i ket14) +
outer(ket7,i ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-i ket4) +
outer(ket13,-i ket5) +
outer(ket14,-i ket6) +
outer(ket15,-i ket7)

Z23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket8) +
outer(ket5,ket9) +
outer(ket6,ket10) +
outer(ket7,ket11) +
outer(ket8,ket4) +
outer(ket9,ket5) +
outer(ket10,ket6) +
outer(ket11,ket7) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H33 =
sqrt(1/2) outer(ket0,ket0 + ket8) +
sqrt(1/2) outer(ket1,ket1 + ket9) +
sqrt(1/2) outer(ket2,ket2 + ket10) +
sqrt(1/2) outer(ket3,ket3 + ket11) +
sqrt(1/2) outer(ket4,ket4 + ket12) +
sqrt(1/2) outer(ket5,ket5 + ket13) +
sqrt(1/2) outer(ket6,ket6 + ket14) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
sqrt(1/2) outer(ket8,ket0 - ket8) +
sqrt(1/2) outer(ket9,ket1 - ket9) +
sqrt(1/2) outer(ket10,ket2 - ket10) +
sqrt(1/2) outer(ket11,ket3 - ket11) +
sqrt(1/2) outer(ket12,ket4 - ket12) +
sqrt(1/2) outer(ket13,ket5 - ket13) +
sqrt(1/2) outer(ket14,ket6 - ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P33(phi) = I - P33M + exp(i phi) P33M

P33M =
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X33 =
outer(ket0,ket8) +
outer(ket1,ket9) +
outer(ket2,ket10) +
outer(ket3,ket11) +
outer(ket4,ket12) +
outer(ket5,ket13) +
outer(ket6,ket14) +
outer(ket7,ket15) +
outer(ket8,ket0) +
outer(ket9,ket1) +
outer(ket10,ket2) +
outer(ket11,ket3) +
outer(ket12,ket4) +
outer(ket13,ket5) +
outer(ket14,ket6) +
outer(ket15,ket7)

Y33 =
outer(ket0,i ket8) +
outer(ket1,i ket9) +
outer(ket2,i ket10) +
outer(ket3,i ket11) +
outer(ket4,i ket12) +
outer(ket5,i ket13) +
outer(ket6,i ket14) +
outer(ket7,i ket15) +
outer(ket8,-i ket0) +
outer(ket9,-i ket1) +
outer(ket10,-i ket2) +
outer(ket11,-i ket3) +
outer(ket12,-i ket4) +
outer(ket13,-i ket5) +
outer(ket14,-i ket6) +
outer(ket15,-i ket7)

Z33 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,-ket8) +
outer(ket9,-ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W33 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

I = unit(16)

Q = dot(
W03,
W12,
H0,
P01(pi/2),
H1,
P12(pi/2),
P02(pi/4),
H2,
P23(pi/2),
P13(pi/4),
P03(pi/8),
H3)

V = dot(
H3,
P03(-pi/8),
P13(-pi/4),
P23(-pi/2),
H2,
P02(-pi/4),
P12(-pi/2),
H1,
P01(-pi/2),
H0,
W12,
W03)

M(psi,P) = do(
  P = ((0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
       (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)),
  P[1] = hadamard(psi,conj(psi)),
  xrange = (0,16),
  yrange = (0,1),
  draw(P[1,ceiling(x)],x),
  P
)

m2 = P03(pi/8)
m3 = P13(pi/4)
m6 = P02(pi/4)

A = dot(dot(m6,m3),m2)
B = dot(m6,dot(m3,m2))

check(A == B)
"Testing bignum"
clear
W = (0, 1, 2^31 - 1, 2^31, 2^31 + 1, 2^32 - 2, 2^32 - 1)
N = zero(343)
for(I, 1, 7, for(J, 1, 7, for(K, 1, 7,
 N[49 I + 7 J + K - 56] = 2^64 W[I] + 2^32 W[J] + W[K]
)))
for(I,1,343,for(J,2,343,
  Q = floor(N[I]/N[J]),
  R = mod(N[I],N[J]),
  check(N[I] == N[J] Q + R)
))
"Testing bug fixes"

clear

-- numerator and denominator had an infinite loop

T = numerator(-(-i + i * exp(2 * i * x)) / (exp(2 * i * x) + 1))
check(T = i - i * exp(2 * i * x))
T = denominator(-(-i + i * exp(2 * i * x)) / (exp(2 * i * x) + 1))
check(T = exp(2 * i * x) + 1)

-- this was broken, returned a complex number

T = arccos(0.4529)
check(infixform(T)="1.10078")

-- this was broken, now fixed

z = sqrt(i)
T = z conj(z)
check(T == 1)

z = (-1)^a
T = z conj(z)
check(T == 1)

-- verify that defint works in a denominator

I(y) = defint((1 + cos(theta)^2) sin(theta),theta,0,y)
T = I(theta) / I(pi)
check(T = -1/8 cos(theta)^3 - 3/8 cos(theta) + 1/2)

-- log of number is factored

check(log(1/10) = -log(2) - log(5))

clear
check(i exp(1/4 i pi) exp(1/4 i pi) == -1)
check(i exp(1/8 i pi) == exp(5/8 i pi))
check(infixform(cos(1/3.0 pi)) == "0.5")
check(infixform(sin(1/6.0 pi)) == "0.5")
check(infixform(polar(2.0 + 3.0 i)) == "3.60555 exp(0.312833 i pi)")
check(infixform(exp(0.5 i pi)) == "i") -- was 1.0 i
check(infixform(arg(1.0 i)) == "1.5708") -- was 1/2 pi
check(infixform(log(1.0 i)) == "1.5708 i") -- was 1/2 i pi
check(infixform(1/abs(2.0+3.0i)) == "0.27735")
check(infixform(1/arg(2.0+3.0i)) == "1.01751")
check(infixform(1/mag(2.0+3.0i)) == "0.27735")
check((1/3)^x == 3^(-x))
check(i^x == (-1)^(x/2))
check((-2/3)^x == 2^x 3^(-x) (-1)^x)
check(infixform((-2/3)^1.2) == "-0.497334 - 0.361334 i")
check((-192)^x == 2^(6 x) 3^x (-1)^x)
check((3,4,5) - 2 == (1,2,3))
check(infixform(A + B - B + 0) == "A")
check(infixform(0.0) == "0")
check(sqrt(-i) == sqrt(-1) sqrt(i))
check(prefixform((-2 i pi hbar epsilon / m)^(3/2)) ==
"(* 2 (^ 2 1/2) (^ -1 1/4) (^ epsilon 3/2) (^ hbar 3/2) (^ m -3/2) (^ pi 3/2))")
check(prefixform(hbar Rbc) == "(* Rbc hbar)") -- fails for Javascript localeCompare
check(infixform(-0) == "0") -- eigenmath.js result was -0, now fixed

check(infixform(abs(32/59049)) == "32/59049") -- bug in absfunc(), now fixed
check(infixform(abs(-32/59049)) == "32/59049")

-- fixed in version 3.24

eta = 1 / ((18.7179 (0.399323 - 0.91681 i) - 6.61777 i (0.399323 - 0.91681 i)) (18.7179 (0.399323 + 0.91681 i) + 6.61777 i (0.399323 + 0.91681 i)))

check(infixform(rect(eta)) == "0.00253708")
check(infixform(polar(eta)) == "0.00253708")
check(infixform(simplify(eta)) == "0.00253708")

-- log(0.0) caused stop, fixed in version 3.26
check(log(0.0) == log(0))

psi = (1,1) / sqrt(2)
sigmay = ((0,-i),(i,0))
check(rotate(psi,Y,0) == dot(sigmay,psi))
"Testing ceiling"

clear

check(infixform(ceiling(x)) == "ceiling(x)")
check(ceiling((x,y)) == (ceiling(x),ceiling(y)))

-- compare intrinsic

for(x,-10,10,
  d = float(ceiling(x/3)) - ceiling(float(x/3)),
  check(abs(d) < 1.0 10^(-6))
)
"Testing choose"

clear

check(choose(52,5) == 2598960)
"Testing clock"

clear

T = clock(exp(i pi/3))
check(T == (-1)^(1/3))

T = clock(exp(-i pi/3))
check(T == -(-1)^(2/3))

check(infixform(clock(x + i y)) == "(-1)^(arctan(y,x) / pi) (x^2 + y^2)^(1/2)")
"Testing complex exponentials"

clear

check(exp(-12/2 i pi) == 1)
check(exp(-11/2 i pi) == i)
check(exp(-10/2 i pi) == -1)
check(exp(-9/2 i pi) == -i)

check(exp(-8/2 i pi) == 1)
check(exp(-7/2 i pi) == i)
check(exp(-6/2 i pi) == -1)
check(exp(-5/2 i pi) == -i)

check(exp(-4/2 i pi) == 1)
check(exp(-3/2 i pi) == i)
check(exp(-2/2 i pi) == -1)
check(exp(-1/2 i pi) == -i)

check(exp(0/2 i pi) == 1)
check(exp(1/2 i pi) == i)
check(exp(2/2 i pi) == -1)
check(exp(3/2 i pi) == -i)

check(exp(4/2 i pi) == 1)
check(exp(5/2 i pi) == i)
check(exp(6/2 i pi) == -1)
check(exp(7/2 i pi) == -i)

check(exp(8/2 i pi) == 1)
check(exp(9/2 i pi) == i)
check(exp(10/2 i pi) == -1)
check(exp(11/2 i pi) == -i)

check(exp(-12/2.0 i pi) == 1)
check(exp(-11/2.0 i pi) == i)
check(exp(-10/2.0 i pi) == -1)
check(exp(-9/2.0 i pi) == -i)

check(exp(-8/2.0 i pi) == 1)
check(exp(-7/2.0 i pi) == i)
check(exp(-6/2.0 i pi) == -1)
check(exp(-5/2.0 i pi) == -i)

check(exp(-4/2.0 i pi) == 1)
check(exp(-3/2.0 i pi) == i)
check(exp(-2/2.0 i pi) == -1)
check(exp(-1/2.0 i pi) == -i)

check(exp(0/2.0 i pi) == 1)
check(exp(1/2.0 i pi) == i)
check(exp(2/2.0 i pi) == -1)
check(exp(3/2.0 i pi) == -i)

check(exp(4/2.0 i pi) == 1)
check(exp(5/2.0 i pi) == i)
check(exp(6/2.0 i pi) == -1)
check(exp(7/2.0 i pi) == -i)

check(exp(8/2.0 i pi) == 1)
check(exp(9/2.0 i pi) == i)
check(exp(10/2.0 i pi) == -1)
check(exp(11/2.0 i pi) == -i)

check(rect(exp(1/6 i pi)) == 1/2 (sqrt(3) + i))
check(rect(exp(2/6 i pi)) == 1/2 (1 + sqrt(3) i))

check(rect(exp(4/6 i pi)) == 1/2 (-1 + sqrt(3) i))
check(rect(exp(5/6 i pi)) == 1/2 (-sqrt(3) + i))

check(rect(exp(7/6 i pi)) == 1/2 (-sqrt(3) - i))
check(rect(exp(8/6 i pi)) == 1/2 (-1 - sqrt(3) i))

check(rect(exp(10/6 i pi)) == 1/2 (1 - sqrt(3) i))
check(rect(exp(11/6 i pi)) == 1/2 (sqrt(3) - i))

check(rect(exp(13/6 i pi)) == 1/2 (sqrt(3) + i))
check(rect(exp(14/6 i pi)) == 1/2 (1 + sqrt(3) i))

check(rect(exp(16/6 i pi)) == 1/2 (-1 + sqrt(3) i))
check(rect(exp(17/6 i pi)) == 1/2 (-sqrt(3) + i))

check(rect(exp(19/6 i pi)) == 1/2 (-sqrt(3) - i))
check(rect(exp(20/6 i pi)) == 1/2 (-1 - sqrt(3) i))

check(rect(exp(22/6 i pi)) == 1/2 (1 - sqrt(3) i))
check(rect(exp(23/6 i pi)) == 1/2 (sqrt(3) - i))

check(rect(exp(-1/6 i pi)) == 1/2 (sqrt(3) - i))
check(rect(exp(-2/6 i pi)) == 1/2 (1 - sqrt(3) i))

check(rect(exp(-4/6 i pi)) == 1/2 (-1 - sqrt(3) i))
check(rect(exp(-5/6 i pi)) == 1/2 (-sqrt(3) - i))

check(rect(exp(-7/6 i pi)) == 1/2 (-sqrt(3) + i))
check(rect(exp(-8/6 i pi)) == 1/2 (-1 + sqrt(3) i))

check(rect(exp(-10/6 i pi)) == 1/2 (1 + sqrt(3) i))
check(rect(exp(-11/6 i pi)) == 1/2 (sqrt(3) + i))

check(rect(exp(-13/6 i pi)) == 1/2 (sqrt(3) - i))
check(rect(exp(-14/6 i pi)) == 1/2 (1 - sqrt(3) i))

check(rect(exp(-16/6 i pi)) == 1/2 (-1 - sqrt(3) i))
check(rect(exp(-17/6 i pi)) == 1/2 (-sqrt(3) - i))

check(rect(exp(-19/6 i pi)) == 1/2 (-sqrt(3) + i))
check(rect(exp(-20/6 i pi)) == 1/2 (-1 + sqrt(3) i))

check(rect(exp(-22/6 i pi)) == 1/2 (1 + sqrt(3) i))
check(rect(exp(-23/6 i pi)) == 1/2 (sqrt(3) + i))

check(infixform(exp(0/8 i pi)) == "1")
check(infixform(exp(1/8 i pi)) == "exp(1/8 i pi)")
check(infixform(exp(2/8 i pi)) == "exp(1/4 i pi)")
check(infixform(exp(3/8 i pi)) == "exp(3/8 i pi)")

check(infixform(exp(4/8 i pi)) == "i")
check(infixform(exp(5/8 i pi)) == "i exp(1/8 i pi)")
check(infixform(exp(6/8 i pi)) == "i exp(1/4 i pi)")
check(infixform(exp(7/8 i pi)) == "i exp(3/8 i pi)")

check(infixform(exp(8/8 i pi)) == "-1")
check(infixform(exp(9/8 i pi)) == "-exp(1/8 i pi)")
check(infixform(exp(10/8 i pi)) == "-exp(1/4 i pi)")
check(infixform(exp(11/8 i pi)) == "-exp(3/8 i pi)")

check(infixform(exp(12/8 i pi)) == "-i")
check(infixform(exp(13/8 i pi)) == "-i exp(1/8 i pi)")
check(infixform(exp(14/8 i pi)) == "-i exp(1/4 i pi)")
check(infixform(exp(15/8 i pi)) == "-i exp(3/8 i pi)")

check(infixform(exp(16/8 i pi)) == "1")
check(infixform(exp(17/8 i pi)) == "exp(1/8 i pi)")
check(infixform(exp(18/8 i pi)) == "exp(1/4 i pi)")
check(infixform(exp(19/8 i pi)) == "exp(3/8 i pi)")

check(infixform(exp(20/8 i pi)) == "i")
check(infixform(exp(21/8 i pi)) == "i exp(1/8 i pi)")
check(infixform(exp(22/8 i pi)) == "i exp(1/4 i pi)")
check(infixform(exp(23/8 i pi)) == "i exp(3/8 i pi)")

check(infixform(exp(24/8 i pi)) == "-1")
check(infixform(exp(25/8 i pi)) == "-exp(1/8 i pi)")
check(infixform(exp(26/8 i pi)) == "-exp(1/4 i pi)")
check(infixform(exp(27/8 i pi)) == "-exp(3/8 i pi)")

check(infixform(exp(28/8 i pi)) == "-i")
check(infixform(exp(29/8 i pi)) == "-i exp(1/8 i pi)")
check(infixform(exp(30/8 i pi)) == "-i exp(1/4 i pi)")
check(infixform(exp(31/8 i pi)) == "-i exp(3/8 i pi)")

check(infixform(exp(-0/8 i pi)) == "1")
check(infixform(exp(-1/8 i pi)) == "-i exp(3/8 i pi)")
check(infixform(exp(-2/8 i pi)) == "-i exp(1/4 i pi)")
check(infixform(exp(-3/8 i pi)) == "-i exp(1/8 i pi)")

check(infixform(exp(-4/8 i pi)) == "-i")
check(infixform(exp(-5/8 i pi)) == "-exp(3/8 i pi)")
check(infixform(exp(-6/8 i pi)) == "-exp(1/4 i pi)")
check(infixform(exp(-7/8 i pi)) == "-exp(1/8 i pi)")

check(infixform(exp(-8/8 i pi)) == "-1")
check(infixform(exp(-9/8 i pi)) == "i exp(3/8 i pi)")
check(infixform(exp(-10/8 i pi)) == "i exp(1/4 i pi)")
check(infixform(exp(-11/8 i pi)) == "i exp(1/8 i pi)")

check(infixform(exp(-12/8 i pi)) == "i")
check(infixform(exp(-13/8 i pi)) == "exp(3/8 i pi)")
check(infixform(exp(-14/8 i pi)) == "exp(1/4 i pi)")
check(infixform(exp(-15/8 i pi)) == "exp(1/8 i pi)")

check(infixform(exp(-16/8 i pi)) == "1")
check(infixform(exp(-17/8 i pi)) == "-i exp(3/8 i pi)")
check(infixform(exp(-18/8 i pi)) == "-i exp(1/4 i pi)")
check(infixform(exp(-19/8 i pi)) == "-i exp(1/8 i pi)")

check(infixform(exp(-20/8 i pi)) == "-i")
check(infixform(exp(-21/8 i pi)) == "-exp(3/8 i pi)")
check(infixform(exp(-22/8 i pi)) == "-exp(1/4 i pi)")
check(infixform(exp(-23/8 i pi)) == "-exp(1/8 i pi)")

check(infixform(exp(-24/8 i pi)) == "-1")
check(infixform(exp(-25/8 i pi)) == "i exp(3/8 i pi)")
check(infixform(exp(-26/8 i pi)) == "i exp(1/4 i pi)")
check(infixform(exp(-27/8 i pi)) == "i exp(1/8 i pi)")

check(infixform(exp(-28/8 i pi)) == "i")
check(infixform(exp(-29/8 i pi)) == "exp(3/8 i pi)")
check(infixform(exp(-30/8 i pi)) == "exp(1/4 i pi)")
check(infixform(exp(-31/8 i pi)) == "exp(1/8 i pi)")

check(exp(0/8.0 i pi) == 1)
check(exp(1/8.0 i pi) == exp(1/8 i pi))
check(exp(2/8.0 i pi) == exp(1/4 i pi))
check(exp(3/8.0 i pi) == exp(3/8 i pi))

check(exp(4/8.0 i pi) == i)
check(exp(5/8.0 i pi) == i exp(1/8 i pi))
check(exp(6/8.0 i pi) == i exp(1/4 i pi))
check(exp(7/8.0 i pi) == i exp(3/8 i pi))

check(exp(8/8.0 i pi) == -1)
check(exp(9/8.0 i pi) == -exp(1/8 i pi))
check(exp(10/8.0 i pi) == -exp(1/4 i pi))
check(exp(11/8.0 i pi) == -exp(3/8 i pi))

check(exp(12/8.0 i pi) == -i)
check(exp(13/8.0 i pi) == -i exp(1/8 i pi))
check(exp(14/8.0 i pi) == -i exp(1/4 i pi))
check(exp(15/8.0 i pi) == -i exp(3/8 i pi))

check(exp(16/8.0 i pi) == 1)
check(exp(17/8.0 i pi) == exp(1/8 i pi))
check(exp(18/8.0 i pi) == exp(1/4 i pi))
check(exp(19/8.0 i pi) == exp(3/8 i pi))

check(exp(20/8.0 i pi) == i)
check(exp(21/8.0 i pi) == i exp(1/8 i pi))
check(exp(22/8.0 i pi) == i exp(1/4 i pi))
check(exp(23/8.0 i pi) == i exp(3/8 i pi))

check(exp(24/8.0 i pi) == -1)
check(exp(25/8.0 i pi) == -exp(1/8 i pi))
check(exp(26/8.0 i pi) == -exp(1/4 i pi))
check(exp(27/8.0 i pi) == -exp(3/8 i pi))

check(exp(28/8.0 i pi) == -i)
check(exp(29/8.0 i pi) == -i exp(1/8 i pi))
check(exp(30/8.0 i pi) == -i exp(1/4 i pi))
check(exp(31/8.0 i pi) == -i exp(3/8 i pi))

check(exp(-0/8.0 i pi) == 1)
check(exp(-1/8.0 i pi) == -i exp(3/8 i pi))
check(exp(-2/8.0 i pi) == -i exp(1/4 i pi))
check(exp(-3/8.0 i pi) == -i exp(1/8 i pi))

check(exp(-4/8.0 i pi) == -i)
check(exp(-5/8.0 i pi) == -exp(3/8 i pi))
check(exp(-6/8.0 i pi) == -exp(1/4 i pi))
check(exp(-7/8.0 i pi) == -exp(1/8 i pi))

check(exp(-8/8.0 i pi) == -1)
check(exp(-9/8.0 i pi) == i exp(3/8 i pi))
check(exp(-10/8.0 i pi) == i exp(1/4 i pi))
check(exp(-11/8.0 i pi) == i exp(1/8 i pi))

check(exp(-12/8.0 i pi) == i)
check(exp(-13/8.0 i pi) == exp(3/8 i pi))
check(exp(-14/8.0 i pi) == exp(1/4 i pi))
check(exp(-15/8.0 i pi) == exp(1/8 i pi))

check(exp(-16/8.0 i pi) == 1)
check(exp(-17/8.0 i pi) == -i exp(3/8 i pi))
check(exp(-18/8.0 i pi) == -i exp(1/4 i pi))
check(exp(-19/8.0 i pi) == -i exp(1/8 i pi))

check(exp(-20/8.0 i pi) == -i)
check(exp(-21/8.0 i pi) == -exp(3/8 i pi))
check(exp(-22/8.0 i pi) == -exp(1/4 i pi))
check(exp(-23/8.0 i pi) == -exp(1/8 i pi))

check(exp(-24/8.0 i pi) == -1)
check(exp(-25/8.0 i pi) == i exp(3/8 i pi))
check(exp(-26/8.0 i pi) == i exp(1/4 i pi))
check(exp(-27/8.0 i pi) == i exp(1/8 i pi))

check(exp(-28/8.0 i pi) == i)
check(exp(-29/8.0 i pi) == exp(3/8 i pi))
check(exp(-30/8.0 i pi) == exp(1/4 i pi))
check(exp(-31/8.0 i pi) == exp(1/8 i pi))

-- exponentials are expanded

clear
psi = exp(i k z - i omega t)
T = 1/psi
check(prefixform(T)=="(^ $e (+ (* -1 (^ -1 1/2) k z) (* (^ -1 1/2) omega t)))")
T = psi^(-1)
check(prefixform(T)=="(^ $e (+ (* -1 (^ -1 1/2) k z) (* (^ -1 1/2) omega t)))")
T = psi/psi
check(prefixform(T)=="1")
"Testing complex numbers"

clear

check(prefixform((-1)^( 0/8)) == "1")
check(prefixform((-1)^( 1/8)) == "(^ -1 1/8)")
check(prefixform((-1)^( 2/8)) == "(^ -1 1/4)")
check(prefixform((-1)^( 3/8)) == "(^ -1 3/8)")
check(prefixform((-1)^( 4/8)) == "(^ -1 1/2)")
check(prefixform((-1)^( 5/8)) == "(* -1 (^ -1 -3/8))")
check(prefixform((-1)^( 6/8)) == "(* -1 (^ -1 -1/4))")
check(prefixform((-1)^( 7/8)) == "(* -1 (^ -1 -1/8))")
check(prefixform((-1)^( 8/8)) == "-1")
check(prefixform((-1)^( 9/8)) == "(* -1 (^ -1 1/8))")
check(prefixform((-1)^(10/8)) == "(* -1 (^ -1 1/4))")
check(prefixform((-1)^(11/8)) == "(* -1 (^ -1 3/8))")
check(prefixform((-1)^(12/8)) == "(* -1 (^ -1 1/2))")
check(prefixform((-1)^(13/8)) == "(^ -1 -3/8)")
check(prefixform((-1)^(14/8)) == "(^ -1 -1/4)")
check(prefixform((-1)^(15/8)) == "(^ -1 -1/8)")
check(prefixform((-1)^(16/8)) == "1")
check(prefixform((-1)^(17/8)) == "(^ -1 1/8)")
check(prefixform((-1)^(18/8)) == "(^ -1 1/4)")
check(prefixform((-1)^(19/8)) == "(^ -1 3/8)")
check(prefixform((-1)^(20/8)) == "(^ -1 1/2)")
check(prefixform((-1)^(21/8)) == "(* -1 (^ -1 -3/8))")
check(prefixform((-1)^(22/8)) == "(* -1 (^ -1 -1/4))")
check(prefixform((-1)^(23/8)) == "(* -1 (^ -1 -1/8))")
check(prefixform((-1)^(24/8)) == "-1")
check(prefixform((-1)^(25/8)) == "(* -1 (^ -1 1/8))")
check(prefixform((-1)^(26/8)) == "(* -1 (^ -1 1/4))")
check(prefixform((-1)^(27/8)) == "(* -1 (^ -1 3/8))")
check(prefixform((-1)^(28/8)) == "(* -1 (^ -1 1/2))")
check(prefixform((-1)^(29/8)) == "(^ -1 -3/8)")
check(prefixform((-1)^(30/8)) == "(^ -1 -1/4)")
check(prefixform((-1)^(31/8)) == "(^ -1 -1/8)")
check(prefixform((-1)^(32/8)) == "1")

check(prefixform((-1)^(- 0/8)) == "1")
check(prefixform((-1)^(- 1/8)) == "(^ -1 -1/8)")
check(prefixform((-1)^(- 2/8)) == "(^ -1 -1/4)")
check(prefixform((-1)^(- 3/8)) == "(^ -1 -3/8)")
check(prefixform((-1)^(- 4/8)) == "(* -1 (^ -1 1/2))")
check(prefixform((-1)^(- 5/8)) == "(* -1 (^ -1 3/8))")
check(prefixform((-1)^(- 6/8)) == "(* -1 (^ -1 1/4))")
check(prefixform((-1)^(- 7/8)) == "(* -1 (^ -1 1/8))")
check(prefixform((-1)^(- 8/8)) == "-1")
check(prefixform((-1)^(- 9/8)) == "(* -1 (^ -1 -1/8))")
check(prefixform((-1)^(-10/8)) == "(* -1 (^ -1 -1/4))")
check(prefixform((-1)^(-11/8)) == "(* -1 (^ -1 -3/8))")
check(prefixform((-1)^(-12/8)) == "(^ -1 1/2)")
check(prefixform((-1)^(-13/8)) == "(^ -1 3/8)")
check(prefixform((-1)^(-14/8)) == "(^ -1 1/4)")
check(prefixform((-1)^(-15/8)) == "(^ -1 1/8)")
check(prefixform((-1)^(-16/8)) == "1")
check(prefixform((-1)^(-17/8)) == "(^ -1 -1/8)")
check(prefixform((-1)^(-18/8)) == "(^ -1 -1/4)")
check(prefixform((-1)^(-19/8)) == "(^ -1 -3/8)")
check(prefixform((-1)^(-20/8)) == "(* -1 (^ -1 1/2))")
check(prefixform((-1)^(-21/8)) == "(* -1 (^ -1 3/8))")
check(prefixform((-1)^(-22/8)) == "(* -1 (^ -1 1/4))")
check(prefixform((-1)^(-23/8)) == "(* -1 (^ -1 1/8))")
check(prefixform((-1)^(-24/8)) == "-1")
check(prefixform((-1)^(-25/8)) == "(* -1 (^ -1 -1/8))")
check(prefixform((-1)^(-26/8)) == "(* -1 (^ -1 -1/4))")
check(prefixform((-1)^(-27/8)) == "(* -1 (^ -1 -3/8))")
check(prefixform((-1)^(-28/8)) == "(^ -1 1/2)")
check(prefixform((-1)^(-29/8)) == "(^ -1 3/8)")
check(prefixform((-1)^(-30/8)) == "(^ -1 1/4)")
check(prefixform((-1)^(-31/8)) == "(^ -1 1/8)")
check(prefixform((-1)^(-32/8)) == "1")

z1 = 1+i     -- z1 does not have arctan in polar form
z2 = 2+3*i   -- z2 does have arctan in polar form

check(arg(z1)=pi/4)
check(mag(z1)=sqrt(2))

check(arg(z2)=arctan(3,2))
check(mag(z2)=sqrt(13))

check(arg(polar(z1))=pi/4)
check(arg(clock(z1))=pi/4)

check(arg(polar(z2))=arctan(3,2))
check(arg(clock(z2))=arctan(3,2))

check(mag(polar(z1))=sqrt(2))
check(mag(clock(z1))=sqrt(2))

check(mag(polar(z2))=sqrt(13))
check(mag(clock(z2))=sqrt(13))

check(z1*z2=rect(clock(z1)*clock(z2)))
check(z1*z2=rect(clock(z1)*polar(z2)))
check(z1*z2=rect(polar(z1)*clock(z2)))
check(z1*z2=rect(polar(z1)*polar(z2)))

z = sqrt(1+i)
check(rect(z^2)=1+i)
z = sqrt(1-i)
check(rect(z^2)=1-i)
z = sqrt(-1+i)
check(rect(z^2)=-1+i)
z = sqrt(-1-i)
check(rect(z^2)=-1-i)

z = sqrt(2+3*i)
check(rect(z^2)=2+3*i)
z = sqrt(2-3*i)
check(rect(z^2)=2-3*i)
z = sqrt(-2+3*i)
check(rect(z^2)=-2+3*i)
z = sqrt(-2-3*i)
check(rect(z^2)=-2-3*i)

z1 = sqrt(2+3*i)
z2 = sqrt(4+5*i)
check(sqrt(z1*z2)=sqrt(z1)*sqrt(z2))
check(sqrt(z1/z2)=sqrt(z1)/sqrt(z2))

z1 = 1+i     -- z1 does not have arctan
z2 = 2+3*i   -- z2 does have arctan
check(z1*z2=rect(clock(z1)*clock(z2)))
check(z1*z2=rect(polar(z1)*polar(z2)))

check(arg(z1)=pi/4)
check(arg(polar(z1))=pi/4)
check(arg(clock(z1))=pi/4)

check(arg(z2)=arctan(3,2))
check(arg(polar(z2))=arctan(3,2))
check(arg(clock(z2))=arctan(3,2))

check(mag(z1)=sqrt(2))
check(mag(polar(z1))=sqrt(2))
check(mag(clock(z1))=sqrt(2))

check(mag(z2)=sqrt(13))
check(mag(polar(z2))=sqrt(13))
check(mag(clock(z2))=sqrt(13))

T = clock(2+3*i) - clock(2+3*i)
check(T=0)

T = mag(1.0 + 3 i)
check(infixform(T)="3.16228")
T = real(1.0 + 3 i)
check(infixform(T)="1")
T = imag(1.0 i)
check(infixform(T)="1")
T = imag(-1.0 i)
check(infixform(T)="-1")

clear

T = (2+3*i)^c
check(infixform(T)="(2 + 3 i)^c")

T = (1+i)^2
check(prefixform(T)="(* 2 (^ -1 1/2))")

T = (2*i)^2
check(T=-4)

T = (2+3*i)^2
check(prefixform(T)="(+ -5 (* 12 (^ -1 1/2)))")

T = (2+3*i)^(-2)
check(prefixform(T)"(+ -5/169 (* -12/169 (^ -1 1/2)))")

T = (2+3*i)^(1/2)
check(infixform(T)="13^(1/4) (-1)^(arctan(3,2) / (2 pi))")

T = (2+3*i)^(-1/2)
check(infixform(T)="(-1)^(-arctan(3,2) / (2 pi)) / 13^(1/4)")

T = i^0
check(T=1)

T = i^1
check(prefixform(T)="(^ -1 1/2)")

T = i^2
check(T=-1)

T = i^3
check(prefixform(T)="(* -1 (^ -1 1/2))")

T = i^4
check(T=1)

T = i^5
check(prefixform(T)="(^ -1 1/2)")

T = i^6
check(T=-1)

T = i^7
check(prefixform(T)="(* -1 (^ -1 1/2))")

T = i^(-1)
check(prefixform(T)="(* -1 (^ -1 1/2))")

T = i^(-2)
check(T=-1)

T = i^(-3)
check(prefixform(T)="(^ -1 1/2)")

T = i^(-4)
check(T=1)

T = i^(-5)
check(prefixform(T)="(* -1 (^ -1 1/2))")

T = i^(-6)
check(T=-1)

T = i^(-7)
check(prefixform(T)="(^ -1 1/2)")
"Testing conj"

clear

z = sqrt(i)
A = z conj(z)
check(A == 1)

z = (-1)^a
A = z conj(z)
check(A == 1)
"Testing cos"

clear

check(cos(-x) == cos(x))
check(cos(arctan(y,x)) == x (x^2 + y^2)^(-1/2))
check(cos(arcsin(x)) == sqrt(1 - x^2))
check(cos((x,y)) == (cos(x),cos(y)))

-- special angles

check(cos(90/360 2 pi) == 0)
check(cos(270/360 2 pi) == 0)

check(cos(60/360 2 pi) == 1/2)
check(cos(300/360 2 pi) == 1/2)

check(cos(120/360 2 pi) == -1/2)
check(cos(240/360 2 pi) == -1/2)

check(cos(45/360 2 pi) == 1/2 sqrt(2))
check(cos(315/360 2 pi) == 1/2 sqrt(2))

check(cos(135/360 2 pi) == -1/2 sqrt(2))
check(cos(225/360 2 pi) == -1/2 sqrt(2))

check(cos(30/360 2 pi) == 1/2 sqrt(3))
check(cos(330/360 2 pi) == 1/2 sqrt(3))

check(cos(150/360 2 pi) == -1/2 sqrt(3))
check(cos(210/360 2 pi) == -1/2 sqrt(3))

check(cos(0/360 2 pi) == 1)
check(cos(180/360 2 pi) == -1)

-- negative

check(cos(-90/360 2 pi) == 0)
check(cos(-270/360 2 pi) == 0)

check(cos(-60/360 2 pi) == 1/2)
check(cos(-300/360 2 pi) == 1/2)

check(cos(-120/360 2 pi) == -1/2)
check(cos(-240/360 2 pi) == -1/2)

check(cos(-45/360 2 pi) == 1/2 sqrt(2))
check(cos(-315/360 2 pi) == 1/2 sqrt(2))

check(cos(-135/360 2 pi) == -1/2 sqrt(2))
check(cos(-225/360 2 pi) == -1/2 sqrt(2))

check(cos(-30/360 2 pi) == 1/2 sqrt(3))
check(cos(-330/360 2 pi) == 1/2 sqrt(3))

check(cos(-150/360 2 pi) == -1/2 sqrt(3))
check(cos(-210/360 2 pi) == -1/2 sqrt(3))

check(cos(-0/360 2 pi) == 1)
check(cos(-180/360 2 pi) == -1)

-- compare intrinsic

for(x,-720,720,
  d = float(cos(2 pi x / 360)) - cos(float(2 pi x / 360)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  w = 1/2 exp(i z) + 1/2 exp(-i z),
  check(abs(cos(z) - w) < 1.0 10^(-6))
))

-- implicit float pi

for(x,-1,1,
  a = infixform(cos(x pi / 3.0)),
  b = infixform(cos(x float(pi) / 3.0)),
  check(a == b)
)
"Testing cosh"

clear

check(cosh(0) == 1)
check(cosh(-x) == cosh(x))
check(cosh(arccosh(x)) == x)
check(cosh((x,y)) == (cosh(x),cosh(y)))

-- compare intrinsic

for(x,-12,12,
  d = float(cosh(x/12)) - cosh(float(x/12)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  w = 1/2 exp(z) + 1/2 exp(-z),
  check(abs(cosh(z) - w) < 1.0 10^(-6))
))
"Testing defint"

clear

T = defint(x^2,y,0,sqrt(1-x^2),x,-1,1)
check(T = 1/8*pi)

f = (4 x^2 + 5)^(1/2)
T = defint(f,x,0,1,y,0,1) -- uses integral #138
check(T = 3/2 + 5/8 log(5))

f = (u^2 + 1)^(1/2)
T = defint(f,u,0,1,v,0,3pi)
check(T = 3/2*pi*log(1+2^(1/2))+3*pi/(2^(1/2)))

f = -2 x^4 y^2 + x^4 y - 4 x^3 y - 2 x^2 y^4 + 2 x^2 y^3 + 2 x^2 y^2 - 2 x^2 y + y^5 - 2 y^3 + y
T = defint(f,y,-sqrt(1-x^2),sqrt(1-x^2),x,-1,1)
check(T == 1/48 pi)

f = 3 r^3 cos(theta)^2 + 3 r^3 sin(theta)^2
T = defint(f,r,0,1,theta,0,2pi)
check(T == 3/2 pi)

-- verify that defint works in a denominator

clear

I(y) = defint((1 + cos(theta)^2) sin(theta),theta,0,y)
A = I(theta) / I(pi)
check(A = -1/8 cos(theta)^3 - 3/8 cos(theta) + 1/2)
"Testing denominator"

clear

T = denominator(2/3)
check(T = 3) 
T = denominator(x)
check(T = 1) 
T = denominator(1/x)
check(T = x) 
T = denominator(a+b)
check(T = 1) 
T = denominator(1/a+1/b)
check(T = a*b) 
T = denominator(1/(x-1)/(x-2))
check(T = x^2-3*x+2)

check(denominator((a/b,c)) == (b,1))
"Testing derivative"

clear

T = d(a,x)
check(T = 0)
T = d(x,x)
check(T = 1)
T = d(x^2,x)
check(T = 2*x)
T = d(log(x),x)
check(T = 1/x)
T = d(exp(x),x)
check(T = exp(x))
T = d(a^x,x)
check(T = a^x*log(a))
T = d(x^x,x)-(x^x+x^x*log(x))
check(T = 0)
T = d(log(x^2+5),x)-(2*x/(5+x^2))
check(T = 0)
T = d(d(f(x),x),y)
check(T = 0)
T = d(d(f(x),y),x)
check(T = 0)
T = d(d(f(y),x),y)
check(T = 0)
T = d(d(f(y),y),x)
check(T = 0)
x=quote(x)
y=quote(y)
z=quote(z)
T = d((x*y*z,y,x+z),(x,y,z))
check(T = ((y*z,x*z,x*y),(0,1,0),(1,0,1)))
T = d(x+z,(x,y,z))
check(T = (1,0,1))
T = d(f())
check(T = d(f(),x))
T = d(x^2)
check(T = 2*x)
T = d(t^2 x^2)
check(T = 2*t^2*x)
T = d(sin(x),x)-cos(x)
check(T = 0)
T = d(cos(x),x)+sin(x)
check(T = 0)
T = d(tan(x),x)-cos(x)^(-2)
check(T = 0)
T = d(arcsin(x),x)-1/sqrt(1-x^2)
check(T = 0)
T = d(arccos(x),x)+1/sqrt(1-x^2)
check(T = 0)
T = d(arctan(x),x)-1/(1+x^2)
check(T = 0)
T = d(arctan(y/x),x)
check(T = -y/(x^2+y^2))
T = d(arctan(y/x),y)
check(T = x/(x^2+y^2))
T = d(arctan(y,x),x)
check(T = -y / (x^2 + y^2))
T = d(arctan(y,x),y)
check(T = x / (x^2 + y^2))
check(infixform(d(arctan(x,0),x))=="d(arctan(x,0),x)")
check(infixform(d(arctan(0,x),x))=="d(arctan(0,x),x)")
check(d(arctan(y,x),z)==0)
T = d(sinh(x),x)-cosh(x)
check(T = 0)
T = d(cosh(x),x)-sinh(x)
check(T = 0)
T = d(tanh(x),x)-cosh(x)^(-2)
check(T = 0)
T = d(arcsinh(x),x)-1/sqrt(x^2+1)
check(T = 0)
T = d(arccosh(x),x)-1/sqrt(x^2-1)
check(T = 0)
T = d(arctanh(x),x)-1/(1-x^2)
check(T = 0)
T = d(sin(cos(x)),x)+cos(cos(x))*sin(x)
check(T = 0)
T = d(sin(x)^2,x)-2*sin(x)*cos(x)
check(T = 0)
T = d(f(),x)
check(T = d(f(),x))
T = d(f(x),x)
check(T = d(f(x),x))
T = d(f(y),x)
check(T = 0)
T = d(g(f(x)),x)
check(T = d(g(f(x)),x))
T = d(erf(x))-2*exp(-x^2)/sqrt(pi)
check(T = 0)

f=x^5*y^7

T = d(f)
check(T = 5*x^4*y^7)
T = d(f,x)
check(T = 5*x^4*y^7)
T = d(f,x,0)
check(T = x^5*y^7)
T = d(f,x,1)
check(T = 5*x^4*y^7)
T = d(f,x,2)
check(T = 20*x^3*y^7)
T = d(f,2)
check(T = 20*x^3*y^7)
T = d(f,2,y)
check(T = 140*x^3*y^6)
T = d(f,x,x,y,y)
check(T = 840*x^3*y^5)

clear

-- derivative of derivative

check(infixform(d(f(x),x,x)) == "d(d(f(x),x),x)")
check(infixform(d(f(x),x,y)) == "0")
check(infixform(d(f(x),y,x)) == "0")
check(infixform(d(f(x),y,y)) == "0")

-- derivative of integral

check(infixform(d(integral(f(x),x),x)) == "f(x)")
check(infixform(d(integral(f(x),x),y)) == "0")
check(infixform(d(integral(f(x),y),x)) == "y d(f(x),x)")

check(infixform(d(integral(f(x,y),x),y)) == "integral(d(f(x,y),y),x)")
check(infixform(d(integral(f(x,y),y),x)) == "integral(d(f(x,y),x),y)")

check(infixform(d(integral(f(x,y),x,y),x)) == "integral(f(x,y),y)")
check(infixform(d(integral(f(x,y),x,y),y)) == "integral(f(x,y),x)")

check(infixform(d(integral(f(x,y),y,x),x)) == "integral(f(x,y),y)")
check(infixform(d(integral(f(x,y),y,x),y)) == "integral(f(x,y),x)")

check(infixform(d(integral(f(x,y),x),x,y)) == "d(f(x,y),y)")
check(infixform(d(integral(f(x,y),x),y,x)) == "d(f(x,y),y)")

-- derivative of function of function

check(infixform(d(f(g()),x)) == "d(f(g()),x)")
check(infixform(d(f(g(x)),x)) == "d(f(g(x)),x)")
check(infixform(d(f(g(y)),x)) == "0")
"Testing det"

clear
A = ((A11,A12),(A21,A22))
B = A11 A22 - A12 A21
check(det(A) == B)
A = ((A11,A12,A13),(A21,A22,A23),(A31,A32,A33))
B = A11 A22 A33 - A11 A23 A32 - A12 A21 A33 + A12 A23 A31 + A13 A21 A32 - A13 A22 A31
check(det(A) == B)
A = ((A11,A12,A13,A14),(A21,A22,A23,A24),(A31,A32,A33,A34),(A41,A42,A43,A44))
B = A11 A22 A33 A44 -
    A11 A22 A34 A43 -
    A11 A23 A32 A44 +
    A11 A23 A34 A42 +
    A11 A24 A32 A43 -
    A11 A24 A33 A42 -
    A12 A21 A33 A44 +
    A12 A21 A34 A43 +
    A12 A23 A31 A44 -
    A12 A23 A34 A41 -
    A12 A24 A31 A43 +
    A12 A24 A33 A41 +
    A13 A21 A32 A44 -
    A13 A21 A34 A42 -
    A13 A22 A31 A44 +
    A13 A22 A34 A41 +
    A13 A24 A31 A42 -
    A13 A24 A32 A41 -
    A14 A21 A32 A43 +
    A14 A21 A33 A42 +
    A14 A22 A31 A43 -
    A14 A22 A33 A41 -
    A14 A23 A31 A42 +
    A14 A23 A32 A41
check(det(A) == B)
A = ((A11,A12,A13,A14,A15),
     (A21,A22,A23,A24,A25),
     (A31,A32,A33,A34,A35),
     (A41,A42,A43,A44,A45),
     (A51,A52,A53,A54,A55))
B = A11 A22 A33 A44 A55 - A11 A22 A33 A45 A54 - A11 A22 A34 A43 A55 + A11 A22 A34 A45 A53 + A11 A22 A35 A43 A54 -
    A11 A22 A35 A44 A53 - A11 A23 A32 A44 A55 + A11 A23 A32 A45 A54 + A11 A23 A34 A42 A55 - A11 A23 A34 A45 A52 -
    A11 A23 A35 A42 A54 + A11 A23 A35 A44 A52 + A11 A24 A32 A43 A55 - A11 A24 A32 A45 A53 - A11 A24 A33 A42 A55 +
    A11 A24 A33 A45 A52 + A11 A24 A35 A42 A53 - A11 A24 A35 A43 A52 - A11 A25 A32 A43 A54 + A11 A25 A32 A44 A53 +
    A11 A25 A33 A42 A54 - A11 A25 A33 A44 A52 - A11 A25 A34 A42 A53 + A11 A25 A34 A43 A52 - A12 A21 A33 A44 A55 +
    A12 A21 A33 A45 A54 + A12 A21 A34 A43 A55 - A12 A21 A34 A45 A53 - A12 A21 A35 A43 A54 + A12 A21 A35 A44 A53 +
    A12 A23 A31 A44 A55 - A12 A23 A31 A45 A54 - A12 A23 A34 A41 A55 + A12 A23 A34 A45 A51 + A12 A23 A35 A41 A54 -
    A12 A23 A35 A44 A51 - A12 A24 A31 A43 A55 + A12 A24 A31 A45 A53 + A12 A24 A33 A41 A55 - A12 A24 A33 A45 A51 -
    A12 A24 A35 A41 A53 + A12 A24 A35 A43 A51 + A12 A25 A31 A43 A54 - A12 A25 A31 A44 A53 - A12 A25 A33 A41 A54 +
    A12 A25 A33 A44 A51 + A12 A25 A34 A41 A53 - A12 A25 A34 A43 A51 + A13 A21 A32 A44 A55 - A13 A21 A32 A45 A54 -
    A13 A21 A34 A42 A55 + A13 A21 A34 A45 A52 + A13 A21 A35 A42 A54 - A13 A21 A35 A44 A52 - A13 A22 A31 A44 A55 +
    A13 A22 A31 A45 A54 + A13 A22 A34 A41 A55 - A13 A22 A34 A45 A51 - A13 A22 A35 A41 A54 + A13 A22 A35 A44 A51 +
    A13 A24 A31 A42 A55 - A13 A24 A31 A45 A52 - A13 A24 A32 A41 A55 + A13 A24 A32 A45 A51 + A13 A24 A35 A41 A52 -
    A13 A24 A35 A42 A51 - A13 A25 A31 A42 A54 + A13 A25 A31 A44 A52 + A13 A25 A32 A41 A54 - A13 A25 A32 A44 A51 -
    A13 A25 A34 A41 A52 + A13 A25 A34 A42 A51 - A14 A21 A32 A43 A55 + A14 A21 A32 A45 A53 + A14 A21 A33 A42 A55 -
    A14 A21 A33 A45 A52 - A14 A21 A35 A42 A53 + A14 A21 A35 A43 A52 + A14 A22 A31 A43 A55 - A14 A22 A31 A45 A53 -
    A14 A22 A33 A41 A55 + A14 A22 A33 A45 A51 + A14 A22 A35 A41 A53 - A14 A22 A35 A43 A51 - A14 A23 A31 A42 A55 +
    A14 A23 A31 A45 A52 + A14 A23 A32 A41 A55 - A14 A23 A32 A45 A51 - A14 A23 A35 A41 A52 + A14 A23 A35 A42 A51 +
    A14 A25 A31 A42 A53 - A14 A25 A31 A43 A52 - A14 A25 A32 A41 A53 + A14 A25 A32 A43 A51 + A14 A25 A33 A41 A52 -
    A14 A25 A33 A42 A51 + A15 A21 A32 A43 A54 - A15 A21 A32 A44 A53 - A15 A21 A33 A42 A54 + A15 A21 A33 A44 A52 +
    A15 A21 A34 A42 A53 - A15 A21 A34 A43 A52 - A15 A22 A31 A43 A54 + A15 A22 A31 A44 A53 + A15 A22 A33 A41 A54 -
    A15 A22 A33 A44 A51 - A15 A22 A34 A41 A53 + A15 A22 A34 A43 A51 + A15 A23 A31 A42 A54 - A15 A23 A31 A44 A52 -
    A15 A23 A32 A41 A54 + A15 A23 A32 A44 A51 + A15 A23 A34 A41 A52 - A15 A23 A34 A42 A51 - A15 A24 A31 A42 A53 +
    A15 A24 A31 A43 A52 + A15 A24 A32 A41 A53 - A15 A24 A32 A43 A51 - A15 A24 A33 A41 A52 + A15 A24 A33 A42 A51
check(det(A) == B)
"Testing dim" 

clear
A = ((1,2,3),(4,5,6))
check(dim(A,1) == 2)
check(dim(A,2) == 3)
check(dim(A) == 2)
check(dim(x) == 1)
"Testing eigenvec"

clear

A = ((1,2,3),(2,6,4),(3,4,5))
Q = eigenvec(A)
D = dot(transpose(Q),A,Q)
B = dot(Q,D,transpose(Q))
check(infixform(B) == "((1,2,3),(2,6,4),(3,4,5))")

A = ((1,0,0,0),(0,-1,2,0),(0,2,-1,0),(0,0,0,1))
Q = eigenvec(A)
check(infixform(Q) == "((1,0,0,0),(0,0.707107,-0.707107,0),(0,0.707107,0.707107,0),(0,0,0,1))")
D = dot(transpose(Q),A,Q)
B = dot(Q,D,transpose(Q))
check(infixform(B) == "((1,0,0,0),(0,-1,2,0),(0,2,-1,0),(0,0,0,1))")
"Testing erf"
clear
check(erf(-x) == -erf(x))
check(erf((x,y)) == (erf(x),erf(y)))
check(erf(0) == 0)
check(erf(0.0) == 0)
check(erf(1000.0) == 1)
check(erf(-1000.0) == -1)
check(infixform(erf(1.0)) == "0.842701")
check(d(erf(x),x) == 2 exp(-x^2) / sqrt(pi))
"Testing erfc"
clear
check(erfc(x) == 1 - erf(x))
check(erfc(-x) == 1 + erf(x))
check(erfc((x,y)) == (erfc(x),erfc(y)))
check(erfc(0) == 1)
check(erfc(0.0) == 1)
check(erfc(1000.0) == 0)
check(erfc(-1000.0) == 2)
check(infixform(erfc(1.0)) == "0.157299")
check(d(erfc(x),x) == -2 exp(-x^2) / sqrt(pi))
"Testing eval"

clear

check(eval(a b c d, b d, 2) == 2 a c)
check(eval(a b c d + e, b d, 2) == 2 a c + e)
check(eval(a + b + c + d, b + d, 2) == a + c + 2)

f = sqrt(1 - cos(theta)^2)
check(eval(f,sqrt(1 - cos(theta)^2),sin(theta)) == sin(theta))
f = exp(a+b+c)
check(eval(f,exp(a),d) == d exp(b+c))
check(eval(f,exp(b),d) == d exp(a+c))
check(eval(f,exp(c),d) == d exp(a+b))
check(eval(f,exp(a+b),d) == d exp(c))
check(eval(f,exp(a+c),d) == d exp(b))
check(eval(f,exp(b+c),d) == d exp(a))
check(eval(f,exp(a+b+c),d) == d)
f = a exp(b+c)
check(eval(f,a,d) == d exp(b+c))
check(eval(f,exp(b+c),d) == a d)
check(eval(f,exp(b),d) == a d exp(c))
check(eval(f,exp(c),d) == a d exp(b))
check(eval(f,a exp(b),d) == d exp(c))
check(eval(f,a exp(c),d) == d exp(b))
check(eval(f,a exp(b+c),d) == d)

phi1 = r1(x) exp(i theta1(x)) -- note that conj(phi1) phi1 == r1(x)^2
phi2 = r2(x) exp(i theta2(x)) -- note that conj(phi2) phi2 == r2(x)^2
psi = 1/2 (phi1 + phi2) exp(-i E1 t / hbar) +
      1/2 (phi1 - phi2) exp(-i E2 t / hbar)
A(f) = eval(f, phi1, a1 phi1, phi2, a2 phi2) -- eigenvalues
f = conj(psi) A(psi)
Abar = eval(f, r1(x)^2, 1, r2(x)^2, 1, r1(x) r2(x), 0) -- integral
check(Abar == (a1 + a2) / 2 + (a1 - a2) / 2 cos((E1 - E2) t / hbar))
"Testing exp"

clear

check(exp((x,y)) == (exp(x),exp(y)))

T = prefixform(float(exp(x)))
check(T="(^ $e x)")

T = prefixform(exp(0))
check(T="1")

T = prefixform(exp(1))
check(T="$e")

T = prefixform(exp(1.0))
check(T="2.71828")

T = prefixform(exp(1.0))
check(T="2.71828")

T = prefixform(exp(2.0))
check(T="7.38906")

T = prefixform(exp(2.0))
check(T="7.38906")

T = prefixform(float(exp(1)))
check(T="2.71828")
"Testing expcos"

clear

check(expcos(x) == 1/2*exp(-i*x)+1/2*exp(i*x))
"Testing expform"

clear

T = expform(cos(x))
check(T = 1/2*exp(-i*x)+1/2*exp(i*x))
T = expform(sin(x))
check(T = 1/2*i*exp(-i*x)-1/2*i*exp(i*x))
T = expform(tan(x))
check(T = i / (exp(2 i x) + 1) - i exp(2 i x) / (exp(2 i x) + 1))
T = expform(cosh(x))
check(T = 1/2*exp(x)+1/2*exp(-x))
T = expform(sinh(x))
check(T = 1/2*exp(x)-1/2*exp(-x))
T = expform(tanh(x))
check(T = -1/(1+exp(2*x))+exp(2*x)/(1+exp(2*x)))
T = expform((cos(x),sin(x)))
check(T = (1/2*exp(-i*x)+1/2*exp(i*x),1/2*i*exp(-i*x)-1/2*i*exp(i*x)))
T = expform(cos(x)*sin(x))-expcos(x)*expsin(x)
check(T = 0)

T = expform(d(arctan(y/x),y))
check(T = x/(x^2+y^2))
T = expform(d(arctan(y/x),x))
check(T = -y/(x^2+y^2))
T = expform(1-sin(x)^2)
check(T = expform(cos(x)^2))
T = expform(1-cos(x)^2)
check(T = expform(sin(x)^2))
T = expform(sin(x)^2-1)
check(T = expform(-cos(x)^2))
T = expform(cos(x)^2-1)
check(T = expform(-sin(x)^2))

T = expform(1 / (2 cos(theta)))
check(infixform(T) == "1 / (exp(i theta) + exp(-i theta))")

T = expform((sin(theta),0)) -- vector
check(infixform(T) == "(-1/2 i exp(i theta) + 1/2 i exp(-i theta),0)")
"Testing expsin"

clear

check(expsin(x) == 1/2*i*exp(-i*x)-1/2*i*exp(i*x))
"Testing exptan"

clear

check(exptan(z)==(exp(2*i*z)-1)/(i*(exp(2*i*z)+1)))
check(expsin(z)/expcos(z)==exptan(z))
"Testing fdist"
clear
-- R: pf
check(infixform(fdist(-1,3,2)) == "0")
check(infixform(fdist(0.1,3,2)) == "0.0471075")
check(infixform(fdist(1,3,2)) == "0.464758")
check(infixform(fdist(2,3,2)) == "0.649519")
check(infixform(fdist(3,3,2)) == "0.740073")
check(infixform(fdist(4,3,2)) == "0.79356")

"Testing float"

clear

T = float(x + pi)
check(infixform(T)="x + 3.14159")
T = float(x + exp(1))
check(infixform(T)="x + 2.71828")
T = float(x + y + 1/4)
check(infixform(T)="x + y + 0.25")
T = float(1/4 x y)
check(infixform(T)="0.25 x y")
T = float(sqrt(2))
check(infixform(T)="1.41421")
"Testing floor"

clear

check(infixform(floor(x)) == "floor(x)")
check(floor((x,y)) == (floor(x),floor(y)))

-- compare intrinsic

for(x,-10,10,
  d = float(floor(x/3)) - floor(float(x/3)),
  check(abs(d) < 1.0 10^(-6))
)
"Testing for"

clear

k = 123
A = zero(3)
f(x) = for(k,1,3,A[k] = x)
f(1)
check(A == (1,1,1))
check(k == 123)

clear

x = 0
y = 2
for(k,1,9, x = sqrt(x + 2), y = 2 y / x)
check(infixform(float(y)) == "3.14159")

t = 0
A = 2 k
for(k,1,3, t = t + A)
check(t == 12)

k = 0
for(j, 1, 10, k = k + 1, test(k == 3, break))
check(k == 3)
"Testing hadamard"

clear
X = (a,b,c)
check(hadamard(X,X) == (a^2,b^2,c^2))
A = (A1,A2)
B = (B1,B2)
check(A B == (A1 B1, A2 B2))
check(0 A B == (0,0))
"Testing hermite"

clear

T=hermite(x,0)-1
check(T=0)
T=hermite(x,1)-2*x
check(T=0)
T=hermite(x,2)-(4*x^2-2)
check(T=0)
T=hermite(x,3)-(8*x^3-12*x)
check(T=0)
T=hermite(x,4)-(16*x^4-48*x^2+12)
check(T=0)
T=hermite(x,5)-(32*x^5-160*x^3+120*x)
check(T=0)
T=hermite(x,6)-(64*x^6-480*x^4+720*x^2-120)
check(T=0)
T=hermite(x,7)-(128*x^7-1344*x^5+3360*x^3-1680*x)
check(T=0)
T=hermite(x,8)-(256*x^8-3584*x^6+13440*x^4-13440*x^2+1680)
check(T=0)
T=hermite(x,9)-(512*x^9-9216*x^7+48384*x^5-80640*x^3+30240*x)
check(T=0)
T=hermite(x,10)-(1024*x^10-23040*x^8+161280*x^6-403200*x^4+302400*x^2-30240)
check(T=0)
"Testing imag"

clear

T=imag(a+i*b)
check(T=b)
T=imag(1+exp(i*pi/3))
check(T=1/2*3^(1/2))
T=imag(i)
check(T=1)
T=imag(-i)
check(T=-1)
"Testing imaginary unit"

clear

T = (-1)^(1/2)
check(infixform(T)="i")
T = (-1)^(3/2)
check(infixform(T)="-i")
T = (-1)^(5/2)
check(infixform(T)="i")
T = (-1)^(7/2)
check(infixform(T)="-i")

T = (-1)^(9/2)
check(infixform(T)="i")
T = (-1)^(11/2)
check(infixform(T)="-i")
T = (-1)^(13/2)
check(infixform(T)="i")
T = (-1)^(15/2)
check(infixform(T)="-i")

T = (-1)^(-1/2)
check(infixform(T)="-i")
T = (-1)^(-3/2)
check(infixform(T)="i")
T = (-1)^(-5/2)
check(infixform(T)="-i")
T = (-1)^(-7/2)
check(infixform(T)="i")

T = (-1)^(-9/2)
check(infixform(T)="-i")
T = (-1)^(-11/2)
check(infixform(T)="i")
T = (-1)^(-13/2)
check(infixform(T)="-i")
T = (-1)^(-15/2)
check(infixform(T)="i")

T = (-1)^(1/8)
check(prefixform(T)="(^ -1 1/8)")
T = (-1)^(3/8)
check(prefixform(T)="(^ -1 3/8)")
T = (-1)^(5/8)
check(prefixform(T)="(* -1 (^ -1 -3/8))")
T = (-1)^(7/8)
check(prefixform(T)="(* -1 (^ -1 -1/8))")
T = (-1)^(9/8)
check(prefixform(T)="(* -1 (^ -1 1/8))")
T = (-1)^(11/8)
check(prefixform(T)="(* -1 (^ -1 3/8))")
T = (-1)^(13/8)
check(prefixform(T)="(^ -1 -3/8)")
T = (-1)^(15/8)
check(prefixform(T)="(^ -1 -1/8)")

T = (-1)^(17/8)
check(prefixform(T)="(^ -1 1/8)")
T = (-1)^(19/8)
check(prefixform(T)="(^ -1 3/8)")
T = (-1)^(21/8)
check(prefixform(T)="(* -1 (^ -1 -3/8))")
T = (-1)^(23/8)
check(prefixform(T)="(* -1 (^ -1 -1/8))")
T = (-1)^(25/8)
check(prefixform(T)="(* -1 (^ -1 1/8))")
T = (-1)^(27/8)
check(prefixform(T)="(* -1 (^ -1 3/8))")
T = (-1)^(29/8)
check(prefixform(T)="(^ -1 -3/8)")
T = (-1)^(31/8)
check(prefixform(T)="(^ -1 -1/8)")

T = (-1)^(-1/8)
check(prefixform(T)="(^ -1 -1/8)")
T = (-1)^(-3/8)
check(prefixform(T)="(^ -1 -3/8)")
T = (-1)^(-5/8)
check(prefixform(T)="(* -1 (^ -1 3/8))")
T = (-1)^(-7/8)
check(prefixform(T)="(* -1 (^ -1 1/8))")
T = (-1)^(-9/8)
check(prefixform(T)="(* -1 (^ -1 -1/8))")
T = (-1)^(-11/8)
check(prefixform(T)="(* -1 (^ -1 -3/8))")
T = (-1)^(-13/8)
check(prefixform(T)="(^ -1 3/8)")
T = (-1)^(-15/8)
check(prefixform(T)="(^ -1 1/8)")

T = (-1)^(-17/8)
check(prefixform(T)="(^ -1 -1/8)")
T = (-1)^(-19/8)
check(prefixform(T)="(^ -1 -3/8)")
T = (-1)^(-21/8)
check(prefixform(T)="(* -1 (^ -1 3/8))")
T = (-1)^(-23/8)
check(prefixform(T)="(* -1 (^ -1 1/8))")
T = (-1)^(-25/8)
check(prefixform(T)="(* -1 (^ -1 -1/8))")
T = (-1)^(-27/8)
check(prefixform(T)="(* -1 (^ -1 -3/8))")
T = (-1)^(-29/8)
check(prefixform(T)="(^ -1 3/8)")
T = (-1)^(-31/8)
check(prefixform(T)="(^ -1 1/8)")

-- floating point

T = (-1)^(1/2.0)
check(infixform(T)="i")
T = (-1)^(3/2.0)
check(infixform(T)="-i")
T = (-1)^(5/2.0)
check(infixform(T)="i")
T = (-1)^(7/2.0)
check(infixform(T)="-i")

T = (-1)^(9/2.0)
check(infixform(T)="i")
T = (-1)^(11/2.0)
check(infixform(T)="-i")
T = (-1)^(13/2.0)
check(infixform(T)="i")
T = (-1)^(15/2.0)
check(infixform(T)="-i")

T = (-1)^(-1/2.0)
check(infixform(T)="-i")
T = (-1)^(-3/2.0)
check(infixform(T)="i")
T = (-1)^(-5/2.0)
check(infixform(T)="-i")
T = (-1)^(-7/2.0)
check(infixform(T)="i")

T = (-1)^(-9/2.0)
check(infixform(T)="-i")
T = (-1)^(-11/2.0)
check(infixform(T)="i")
T = (-1)^(-13/2.0)
check(infixform(T)="-i")
T = (-1)^(-15/2.0)
check(infixform(T)="i")
"Testing incbeta"
clear

-- https://github.com/codeplea/incbeta/blob/master/test.c

check(infixform(incbeta(.1, 10, 10)) == "3.92988 10^(-6)")
check(infixform(incbeta(.3, 10, 10)) == "0.0325534")
check(infixform(incbeta(.5, 10, 10)) == "0.5")
check(infixform(incbeta(.7, 10, 10)) == "0.967447")
check(infixform(incbeta(1, 10, 10)) == "1")

check(infixform(incbeta(.5, 15, 10)) == "0.153728")
check(infixform(incbeta(.6, 15, 10)) == "0.48908")

check(infixform(incbeta(.5, 10, 15)) == "0.846272")
check(infixform(incbeta(.6, 10, 15)) == "0.978342")

check(infixform(incbeta(.4, 20, 20)) == "0.102059")
check(infixform(incbeta(.4, 40, 40)) == "0.0358103")
check(infixform(incbeta(.7, 40, 40)) == "0.999902")
"Testing infixform"
clear
check(infixform(1/x) == "1 / x")
check(infixform(x^2) == "x^2")
check(infixform(x^(-2)) == "1 / x^2")
check(infixform(sin(x)^2) == "sin(x)^2")
check(infixform(3^x) == "3^x")
check(infixform((-3)^x) == "3^x (-1)^x")
check(infixform((1/3)^x) == "3^(-x)")
check(infixform((-1/3)^x) == "3^(-x) (-1)^x")
check(infixform(1.2^x) == "(1.2)^x")
check(infixform((1.2 10^9)^x) == "(1.2 10^9)^x")
check(infixform((1.2 10^(-9))^x) == "(1.2 10^(-9))^x")
check(infixform((a+b)^x) == "(a + b)^x")
check(infixform((a+b)/(c+d)) == "a / (c + d) + b / (c + d)")
check(infixform(2/3 x/y) == "2 x / (3 y)")
check(infixform(-2/3 x/y) == "-2 x / (3 y)")
check(infixform((a,b,c)) == "(a,b,c)")
check(infixform(((a,b),(c,d))) == "((a,b),(c,d))")
check(infixform(quote((a+b)/(c+d))) == "(a + b) / (c + d)")
check(infixform(x^(a+b)) == "x^(a + b)")
check(infixform(x^(a b)) == "x^(a b)")
check(infixform(x^(a^b)) == "x^(a^b)")
check(infixform(x^(n!)) == "x^(n!)")
check(infixform(x^sin(x)) == "x^sin(x)")
"Testing integral"

clear

-- basic integrals

check(integral(a) = a x)
check(integral(x) = 1/2 x^2)
check(integral(a x) = 1/2 a x^2)
check(integral(x^2) = 1/3 x^3)
check(integral(a x^2) = 1/3 a x^3)
check(integral(x^n) = x^(n + 1) / (n + 1))
check(integral(a x^n) = a x^(n + 1) / (n + 1))
check(infixform(integral(f())) == "integral(f(),x)")
check(infixform(integral(f(),x)) == "integral(f(),x)")
check(infixform(integral(f(x))) == "integral(f(x),x)")
check(infixform(integral(f(x),x)) == "integral(f(x),x)")
check(infixform(integral(f(y))) == "x f(y)")
check(infixform(integral(f(y),x)) == "x f(y)")
check(infixform(integral(f(a,b,c),x)) == "x f(a,b,c)")
check(infixform(integral(f(a,b,c,x))) == "integral(f(a,b,c,x),x)")
check(infixform(integral(d(f()))) == "f()")
check(infixform(integral(d(f(t),t),t)) == "f(t)")
check(infixform(d(integral(f(),x),y)) == "integral(d(f(),y),x)")

-- check classifier false positives

check(integral(a^b,x) = a^b x)
check(integral(x^exp(y),x) = x^(exp(y) + 1) / (exp(y) + 1))
check(integral(x^log(y),x) = x^(log(y) + 1) / (log(y) + 1))
check(integral(x^sin(y),x) = x^(sin(y) + 1) / (sin(y) + 1))

-- x^n log(a x + b)

f = log(a x)
g = integral(f)
h = d(g)
check(f == h)
f = log(a x + b)
g = integral(f)
h = d(g)
check(f == h)
f = x log(a x)
g = integral(f)
h = d(g)
check(f == h)
f = x log(a x + b)
g = integral(f)
h = d(g)
check(f == h)
f = x^2 log(a x)
g = integral(f)
h = d(g)
check(f == h)
f = x^2 log(a x + b)
g = integral(f)
h = d(g)
check(f == h)
f = log(a x)^2
g = integral(f)
h = d(g)
check(f == h)
f = log(a x + b)^2
g = integral(f)
h = d(g)
check(f == h)
f = log(a x) / x^2
g = integral(f)
h = d(g)
check(f == h)
f = log(a x + b) / x^2
g = integral(f)
h = d(g)
check(f == h)
--
T = integral(x^2+x)
check(T = 1/3 x^3 + 1/2 x^2)
#1
T = integral(A,X)
check(T = A*X)
#4
T = integral(A+B,X)-(A*X+B*X)
check(T = 0)
#9
T = integral(1/X,X)
check(T = log(X))
#14
T = integral(log(X),X)-X*log(X)+X
check(T = 0)
#15
T = integral(3^X*log(3),X)
check(T = 3^X)
#16
f = 1 / (3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / (3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / (-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / (-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#17
f = 1 / sqrt((3 X^2 + 7))
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / sqrt((3 X^2 - 7))
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#18
f = X / sqrt((3 X^2 + 7))
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X / sqrt((3 X^2 - 7))
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X / sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X / sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#27
T = integral(1/(a+b*x),x)-(log(a+b*x)/b)
check(T = 0)
#28
T = integral(1/(A+B*X)^2,X)+1/B*1/(A+B*X)
check(T = 0)
#29
T = integral(1/(a+b*x)^3,x)+1/2*1/b*(a+b*x)^(-2)
check(T = 0)
#30
T = integral(X/(A+B*X),X)+A*B^(-2)*log(A+B*X)-X/B
check(T = 0)
#31
T = integral(X/(A+B*X)^2,X) - log(A+B*X)/B^2 - A/(B^2*(A+B*X))
check(T = 0)
#33
f = integral(X^2 / (A + B X),X)
g = (2 A^2 log(A + B X) + B X (B X - 2 A)) / (2 B^3)
check(f = g)
#34
f = integral(X^2 / (A + B X)^2,X)
g = (-A^2 / (A + B X) - 2 A log(A + B X) + B X) / B^3
check(f = g)
#35
T = integral(X^2/(A+B*X)^3,X)-1/B^3*(log(A+B*X)+2*A/(A+B*X)-1/2*A^2/(A+B*X)^2)
check(T = 0)
#37
T = integral(1/X*1/(A+B*X),X)+1/A*log((A+B*X)/X)
check(T = 0)
#38
T = integral(1/X*1/(A+B*X)^2,X)-1/A*1/(A+B*X)+1/A^2*log((A+B*X)/X)
check(T = 0)
#39
T = integral(1/X*1/(A+B*X)^3,X)-1/A^3*(1/2*((2*A+B*X)/(A+B*X))^2+log(X/(A+B*X)))
check(T = 0)
#40
T = integral(1/X^2*1/(A+B*X),X)+1/(A*X)-B/A^2*log((A+B*X)/X)
check(T = 0)
#41
T = integral(1/X^3*1/(A+B*X),X)-(2*B*X-A)/(2*A^2*X^2)-B^2/A^3*log(X/(A+B*X))
check(T = 0)
#42
T = integral(1/X^2*1/(A+B*X)^2,X)+(A+2*B*X)/(A^2*X*(A+B*X))-2*B/A^3*log((A+B*X)/X)
check(T = 0)
#63
T = integral(X/(A+B*X^2),X)-1/2*1/B*log(A+B*X^2)
check(T = 0)
#64
f = X^2 / (3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^2 / (3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^2 / (-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^2 / (-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)

#65
f = 1 / (3 X^2 + 7)^2
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / (3 X^2 - 7)^2
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / (-3 X^2 + 7)^2
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / (-3 X^2 - 7)^2
g = integral(f,X)
h = d(g,X)
check(f == h)

#66 (same as 62)
f = 1 / (A - B X^2)
F = integral(f,X)
check(f == d(F,X))

#67 (m=1) (same as 65)
f = 1 / (A X^2 + B)^2
F = integral(f,X)
check(f == d(F,X))
#67 (m=2)
f = 1 / (A X^2 + B)^3
F = integral(f,X)
check(f == d(F,X))
#67 (m=3)
f = 1 / (A X^2 + B)^4
F = integral(f,X)
check(f == d(F,X))

#68 (m=1)
f = X / (A X^2 + B)^2
F = integral(f,X)
check(f == d(F,X))
#68 (m=2)
f = X / (A X^2 + B)^3
F = integral(f,X)
check(f == d(F,X))
#68 (m=3)
f = X / (A X^2 + B)^4
F = integral(f,X)
check(f == d(F,X))

#69 (m=1)
f = X^2 / (A X^2 + B)^2
F = integral(f,X)
check(f == d(F,X))
#69 (m=2)
f = X^2 / (A X^2 + B)^3
F = integral(f,X)
check(f == d(F,X))
#69 (m=3)
f = X^2 / (A X^2 + B)^4
F = integral(f,X)
check(f == d(F,X))

#70
T = integral(1/X*1/(A+B*X^2),X)-1/2*1/A*log(X^2/(A+B*X^2))
check(T = 0)

#71
f = 1 / X^2 * 1 / (3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 * 1 / (3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 * 1 / (-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 * 1 / (-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#74
f = 1 / (A X^3 + B)
F = integral(f,X)
check(f == d(F,X))
#75
f = X / (A X^3 + B)
F = integral(f,X)
check(f == d(F,X))
#76
f = X^2 / (A X^3 + B)
F = integral(f,X)
check(f == d(F,X))
#77 78
f = 1 / (A X^4 + B)
F = integral(f,X)
check(f == d(F,X))
#79 80
f = X / (A X^4 + B)
F = integral(f,X)
check(f == d(F,X))
#81 82
f = X^2 / (A X^4 + B)
F = integral(f,X)
check(f == d(F,X))
#83
f = X^3 / (A X^4 + B)
F = integral(f,X)
check(f == d(F,X))

f = 1 / (A X^5 + B)
F = integral(f,X)
check(f == d(F,X))
#124
f = sqrt(3 X + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(3 X - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#125
T = integral(X*sqrt(A+B*X),X)+2*(2*A-3*B*X)*sqrt((A+B*X)^3)/15*B^(-2)
check(T = 0)
#126
T = integral(X^2*sqrt(A+B*X),X)-2*(8*A^2-12*A*B*X+15*B^2*X^2)*sqrt((A+B*X)^3)/105*B^(-3)
check(T = 0)
#128
f = sqrt(3 X + 7) / X
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(3 X - 7) / X
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X + 7) / X
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X - 7) / X
g = integral(f,X)
h = d(g,X)
check(f == h)
#129
f = sqrt(3 X + 7) / X^2
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(3 X - 7) / X^2
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X + 7) / X^2
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X - 7) / X^2
g = integral(f,X)
h = d(g,X)
check(f == h)
#131
f = 1 / sqrt(3 X + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / sqrt(3 X - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / sqrt(-3 X + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / sqrt(-3 X - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#132
T = integral(X/sqrt(A+B*X),X)+2/3*(2*A-B*X)*sqrt(A+B*X)/B^2
check(T = 0)
#133
T = integral(X^2/sqrt(A+B*X),X)-2/15*(8*A^2-4*A*B*X+3*B^2*X^2)*sqrt(A+B*X)/B^3
check(T = 0)
#134
f = 1 / X / sqrt(3 X + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X / sqrt(3 X - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X / sqrt(-3 X + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X / sqrt(-3 X - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#137
f = 1 / X^2 / sqrt(3 X + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 / sqrt(3 X - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 / sqrt(-3 X + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 / sqrt(-3 X - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#156
T = integral(sqrt(X^2+A),X)-1/2*(X*sqrt(X^2+A)+A*log(X+sqrt(X^2+A)))
check(T = 0)
#157
T = integral(1/sqrt(X^2+A),X)-log(X+sqrt(X^2+A))
check(T = 0)
#158
f = 1 / X / sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X / sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X / sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X / sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#138
f = sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#160
f = sqrt(3 X^2 + 7) / X
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(3 X^2 - 7) / X
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X^2 + 7) / X
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X^2 - 7) / X
g = integral(f,X)
h = d(g,X)
check(f == h)
#163
f = X sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#164
T = integral(sqrt((X^2+A)^3),X)-1/4*(X*sqrt((X^2+A)^3)+3/2*A*X*sqrt(X^2+A)+3/2*A^2*log(X+sqrt(X^2+A)))
check(T = 0)
#165
f = (3 X^2 + 7)^(-3/2)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = (3 X^2 - 7)^(-3/2)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = (-3 X^2 + 7)^(-3/2)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = (-3 X^2 - 7)^(-3/2)
g = integral(f,X)
h = d(g,X)
check(f == h)
#166
f = X (3 X^2 + 7)^(-3/2)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X (3 X^2 - 7)^(-3/2)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X (-3 X^2 + 7)^(-3/2)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X (-3 X^2 - 7)^(-3/2)
g = integral(f,X)
h = d(g,X)
check(f == h)
#167
T = integral(X*sqrt((X^2+A)^3),X)-1/5*sqrt((X^2+A)^5)
check(T = 0)
#168
f = X^2 sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^2 sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#169
f = X^3 sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^3 sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^3 sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^3 sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#171
f = X^2 / sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^2 / sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^2 / sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^2 / sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#172
f = X^3 / sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^3 / sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^3 / sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = X^3 / sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#173
f = 1 / X^2 / sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 / sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 / sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^2 / sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#174
f = 1 / X^3 / sqrt(3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^3 / sqrt(3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^3 / sqrt(-3 X^2 + 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
f = 1 / X^3 / sqrt(-3 X^2 - 7)
g = integral(f,X)
h = d(g,X)
check(f == h)
#204
T = integral(X/sqrt(A-X^2),X)+sqrt(A-X^2)
check(T = 0)
#210
f = integral(X^2 sqrt(7 - X^2),X)
g = 1/4 X^3 (-X^2 + 7)^(1/2) - 7/8 X (-X^2 + 7)^(1/2) - 49/8 i log(-X + i (-X^2 + 7)^(1/2))
check(f = g)
#215
T = integral(1/X^2*1/sqrt(7-X^2),X)+sqrt(7-X^2)/7/X
check(T = 0)
#216
f = sqrt(3 X^2 + 7) / X^2
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(3 X^2 - 7) / X^2
g = integral(f,X)
h = d(g,X)
check(f == h)
#217
f = sqrt(3 X^2 + 7) / X^3
g = integral(f,X)
h = d(g,X)
check(f == h)
f = sqrt(-3 X^2 + 7) / X^3
g = integral(f,X)
h = d(g,X)
check(f == h)
#290
T = integral(sin(A*X),X)+cos(A*X)/A
check(T = 0)
#291
T = integral(cos(A*X),X)-sin(A*X)/A
check(T = 0)
#292
T = integral(tan(A*X),X)+log(cos(A*X))/A
check(T = 0)
#293
T = integral(1/tan(A*X),X)-log(sin(A*X))/A
check(T = 0)
#294
T = integral(1/cos(A*X),X)-log(tan(pi/4+A*X/2))/A
check(T = 0)
#295
T = integral(1/sin(A*X),X)-log(tan(A*X/2))/A
check(T = 0)
#296
T = integral(sin(A*X)^2,X)-X/2+sin(2*A*X)/(4*A)
check(T = 0)
#297
T = integral(sin(A*X)^3,X)+cos(A*X)*(sin(A*X)^2+2)/(3*A)
check(T = 0)
#298
T = integral(sin(A*X)^4,X)-3/8*X+sin(2*A*X)/(4*A)-sin(4*A*X)/(32*A)
check(T = 0)
#302
T = integral(cos(A*X)^2,X)-X/2-sin(2*A*X)/(4*A)
check(T = 0)
#303
T = integral(cos(A*X)^3,X)-sin(A*X)*(cos(A*X)^2+2)/(3*A)
check(T = 0)
#304
T = integral(cos(A*X)^4,X)-3/8*X-sin(2*A*X)/(4*A)-sin(4*A*X)/(32*A)
check(T = 0)
#308
T = integral((1/sin(A*X))^2,X)+1/A*1/tan(A*X)
check(T = 0)
#312
T = integral((1/cos(A*X))^2,X)-tan(A*X)/A
check(T = 0)
#318
T = integral(sin(A*X)*cos(A*X),X)-sin(A*X)^2/(2*A)
check(T = 0)
#320
T = integral(sin(A*X)^2*cos(A*X)^2,X)+sin(4*A*X)/(32*A)-X/8
check(T = 0)
#326
T = integral(sin(A*X)/cos(A*X)/cos(A*X),X)-1/(A*cos(A*X))
check(T = 0)
#328
T = integral(cos(A*X)/sin(A*X)^2,X)+1/(A*sin(A*X))
check(T = 0)
#329
T = integral(1/sin(A*X)/cos(A*X),X)-log(tan(A*X))/A
check(T = 0)
#330
T = integral(1/sin(A*X)/cos(A*X)^2,X)-(1/cos(A*X)+log(tan(A*X/2)))/A
check(T = 0)
#332
T = integral(1/sin(A*X)^2/cos(A*X),X)-(log(tan(pi/4+A*X/2))-1/sin(A*X))/A
check(T = 0)
#333
T = integral(1/sin(A*X)^2/cos(A*X)^2,X)+2/(A*tan(2*A*X))
check(T = 0)
#335
T = integral(sin(A+B*X),X)+cos(A+B*X)/B
check(T = 0)
#336
T = integral(cos(A+B*X),X)-sin(A+B*X)/B
check(T = 0)
#337+
T = integral(1/(1+sin(A*X)),X)+tan(pi/4-A*X/2)/A
check(T = 0)
#337b+
T = integral(1/(B+B*sin(A*X)),X)+tan(pi/4-A*X/2)/A/B
check(T = 0)
#337-
T = integral(1/(1-sin(A*X)),X)-tan(pi/4+A*X/2)/A
check(T = 0)
#337b-
T = integral(1/(B-B*sin(A*X)),X)-tan(pi/4+A*X/2)/A/B
check(T = 0)
#338
T = integral(1/(1+cos(A*X)),X)-tan(A*X/2)/A
check(T = 0)
#339
T = integral(1/(1-cos(A*X)),X)+1/(A*tan(A*X/2))
check(T = 0)
#340
T = integral(1/(A+B*sin(X)),X)-1/sqrt(B^2-A^2)*log((A*tan(X/2)+B-sqrt(B^2-A^2))/(A*tan(X/2)+B+sqrt(B^2-A^2)))
check(T = 0)
#341
T = integral(1/(A+B*cos(X)),X)-1/sqrt(B^2-A^2)*log((sqrt(B^2-A^2)*tan(X/2)+A+B)/(sqrt(B^2-A^2)*tan(X/2)-A-B))
check(T = 0)
#389
T = x*sin(A*x)-d(integral(x*sin(A*x)))
check(T = 0)
#390
T = x^2*sin(A*x)-d(integral(x^2*sin(A*x)))
check(T = 0)
#393
T = x*cos(A*x)-d(integral(x*cos(A*x)))
check(T = 0)
#394
T = x^2*cos(A*x)-d(integral(x^2*cos(A*x)))
check(T = 0)
#441
T = integral(arcsin(A*X),X)-X*arcsin(A*X)-sqrt(1-A^2*X^2)/A
check(T = 0)
#442
T = integral(arccos(A*X),X)-X*arccos(A*X)-sqrt(1-A^2*X^2)/A
check(T = 0)
#443
T = integral(arctan(A*X),X)-X*arctan(A*X)+log(1+A^2*X^2)/(2*A)
check(T = 0)
#493
T = integral(1/X*1/log(A*X),X)-log(log(A*X))
check(T = 0)
#554
T = integral(sinh(X),X)-cosh(X)
check(T = 0)
#555
T = integral(cosh(X),X)-sinh(X)
check(T = 0)
#556
T = integral(tanh(X),X)-log(cosh(X))
check(T = 0)
#560
T = integral(X*sinh(X),X)-X*cosh(X)+sinh(X)
check(T = 0)
#562
T = integral(X*cosh(X),X)-X*sinh(X)+cosh(X)
check(T = 0)
#566
T = integral(sinh(X)^2,X)-sinh(2*X)/4+X/2
check(T = 0)
#569
T = integral(tanh(X)^2,X)-X+tanh(X)
check(T = 0)
#572
T = integral(cosh(X)^2,X)-sinh(2*X)/4-X/2
check(T = 0)
T = integral(1/x*1/(a+log(x)),x)-log(a+log(x))
check(T = 0)
T = integral(x^2*(1-x^2)^(3/2))-(x*sqrt(1-x^2)*(-8*x^4+14*x^2-3)+3*arcsin(x))/48
check(T = 0)
T = integral(x^4*(1-x^2)^(3/2))-(-x*sqrt(1-x^2)*(16*x^6-24*x^4+2*x^2+3)+3*arcsin(x))/128
check(T = 0)
T = integral(x^2*(1-x^2)^(5/2))-(x*sqrt(1-x^2)*(48*x^6-136*x^4+118*x^2-15)+15*arcsin(x))/384
check(T = 0)
T = integral(cos(x)^2*sin(x))
check(T = -cos(x)^3/3)
T = integral((1+cos(x)^2)*sin(x))
check(T = -cos(x)-cos(x)^3/3)
T = defint((1+cos(theta)^2)*sin(theta),theta,0,pi,phi,0,2*pi)
check(T = 16*pi/3)
T = integral(sin(A X) / (cos(A X) - 1)^2,X)
check(T == 1/A * 1/(cos(A X) - 1))
T = integral(sin(A X) / (1 - cos(A X))^2,X)
check(T == 1/A * 1/(cos(A X) - 1))
check(integral(d(arcsin(x))) == arcsin(x))
check(integral(sqrt(1 + x^2 / (1 - x^2))) == arcsin(x))

f = sin(x) exp(a x)
check(d(integral(f)) == f)
f = sin(x) exp(a x + b)
check(d(integral(f)) == f)
f = sin(x) exp(i x)
check(d(integral(f)) == f)
f = sin(x) exp(-i x)
check(d(integral(f)) == f)
f = sin(x) exp(i x + b)
check(d(integral(f)) == f)
f = sin(x) exp(-i x + b)
check(d(integral(f)) == f)
f = sin(x) exp(i a x)
check(d(integral(f)) == f)
f = sin(x) exp(-i a x)
check(d(integral(f)) == f)
f = sin(x) exp(i a x + b)
check(d(integral(f)) == f)
f = sin(x) exp(-i a x + b)
check(d(integral(f)) == f)

f = cos(x) exp(a x)
check(d(integral(f)) == f)
f = cos(x) exp(a x + b)
check(d(integral(f)) == f)
f = cos(x) exp(i x)
check(d(integral(f)) == f)
f = cos(x) exp(-i x)
check(d(integral(f)) == f)
f = cos(x) exp(i x + b)
check(d(integral(f)) == f)
f = cos(x) exp(-i x + b)
check(d(integral(f)) == f)
f = cos(x) exp(i a x)
check(d(integral(f)) == f)
f = cos(x) exp(-i a x)
check(d(integral(f)) == f)
f = cos(x) exp(i a x + b)
check(d(integral(f)) == f)
f = cos(x) exp(-i a x + b)
check(d(integral(f)) == f)

f = sin(x) cos(x) exp(a x)
check(d(integral(f)) == f)

f = cos(x)^3 sin(x)
check(d(integral(f)) == f)

f = cos(a x)^5
check(d(integral(f)) == f)

f = cos(a x)^5 / sin(a x)^2
check(d(integral(f)) == f)

f = cos(a x)^3 / sin(a x)^2
check(d(integral(f)) == f)

f = cos(a x)^5 / sin(a x)
g = d(integral(f))
check(g == f)

f = cos(a x)^3 / sin(a x)
g = d(integral(f))
check(g == f)

f = cos(a x) sin(a x)^3
check(d(integral(f)) == f)

f = cos(a x)^3 sin(a x)^2
check(d(integral(f)) == f)

f = cos(a x)^2 sin(a x)^3
check(d(integral(f)) == f)

f = cos(a x)^4 sin(a x)
check(d(integral(f)) == f)

f = cos(a x)^7 / sin(a x)^2
check(d(integral(f)) == f)

-- sin(a x)^n

f = sin(a x)^2
check(d(integral(f)) == f)

f = sin(a x)^3
check(d(integral(f)) == f)

f = sin(a x)^4
check(d(integral(f)) == f)

f = sin(a x)^5
check(d(integral(f)) == f)

f = sin(a x)^6
check(d(integral(f)) == f)

-- cos(a x)^n

f = cos(a x)^2
check(d(integral(f)) == f)

f = cos(a x)^3
check(d(integral(f)) == f)

f = cos(a x)^4
check(d(integral(f)) == f)

f = cos(a x)^5
check(d(integral(f)) == f)

f = cos(a x)^6
check(d(integral(f)) == f)

-- cos(a x)^n / sin(a x)

f = cos(a x)^2 / sin(a x)
check(d(integral(f)) == f)

f = cos(a x)^4 / sin(a x)
check(d(integral(f)) == f)

f = cos(a x)^6 / sin(a x)
check(d(integral(f)) == f)

-- x^n exp(a x + b)

f = x^0 exp(a x)
check(d(integral(f)) == f)
f = x^0 exp(x)
check(d(integral(f)) == f)
f = x^0 exp(-x)
check(d(integral(f)) == f)
f = x^0 exp(-a x)
check(d(integral(f)) == f)
f = x^0 exp(a x + b)
check(d(integral(f)) == f)

f = x^1 exp(a x)
check(d(integral(f)) == f)
f = x^1 exp(x)
check(d(integral(f)) == f)
f = x^1 exp(-x)
check(d(integral(f)) == f)
f = x^1 exp(-a x)
check(d(integral(f)) == f)
f = x^1 exp(a x + b)
check(d(integral(f)) == f)

f = x exp(a x)
check(d(integral(f)) == f)
f = x exp(x)
check(d(integral(f)) == f)
f = x exp(-x)
check(d(integral(f)) == f)
f = x exp(-a x)
check(d(integral(f)) == f)
f = x exp(a x + b)
check(d(integral(f)) == f)

f = x^3 exp(a x)
check(d(integral(f)) == f)
f = x^3 exp(x)
check(d(integral(f)) == f)
f = x^3 exp(-x)
check(d(integral(f)) == f)
f = x^3 exp(-a x)
check(d(integral(f)) == f)
f = x^3 exp(a x + b)
check(d(integral(f)) == f)

f = x^4 exp(a x)
check(d(integral(f)) == f)
f = x^4 exp(x)
check(d(integral(f)) == f)
f = x^4 exp(-x)
check(d(integral(f)) == f)
f = x^4 exp(-a x)
check(d(integral(f)) == f)
f = x^4 exp(a x + b)
check(d(integral(f)) == f)

f = x^5 exp(a x)
check(d(integral(f)) == f)
f = x^5 exp(x)
check(d(integral(f)) == f)
f = x^5 exp(-x)
check(d(integral(f)) == f)
f = x^5 exp(-a x)
check(d(integral(f)) == f)
f = x^5 exp(a x + b)
check(d(integral(f)) == f)

f = x^6 exp(a x)
check(d(integral(f)) == f)
f = x^6 exp(x)
check(d(integral(f)) == f)
f = x^6 exp(-x)
check(d(integral(f)) == f)
f = x^6 exp(-a x)
check(d(integral(f)) == f)
f = x^6 exp(a x + b)
check(d(integral(f)) == f)

f = x^7 exp(a x)
check(d(integral(f)) == f)
f = x^7 exp(x)
check(d(integral(f)) == f)
f = x^7 exp(-x)
check(d(integral(f)) == f)
f = x^7 exp(-a x)
check(d(integral(f)) == f)
f = x^7 exp(a x + b)
check(d(integral(f)) == f)

f = x^8 exp(a x)
check(d(integral(f)) == f)
f = x^8 exp(x)
check(d(integral(f)) == f)
f = x^8 exp(-x)
check(d(integral(f)) == f)
f = x^8 exp(-a x)
check(d(integral(f)) == f)
f = x^8 exp(a x + b)
check(d(integral(f)) == f)

f = x^9 exp(a x)
check(d(integral(f)) == f)
f = x^9 exp(x)
check(d(integral(f)) == f)
f = x^9 exp(-x)
check(d(integral(f)) == f)
f = x^9 exp(-a x)
check(d(integral(f)) == f)
f = x^9 exp(a x + b)
check(d(integral(f)) == f)

f = x^10 exp(a x)
check(d(integral(f)) == f)
f = x^10 exp(x)
check(d(integral(f)) == f)
f = x^10 exp(-x)
check(d(integral(f)) == f)
f = x^10 exp(-a x)
check(d(integral(f)) == f)
f = x^10 exp(a x + b)
check(d(integral(f)) == f)

f = x^11 exp(a x)
check(d(integral(f)) == f)
f = x^11 exp(x)
check(d(integral(f)) == f)
f = x^11 exp(-x)
check(d(integral(f)) == f)
f = x^11 exp(-a x)
check(d(integral(f)) == f)
f = x^11 exp(a x + b)
check(d(integral(f)) == f)

-- x^n exp(a x^2 + b)

f = x^0 exp(a x^2)
check(d(integral(f)) == f)
f = x^0 exp(x^2)
check(d(integral(f)) == f)
f = x^0 exp(-x^2)
check(d(integral(f)) == f)
f = x^0 exp(-a x^2)
check(d(integral(f)) == f)
f = x^0 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^1 exp(a x^2)
check(d(integral(f)) == f)
f = x^1 exp(x^2)
check(d(integral(f)) == f)
f = x^1 exp(-x^2)
check(d(integral(f)) == f)
f = x^1 exp(-a x^2)
check(d(integral(f)) == f)
f = x^1 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^2 exp(a x^2)
check(d(integral(f)) == f)
f = x^2 exp(x^2)
check(d(integral(f)) == f)
f = x^2 exp(-x^2)
check(d(integral(f)) == f)
f = x^2 exp(-a x^2)
check(d(integral(f)) == f)
f = x^2 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^3 exp(a x^2)
check(d(integral(f)) == f)
f = x^3 exp(x^2)
check(d(integral(f)) == f)
f = x^3 exp(-x^2)
check(d(integral(f)) == f)
f = x^3 exp(-a x^2)
check(d(integral(f)) == f)
f = x^3 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^4 exp(a x^2)
check(d(integral(f)) == f)
f = x^4 exp(x^2)
check(d(integral(f)) == f)
f = x^4 exp(-x^2)
check(d(integral(f)) == f)
f = x^4 exp(-a x^2)
check(d(integral(f)) == f)
f = x^4 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^5 exp(a x^2)
check(d(integral(f)) == f)
f = x^5 exp(x^2)
check(d(integral(f)) == f)
f = x^5 exp(-x^2)
check(d(integral(f)) == f)
f = x^5 exp(-a x^2)
check(d(integral(f)) == f)
f = x^5 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^6 exp(a x^2)
check(d(integral(f)) == f)
f = x^6 exp(x^2)
check(d(integral(f)) == f)
f = x^6 exp(-x^2)
check(d(integral(f)) == f)
f = x^6 exp(-a x^2)
check(d(integral(f)) == f)
f = x^6 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^7 exp(a x^2)
check(d(integral(f)) == f)
f = x^7 exp(x^2)
check(d(integral(f)) == f)
f = x^7 exp(-x^2)
check(d(integral(f)) == f)
f = x^7 exp(-a x^2)
check(d(integral(f)) == f)
f = x^7 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^8 exp(a x^2)
check(d(integral(f)) == f)
f = x^8 exp(x^2)
check(d(integral(f)) == f)
f = x^8 exp(-x^2)
check(d(integral(f)) == f)
f = x^8 exp(-a x^2)
check(d(integral(f)) == f)
f = x^8 exp(a x^2 + b)
check(d(integral(f)) == f)

f = x^9 exp(a x^2)
check(d(integral(f)) == f)
f = x^9 exp(x^2)
check(d(integral(f)) == f)
f = x^9 exp(-x^2)
check(d(integral(f)) == f)
f = x^9 exp(-a x^2)
check(d(integral(f)) == f)
f = x^9 exp(a x^2 + b)
check(d(integral(f)) == f)

-- test collect_coeffs()

clear

f = exp(-i (En - omega - i epsilon) t / hbar)
check(integral(f,t) == i hbar f / (En - omega - i epsilon))

f = exp(a x^2 + b + c)
g = integral(f,x)
check(infixform(g) == "-i pi^(1/2) erf(i a^(1/2) x) exp(b + c) / (2 a^(1/2))")
check(f == d(g,x))

check(infixform(integral(a(t),t)) == "integral(a(t),t)")

check(infixform(integral(f(x,y),x,y)) == "integral(integral(f(x,y),x),y)")
check(infixform(integral(f(x,y),y,x)) == "integral(integral(f(x,y),x),y)")

-- integral of integral

check(infixform(integral(f(x),x,x)) == "integral(integral(f(x),x),x)")
check(infixform(integral(f(x,y),x,y)) == "integral(integral(f(x,y),x),y)")
check(infixform(integral(f(x,y),y,x)) == "integral(integral(f(x,y),x),y)")

-- integral of derivative

check(infixform(integral(d(f(x),x),x)) == "f(x)")
check(infixform(integral(d(f(x),x),y)) == "y d(f(x),x)")
check(infixform(integral(d(f(x),y),x)) == "0")
check(infixform(integral(d(f(x),y),y)) == "0")

check(infixform(integral(d(f(x),x,x),x,x)) == "f(x)")

check(infixform(integral(d(f(x),x),x,x)) == "integral(f(x),x)")
check(infixform(integral(d(f(x),x,x),x)) == "d(f(x),x)")

check(infixform(integral(d(f(x,y),x,y),x)) == "d(f(x,y),y)")
check(infixform(integral(d(f(x,y),x,y),y)) == "d(f(x,y),x)")

check(infixform(integral(d(f(x,y),x,y),x,y)) == "f(x,y)")
check(infixform(integral(d(f(x,y),x,y),y,x)) == "f(x,y)")

check(infixform(integral(d(f(x,y),x),x,y)) == "integral(f(x,y),y)")
check(infixform(integral(d(f(x,y),x),y,x)) == "integral(f(x,y),y)")
"Testing kronecker"

clear

A = (2,3)
B = (a,b,c)
check(kronecker(A,B) == (2a,2b,2c,3a,3b,3c))
check(kronecker(B,A) == (2a,3a,2b,3b,2c,3c))

A = (a,b)
B = ((2,3,4),(5,6,7),(8,9,10),(11,12,13))

C = ((2a,3a,4a),
     (5a,6a,7a),
     (8a,9a,10a),
     (11a,12a,13a),
     (2b,3b,4b),
     (5b,6b,7b),
     (8b,9b,10b),
     (11b,12b,13b))

check(kronecker(A,B) == C)

C = ((2a,3a,4a),
     (2b,3b,4b),
     (5a,6a,7a),
     (5b,6b,7b),
     (8a,9a,10a),
     (8b,9b,10b),
     (11a,12a,13a),
     (11b,12b,13b))

check(kronecker(B,A) == C)

A = ((2,3),(4,5))
B = ((a,b),(c,d))

C = ((2a,2b,3a,3b),
     (2c,2d,3c,3d),
     (4a,4b,5a,5b),
     (4c,4d,5c,5d))

check(kronecker(A,B) == C)
"Testing laguerre"

clear

T=laguerre(x,0,0)-1
check(T=0)
T=laguerre(x,1,0)-(-x+1)
check(T=0)
T=laguerre(x,2,0)-1/2*(x^2-4*x+2)
check(T=0)
T=laguerre(x,3,0)-1/6*(-x^3+9*x^2-18*x+6)
check(T=0)
"Testing lgamma"
clear
check(infixform(lgamma(1/2)) == "0.572365")
"Testing local variables"
clear
x = 123 -- global x in use, need local x in P
P(f,n,m,x) = eval(1/(2^n n!) (1 - x^2)^(m/2) d((x^2 - 1)^n,x,n + m),x,f)
check(P(cos(theta),2,0) == 3/2 cos(theta)^2 - 1/2)
check(x == 123)
"Testing log"

clear

check(log((x,y)) == (log(x),log(y)))

check(infixform(log(0)) == "log(0)")
check(log(x^2) == 2 log(x))
check(log(1 / x) == -log(x))
check(log(x y) == log(x) + log(y))
check(log(x^y) == y log(x))
check(log(exp(x)) == x)
check(log(1/3) + log(3) == 0)
check(log(-1) == i pi)
check(infixform(log(-1.0)) == "3.14159 i")

-- log of number is factored

check(infixform(log(1/10)) = "-log(2) - log(5)")

-- compare intrinsic

for(x,1,10,
  d = float(log(x/3)) - log(float(x/3)),
  check(abs(d) < 1.0 10^(-6))
)

-- negative arg

for(x,1,10,
  d = exp(log(-x/3.0)) + x/3.0,
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

z1 =  0.2 + 0.3 i
z2 =  0.2 - 0.3 i
z3 = -0.2 + 0.3 i
z4 = -0.2 - 0.3 i

check(infixform(exp(log(z1))) == infixform(z1))
check(infixform(exp(log(z2))) == infixform(z2))
check(infixform(exp(log(z3))) == infixform(z3))
check(infixform(exp(log(z4))) == infixform(z4))

z = 1.0 i
w = log(z + sqrt(z^2 - 1))
check(infixform(w) == "0.881374 + 1.5708 i") -- bug fix
check(log(0.0) == log(0))

for(x,-2,2,for(y,-2,2,
 z = float(x + i y),
 test(y,check(abs(log(z) - log(mag(z)) - i arg(z)) < 0.000001))
))

for(x,-2,2,for(y,-2,2,
 z = float(x + i y),
 check(abs(exp(log(z)) - z) < 0.000001),
 check(abs(log(exp(z)) - z) < 0.000001)
))

-- pathological cases
check(infixform(log(log(0))) == "log(log(0))")
check(infixform(log(log(0.0))) == "log(log(0))")
check(infixform(log(2 log(0))) == "log(2) + log(log(0))")
check(infixform(log(2.0 log(0))) == "log(log(0)) + 0.693147")
check(infixform(log(2 + log(0))) == "log(log(0) + 2)")
check(infixform(log(2.0 + log(0))) == "log(log(0) + 2)")
"Testing logform"
clear
check(logform(arccos(z)) == -i log(z + i sqrt(1 - abs(z)^2)))
check(logform(arcsin(z)) == -i log(i z + sqrt(1 - abs(z)^2)))
check(logform(arctan(z)) == -1/2 i log((i - z) / (i + z)))
check(logform(arccosh(z)) == log(z + sqrt(abs(z)^2 - 1)))
check(logform(arcsinh(z)) == log(z + sqrt(abs(z)^2 + 1)))
check(logform(arctanh(z)) == 1/2 log((1 + z) / (1 - z)))
check(logform(arctan(y,x)) == arctan(y,x))
check(logform((1,arccos(z),1)) == (1,-i log(z + i sqrt(1 - abs(z)^2)),1))
"Testing logical operators"

clear

F = 0

check(and(T,T,T) == 1)
check(and(T,T,F) == 0)
check(and(T,F,T) == 0)
check(and(T,F,F) == 0)

check(and(F,T,T) == 0)
check(and(F,T,F) == 0)
check(and(F,F,T) == 0)
check(and(F,F,F) == 0)

check(or(T,T,T) == 1)
check(or(T,T,F) == 1)
check(or(T,F,T) == 1)
check(or(T,F,F) == 1)

check(or(F,T,T) == 1)
check(or(F,T,F) == 1)
check(or(F,F,T) == 1)
check(or(F,F,F) == 0)

check(not(T) == 0)
check(not(F) == 1)
"Testing loop"
clear
k = 0
loop(k = k + 1, test(k == 3, break))
check(k == 3)
"Testing mag"

clear

check(infixform(mag((a + i b) / (c + i d))) == "(a^2 + b^2)^(1/2) / (c^2 + d^2)^(1/2)")

check(infixform(mag(1)) == "1")
check(infixform(mag(-1)) == "1")
check(infixform(mag(i)) == "1")
check(infixform(mag(-i)) == "1")

check(infixform(mag(a)) == "a")
check(infixform(mag(-a)) == "a")
check(infixform(mag(i a)) == "a")
check(infixform(mag(-i a)) == "a")

check(infixform(mag(a b)) == "a b")
check(infixform(mag(-a b)) == "a b")
check(infixform(mag(i a b)) == "a b")
check(infixform(mag(-i a b)) == "a b")

check(infixform(mag(a + b)) == "a + b")
check(infixform(mag(-a - b)) == "-a - b")
check(infixform(mag(i a + i b)) == "a + b")
check(infixform(mag(-i a - i b)) == "-a - b")

psi = A exp(-k x)
v = defint(conj(psi) (-i hbar d(psi,x)), x, 0, L) / m
check(i mag(v) == v)

for(x,-2,2,for(y,-2,2,
  check(mag(x + i y) == sqrt(x^2 + y^2))
))
"Testing minor"

clear
A = ((A11,A12),(A21,A22))
check(minor(A,1,1) == A22)
check(minor(A,1,2) == A21)
check(minor(A,2,1) == A12)
check(minor(A,2,2) == A11)
A = ((A11,A12,A13),(A21,A22,A23),(A31,A32,A33))
check(minor(A,1,1) == A22 A33 - A23 A32)
check(minor(A,1,2) == A21 A33 - A23 A31)
check(minor(A,1,3) == A21 A32 - A22 A31)
check(minor(A,2,1) == A12 A33 - A13 A32)
check(minor(A,2,2) == A11 A33 - A13 A31)
check(minor(A,2,3) == A11 A32 - A12 A31)
check(minor(A,3,1) == A12 A23 - A13 A22)
check(minor(A,3,2) == A11 A23 - A13 A21)
check(minor(A,3,3) == A11 A22 - A12 A21)

A = ((A11,A12,A13),(A21,A22,A23),(A31,A32,A33))
B = ((0,0,0),(0,0,0),(0,0,0))
for(I,1,3,for(J,1,3,B[J,I] = (-1)^(I + J) minor(A,I,J)))
check(B == adj(A))
"Testing minormatrix"

clear

A = ((1,2),
     (3,4))

check(minormatrix(A,1,1) == 4)
check(minormatrix(A,1,2) == 3)

check(minormatrix(A,2,1) == 2)
check(minormatrix(A,2,2) == 1)

A = ((1,2,3),
     (4,5,6))

check(minormatrix(A,1,1) == (5,6))
check(minormatrix(A,1,2) == (4,6))
check(minormatrix(A,1,3) == (4,5))

check(minormatrix(A,2,1) == (2,3))
check(minormatrix(A,2,2) == (1,3))
check(minormatrix(A,2,3) == (1,2))

A = ((1,2),
     (3,4),
     (5,6))

check(minormatrix(A,1,1) == (4,6))
check(minormatrix(A,1,2) == (3,5))

check(minormatrix(A,2,1) == (2,6))
check(minormatrix(A,2,2) == (1,5))

check(minormatrix(A,3,1) == (2,4))
check(minormatrix(A,3,2) == (1,3))

A = ((1,2,3),
     (4,5,6),
     (7,8,9))

check(minormatrix(A,1,1) == ((5,6),(8,9)))
check(minormatrix(A,1,2) == ((4,6),(7,9)))
check(minormatrix(A,1,3) == ((4,5),(7,8)))

check(minormatrix(A,2,1) == ((2,3),(8,9)))
check(minormatrix(A,2,2) == ((1,3),(7,9)))
check(minormatrix(A,2,3) == ((1,2),(7,8)))

check(minormatrix(A,3,1) == ((2,3),(5,6)))
check(minormatrix(A,3,2) == ((1,3),(4,6)))
check(minormatrix(A,3,3) == ((1,2),(4,5)))

A = ((A11,A12),
     (A21,A22))

for(I,1,2,for(J,1,2,check(det(minormatrix(A,I,J)) == minor(A,I,J))))

A = ((A11,A12,A13),
     (A21,A22,A23),
     (A31,A32,A33))

for(I,1,3,for(J,1,3,check(det(minormatrix(A,I,J)) == minor(A,I,J))))

A = ((A11,A12,A13,A14),
     (A21,A22,A23,A24),
     (A31,A32,A33,A34),
     (A41,A42,A43,A44))

for(I,1,4,for(J,1,4,check(det(minormatrix(A,I,J)) == minor(A,I,J))))

A = ((A11,A12,A13,A14,A15),
     (A21,A22,A23,A24,A25),
     (A31,A32,A33,A34,A35),
     (A41,A42,A43,A44,A45),
     (A51,A52,A53,A54,A55))

for(I,1,5,for(J,1,5,check(det(minormatrix(A,I,J)) == minor(A,I,J))))

A = ((A11,A12,A13,A14,A15,A16),
     (A21,A22,A23,A24,A25,A26),
     (A31,A32,A33,A34,A35,A36),
     (A41,A42,A43,A44,A45,A46),
     (A51,A52,A53,A54,A55,A56),
     (A61,A62,A63,A64,A65,A66))

for(I,1,6,for(J,1,6,check(det(minormatrix(A,I,J)) == minor(A,I,J))))
"Testing mod"

clear

check(mod((x,y),n) == (mod(x,n),mod(y,n)))

-- compare intrinsic

for(a,-20,20,for(b,-20,20,
  test(b = 0,b = 1),
  check(mod(a/4,b/4) = mod(a/4.0,b/4.0))
))
"Testing noexpand"

clear

check(infixform(noexpand((x + 1) (x + 2) + (y + 1) (y + 2))) ==
"(x + 1) (x + 2) + (y + 1) (y + 2)")

check(infixform(noexpand((x + 1)^2 (y + 1)^2)) ==
"(x + 1)^2 (y + 1)^2")

A = ((a^2 - lambda,0,0),(0,b^2 - lambda,0),(0,0,c^2 - lambda))
B = ((1 / (a^2 - lambda),0,0),(0,1 / (b^2 - lambda),0),(0,0,1 / (c^2 - lambda)))
check(noexpand(inv(A)) == B)
check(noexpand(adj(A)/det(A)) == B)
"Testing nroots"

clear

epsilon = 1.0 10^(-6)

p = 125 x^5 - 1
A = nroots(p)
for(k,1,5,check(abs(eval(p,x,A[k])) < epsilon))

check(nroots(1) == nil) -- no roots
check(infixform(nroots(x - 5)) == "5") -- one root
check(nroots(x^5) == (0,0,0,0,0)) -- exact zero

-- use strings to avoid floating point comparisons

p = (x - 1) (x - 2) (x - 3)
check(infixform(nroots(p)) == "(1,2,3)")
check(infixform(nroots(p,x)) == "(1,2,3)")

p = (t - 1) (t - 2) (t - 3)
check(infixform(nroots(p,t)) == "(1,2,3)")

p = i (x^5 + x^4 + x^3 + x^2 + x + 1)
A = nroots(p)
for(k,1,4,check(abs(eval(p,x,A[k])) < epsilon))
"Testing number"
clear
check(number(1/2) == 1)
check(number(x) == 0)
"Testing numerator"

clear

T = numerator(2/3)
check(T = 2) 
T = numerator(x)
check(T = x) 
T = numerator(1/x)
check(T = 1) 
T = numerator(a+b)
check(T = a+b) 
T = numerator(1/a+1/b)
check(T = a+b)

check(numerator((a/b,c)) == (a,c))
"Testing numerics"

clear

check(infixform(1) == "1")
check(infixform(12) == "12")
check(infixform(123) == "123")
check(infixform(1234) == "1234")
check(infixform(12345) == "12345")
check(infixform(123456) == "123456")
check(infixform(1234567) == "1234567")
check(infixform(12345678) == "12345678")
check(infixform(123456789) == "123456789")
check(infixform(1234567890) == "1234567890")
check(infixform(12345678901) == "12345678901")
check(infixform(123456789012) == "123456789012")
check(infixform(1234567890123) == "1234567890123")
check(infixform(12345678901234) == "12345678901234")
check(infixform(123456789012345) == "123456789012345")
check(infixform(1234567890123456) == "1234567890123456")
check(infixform(12345678901234567) == "12345678901234567")
check(infixform(123456789012345678) == "123456789012345678")
check(infixform(1234567890123456789) == "1234567890123456789")
check(infixform(12345678901234567890) == "12345678901234567890")

N = 13/4000000

T = N^(3/2)
check(prefixform(T) == "(* 13/8000000000 (^ 13 1/2))")

T = N^(5/2)
check(prefixform(T) == "(* 169/32000000000000000 (^ 13 1/2))")

T = N^(-3/2)
check(prefixform(T) == "(* 8000000000/13 (^ 13 -1/2))")

T = N^(-5/2)
check(prefixform(T) == "(* 32000000000000000/169 (^ 13 -1/2))")

T = sqrt(102)
check(infixform(T)="2^(1/2) 3^(1/2) 17^(1/2)")

T = sqrt(204)
check(infixform(T)="2 3^(1/2) 17^(1/2)")

T = sqrt(408)
check(infixform(T)="2 2^(1/2) 3^(1/2) 17^(1/2)")

T = sqrt(816)
check(infixform(T)="4 3^(1/2) 17^(1/2)")

T = sqrt(2146654199) -- 46327 46337 (less than 2^31)
check(infixform(T) == "46327^(1/2) 46337^(1/2)")

T = sqrt(2147673613) -- 46337 46349 (greater than 2^31)
check(infixform(T) == "2147673613^(1/2)")

for(k,1,100,
N=2^31-k,
M=sqrt(N),
check(N/M=M))

check(1000! ==
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
"Testing polar"

clear

T = polar(1+i)
check(T = 2^(1/2)*exp(1/4*i*pi))
T = polar(-1+i)
check(T = 2^(1/2)*i*exp(1/4*i*pi))
T = polar(-1-i)
check(T = -2^(1/2)*exp(1/4*i*pi))
T = polar(1-i)
check(T = -2^(1/2)*i*exp(1/4*i*pi))

check(infixform(polar(2 + 3 i)) == "13^(1/2) exp(i arctan(3,2))")
check(infixform(polar(2 - 3 i)) == "13^(1/2) exp(-i arctan(3,2))")
check(infixform(polar(-2 + 3 i)) == "13^(1/2) exp(i arctan(3,-2))")
check(infixform(polar(-2 - 3 i)) == "13^(1/2) exp(-i arctan(3,-2))")

check(infixform(polar(1/2)) == "1/2")
check(infixform(polar(-1/2)) == "-1/2")

check(infixform(polar(a)) == "a")
check(infixform(polar(-a)) == "-a")

check(infixform(polar(1/2 a)) == "1/2 a")
check(infixform(polar(-1/2 a)) == "-1/2 a")

check(infixform(polar(a + b)) == "a + b")
check(infixform(polar(i a + i b)) == "i a + i b")

check(infixform(polar(a + i b)) == "(a^2 + b^2)^(1/2) exp(i arctan(b,a))")
"Testing product"

clear

k = 123
check(product(k,1,10,k) == 3628800)
check(k == 123)
"Testing radicals"

clear

check(infixform(sqrt(1/2) + sqrt(1/2)) == "2^(1/2)")
check(infixform(sqrt(2) + sqrt(1/2) + sqrt(1/2)) == "2 2^(1/2)")
check(infixform(sqrt(1/2) + sqrt(1/2) + sqrt(1/2)) == "3 / 2^(1/2)")

check(infixform(A / sqrt(2) + A / sqrt(2)) == "2^(1/2) A")
check(infixform(sqrt(2) A + A / sqrt(2) + A / sqrt(2)) == "2 2^(1/2) A")
"Testing rand"
clear
check(number(rand))
"Testing rationalize"

clear

check(rationalize(0) == 0)
check(rationalize((a,b)) == (a,b))
check(infixform(rationalize((-1)^(-1/4) + 1)) == "(1 + (-1)^(1/4)) / (-1)^(1/4)")

-- test rationalize function (this used to get stuck)

s = 4 E^2
t = -2 E^2 + E^2 exp(i theta) + E^2 exp(-i theta)
u = -2 E^2 - E^2 exp(i theta) - E^2 exp(-i theta)

A = (s^2 + u^2)/t^2
B = 2 s^2/(t u)
C = (s^2 + t^2)/u^2

X = (1 + expcos(theta/2)^4) / expsin(theta/2)^4
Y = 8 / expsin(theta)^2
Z = (1 + expsin(theta/2)^4) / expcos(theta/2)^4

check(rationalize(A + B + C - X - Y - Z) == 0)

f = 1/x + 1/(x + 1)^2
check(infixform(rationalize(f)) == "(x^2 + 3 x + 1) / (x^3 + 2 x^2 + x)")
f = exp(i x) + exp(-i x)
check(infixform(rationalize(f)) == "(exp(2 i x) + 1) exp(-i x)")
"Testing relational operators"

clear

check(test(a + 1 < a + 2,"yes","no") == "yes")
check(test(exp(1) < pi, "yes","no") == "yes")

T = 1==1
check(T = 1)
T = 1==2
check(T = 0)
T = 1>=1
check(T = 1)
T = 1>=2
check(T = 0)
T = 2>=1
check(T = 1)
T = 1>1
check(T = 0)
T = 1>2
check(T = 0)
T = 2>1
check(T = 1)
T = 1<=1
check(T = 1)
T = 1<=2
check(T = 1)
T = 2<=1
check(T = 0)
T = 1<1
check(T = 0)
T = 1<2
check(T = 1)
T = 2<1
check(T = 0)

clear

r = sqrt(x^2 + y^2 + z^2)

Px(f) = -i hbar d(f,x)
Py(f) = -i hbar d(f,y)
Pz(f) = -i hbar d(f,z)

Lx(f) = -i hbar (y d(f,z) - z d(f,y))
Ly(f) = -i hbar (z d(f,x) - x d(f,z))
Lz(f) = -i hbar (x d(f,y) - y d(f,x))

Ax(f) = 1 / m (Py(Lz(f)) - Pz(Ly(f))) -
        i hbar / m Px(f) - kappa / r x f

Ay(f) = 1 / m (Pz(Lx(f)) - Px(Lz(f))) -
        i hbar / m Py(f) - kappa / r y f

Az(f) = 1 / m (Px(Ly(f)) - Py(Lx(f))) -
        i hbar / m Pz(f) - kappa / r z f

P2(f) = Px(Px(f)) + Py(Py(f)) + Pz(Pz(f))
L2(f) = Lx(Lx(f)) + Ly(Ly(f)) + Lz(Lz(f))
A2(f) = Ax(Ax(f)) + Ay(Ay(f)) + Az(Az(f))

H(f) = 1 / (2 m) P2(f) - kappa / r f

psi = f(x,y,z)

check(A2(psi) == 2 / m H(L2(psi) + hbar^2 psi) + kappa^2 psi)

-- tensor equality test

clear

A = ((0,0,0,0),(0,2 M / (r^3 (-2 M / r + 1)) + r^(-2) - 1 / (r^2 (-2 M / r + 1)),0,0),(0,0,0,0),(0,0,0,0))
check(A == 0)
check(0 == A)
check(A == zero(4,4))
check(zero(4,4) == A)
B = A
check(A == B)
B[1,1] = 1
check(not(A == B))

clear

-- dirac from boost
-- requires "shortcut" in eval_testeq()

A = ((E + m, 0, pz, 0),
     (0, E + m, 0, -pz),
     (pz, 0, E + m, 0),
     (0, -pz, 0, E + m)) / sqrt(E + m) / sqrt(2 m)

gamma0 = ((1,0,0,0),(0,1,0,0),(0,0,-1,0),(0,0,0,-1))
pslash = m dot(A,gamma0,inv(A))
check(1/m dot(pslash,A) == dot(A,gamma0))
"Testing roots"

clear

check(roots(1) == nil)
check(roots(x^2 + 1) == nil)

check(roots(125 x^3 - 1) == 1/5)

p = (x - 1) (x + 2)
check(roots(p) == (-2,1))
check(roots(p,x) == (-2,1))

p = t (t - 1/2)
check(roots(p,t) == (0,1/2))

check(roots(x) == 0)
check(roots(x^2) == 0)
check(roots(x^3) == 0)

check(roots(x (x - 1)) == (0,1))
check(roots(x^2 (x - 1)) == (0,1))
check(roots(x^3 (x - 1)) == (0,1))

check(roots((x + 1) x) == (-1,0))
check(roots((x + 1) x^2) == (-1,0))
check(roots((x + 1) x^3) == (-1,0))

check(roots((x + 1) x (x - 1)) == (-1,0,1))
check(roots((x + 1) x^2 (x - 1)) == (-1,0,1))
check(roots((x + 1) x^3 (x - 1)) == (-1,0,1))

p = 2 x^2 + 7 x + 6
check(roots(p) == (-2,-3/2))

p = (x + 2) (x + 3/2)
check(roots(p) == (-2,-3/2))
check(roots(p x) == (-2,-3/2,0))
check(roots(p x^2) == (-2,-3/2,0))

p = ((-5) x - (6)) ((5) x - (7)) ((-9) x - (-1))
r = (-6/5,1/9,7/5)
check(roots(p) == r)
p = ((7) x - (-1)) ((-8) x - (8)) ((-7) x - (-1))
r = (-8/8,-1/7,1/7)
check(roots(p) == r)
p = ((-5) x - (7)) ((-9) x - (8)) ((-6) x - (-9))
r = (-7/5,-8/9,9/6)
check(roots(p) == r)
p = ((-7) x - (-9)) ((8) x - (2)) ((4) x - (-4))
r = (-4/4,2/8,9/7)
check(roots(p) == r)
p = ((8) x - (1)) ((-9) x - (1)) ((-7) x - (-5))
r = (-1/9,1/8,5/7)
check(roots(p) == r)
p = ((-8) x - (7)) ((6) x - (-6)) ((7) x - (-1))
r = (-6/6,-7/8,-1/7)
check(roots(p) == r)
p = ((-3) x - (7)) ((1) x - (-4)) ((6) x - (7))
r = (-4/1,-7/3,7/6)
check(roots(p) == r)
p = ((-8) x - (3)) ((-4) x - (3)) ((3) x - (-2))
r = (-3/4,-2/3,-3/8)
check(roots(p) == r)
p = ((4) x - (-6)) ((-6) x - (4)) ((-8) x - (9))
r = (-6/4,-9/8,-4/6)
check(roots(p) == r)
p = ((-1) x - (7)) ((8) x - (6)) ((2) x - (-8))
r = (-7/1,-8/2,6/8)
check(roots(p) == r)
p = ((5) x - (-2)) ((1) x - (-7)) ((-9) x - (-6))
r = (-7/1,-2/5,6/9)
check(roots(p) == r)
p = ((2) x - (-6)) ((9) x - (9)) ((-7) x - (-4))
r = (-6/2,4/7,9/9)
check(roots(p) == r)
p = ((8) x - (2)) ((1) x - (3)) ((1) x - (7))
r = (2/8,3/1,7/1)
check(roots(p) == r)
p = ((8) x - (9)) ((8) x - (2)) ((-9) x - (-8))
r = (2/8,8/9,9/8)
check(roots(p) == r)
p = ((-5) x - (-9)) ((-3) x - (-2)) ((5) x - (6))
r = (2/3,6/5,9/5)
check(roots(p) == r)
p = ((-2) x - (7)) ((-8) x - (7)) ((-4) x - (9))
r = (-7/2,-9/4,-7/8)
check(roots(p) == r)
p = ((-7) x - (-8)) ((-6) x - (-4)) ((9) x - (-9))
r = (-9/9,4/6,8/7)
check(roots(p) == r)
p = ((-1) x - (-8)) ((5) x - (6)) ((-4) x - (-5))
r = (6/5,5/4,8/1)
check(roots(p) == r)
p = ((-4) x - (5)) ((6) x - (-9)) ((-2) x - (-2))
r = (-9/6,-5/4,2/2)
check(roots(p) == r)
p = ((-6) x - (4)) ((1) x - (6)) ((-1) x - (7))
r = (-7/1,-4/6,6/1)
check(roots(p) == r)
p = ((-7) x - (-1)) ((-1) x - (4)) ((-6) x - (3))
r = (-4/1,-3/6,1/7)
check(roots(p) == r)
p = ((-8) x - (2)) ((-7) x - (-4)) ((9) x - (-6))
r = (-6/9,-2/8,4/7)
check(roots(p) == r)
p = ((4) x - (9)) ((8) x - (-5)) ((-6) x - (-5))
r = (-5/8,5/6,9/4)
check(roots(p) == r)
p = ((-6) x - (-4)) ((-4) x - (-6)) ((3) x - (7))
r = (4/6,6/4,7/3)
check(roots(p) == r)
p = ((9) x - (8)) ((7) x - (-3)) ((8) x - (-7))
r = (-7/8,-3/7,8/9)
check(roots(p) == r)
p = ((3) x - (3)) ((-6) x - (6)) ((-7) x - (-3))
r = (-6/6,3/7,3/3)
check(roots(p) == r)
p = ((5) x - (-5)) ((1) x - (-7)) ((1) x - (1))
r = (-7/1,-5/5,1/1)
check(roots(p) == r)
p = ((2) x - (-5)) ((3) x - (1)) ((8) x - (7))
r = (-5/2,1/3,7/8)
check(roots(p) == r)
p = ((-2) x - (3)) ((9) x - (1)) ((-4) x - (-1))
r = (-3/2,1/9,1/4)
check(roots(p) == r)
p = ((6) x - (-8)) ((-8) x - (-4)) ((-7) x - (-1))
r = (-8/6,1/7,4/8)
check(roots(p) == r)
p = ((-1) x - (-3)) ((1) x - (6)) ((-1) x - (7))
r = (-7/1,3/1,6/1)
check(roots(p) == r)
p = ((-4) x - (-8)) ((6) x - (4)) ((6) x - (2))
r = (2/6,4/6,8/4)
check(roots(p) == r)
p = ((-6) x - (9)) ((2) x - (-9)) ((-1) x - (2))
r = (-9/2,-2/1,-9/6)
check(roots(p) == r)
p = ((-7) x - (-6)) ((4) x - (-4)) ((-7) x - (9))
r = (-9/7,-4/4,6/7)
check(roots(p) == r)
p = ((4) x - (-4)) ((7) x - (-9)) ((-9) x - (-4))
r = (-9/7,-4/4,4/9)
check(roots(p) == r)
p = ((9) x - (5)) ((-6) x - (-6)) ((-6) x - (-5))
r = (5/9,5/6,6/6)
check(roots(p) == r)
p = ((5) x - (-7)) ((-5) x - (4)) ((-6) x - (-1))
r = (-7/5,-4/5,1/6)
check(roots(p) == r)
p = ((3) x - (6)) ((-9) x - (6)) ((-9) x - (-3))
r = (-6/9,3/9,6/3)
check(roots(p) == r)
p = ((-9) x - (-3)) ((3) x - (7)) ((-3) x - (-9))
r = (3/9,7/3,9/3)
check(roots(p) == r)
p = ((6) x - (-2)) ((-5) x - (8)) ((5) x - (7))
r = (-8/5,-2/6,7/5)
check(roots(p) == r)
p = ((4) x - (-8)) ((-7) x - (-6)) ((1) x - (-6))
r = (-6/1,-8/4,6/7)
check(roots(p) == r)
p = ((-5) x - (-6)) ((4) x - (-6)) ((6) x - (-8))
r = (-6/4,-8/6,6/5)
check(roots(p) == r)
p = ((-5) x - (-8)) ((-9) x - (2)) ((-6) x - (-1))
r = (-2/9,1/6,8/5)
check(roots(p) == r)
p = ((5) x - (-7)) ((-3) x - (4)) ((6) x - (-6))
r = (-7/5,-4/3,-6/6)
check(roots(p) == r)
p = ((3) x - (4)) ((7) x - (-2)) ((4) x - (7))
r = (-2/7,4/3,7/4)
check(roots(p) == r)
p = ((2) x - (-8)) ((-9) x - (9)) ((1) x - (-8))
r = (-8/1,-8/2,-9/9)
check(roots(p) == r)
p = ((-1) x - (7)) ((5) x - (-4)) ((-6) x - (8))
r = (-7/1,-8/6,-4/5)
check(roots(p) == r)
p = ((4) x - (-5)) ((8) x - (4)) ((-9) x - (-9))
r = (-5/4,4/8,9/9)
check(roots(p) == r)
p = ((-4) x - (-4)) ((1) x - (-5)) ((-9) x - (-2))
r = (-5/1,2/9,4/4)
check(roots(p) == r)
p = ((-4) x - (-9)) ((6) x - (9)) ((-3) x - (3))
r = (-3/3,9/6,9/4)
check(roots(p) == r)
p = ((3) x - (-2)) ((-4) x - (3)) ((4) x - (-4))
r = (-4/4,-3/4,-2/3)
check(roots(p) == r)
p = ((-2) x - (9)) ((-7) x - (-9)) ((1) x - (-8))
r = (-8/1,-9/2,9/7)
check(roots(p) == r)
p = ((-9) x - (-3)) ((-3) x - (-3)) ((6) x - (1))
r = (1/6,3/9,3/3)
check(roots(p) == r)
p = ((2) x - (-4)) ((-8) x - (8)) ((-6) x - (2))
r = (-4/2,-8/8,-2/6)
check(roots(p) == r)
p = ((-5) x - (7)) ((-8) x - (7)) ((-3) x - (1))
r = (-7/5,-7/8,-1/3)
check(roots(p) == r)
p = ((-8) x - (2)) ((2) x - (-4)) ((8) x - (-8))
r = (-4/2,-8/8,-2/8)
check(roots(p) == r)
p = ((3) x - (2)) ((6) x - (-8)) ((9) x - (5))
r = (-8/6,5/9,2/3)
check(roots(p) == r)
p = ((-9) x - (1)) ((-8) x - (9)) ((-1) x - (-2))
r = (-9/8,-1/9,2/1)
check(roots(p) == r)
p = ((-3) x - (2)) ((-2) x - (3)) ((-5) x - (-9))
r = (-3/2,-2/3,9/5)
check(roots(p) == r)
p = ((-5) x - (-1)) ((-7) x - (7)) ((6) x - (-1))
r = (-7/7,-1/6,1/5)
check(roots(p) == r)
p = ((4) x - (8)) ((-8) x - (-1)) ((7) x - (6))
r = (1/8,6/7,8/4)
check(roots(p) == r)
p = ((-3) x - (3)) ((2) x - (-3)) ((-1) x - (6))
r = (-6/1,-3/2,-3/3)
check(roots(p) == r)
p = ((5) x - (-1)) ((6) x - (9)) ((2) x - (2))
r = (-1/5,2/2,9/6)
check(roots(p) == r)
p = ((7) x - (2)) ((-1) x - (-9)) ((-4) x - (-1))
r = (1/4,2/7,9/1)
check(roots(p) == r)
p = ((7) x - (-4)) ((-5) x - (3)) ((-1) x - (9))
r = (-9/1,-3/5,-4/7)
check(roots(p) == r)
p = ((-7) x - (2)) ((-1) x - (7)) ((-6) x - (6))
r = (-7/1,-6/6,-2/7)
check(roots(p) == r)
p = ((7) x - (6)) ((8) x - (9)) ((1) x - (-1))
r = (-1/1,6/7,9/8)
check(roots(p) == r)
p = ((-2) x - (4)) ((-2) x - (-3)) ((-8) x - (-2))
r = (-4/2,2/8,3/2)
check(roots(p) == r)
p = ((-1) x - (3)) ((5) x - (8)) ((2) x - (4))
r = (-3/1,8/5,4/2)
check(roots(p) == r)
p = ((2) x - (-8)) ((7) x - (-7)) ((-1) x - (-2))
r = (-8/2,-7/7,2/1)
check(roots(p) == r)
p = ((6) x - (8)) ((-6) x - (-7)) ((9) x - (-7))
r = (-7/9,7/6,8/6)
check(roots(p) == r)
p = ((5) x - (-3)) ((5) x - (-7)) ((2) x - (-8))
r = (-8/2,-7/5,-3/5)
check(roots(p) == r)
p = ((9) x - (-7)) ((-3) x - (-1)) ((6) x - (-8))
r = (-8/6,-7/9,1/3)
check(roots(p) == r)
p = ((6) x - (5)) ((-1) x - (9)) ((3) x - (-7))
r = (-9/1,-7/3,5/6)
check(roots(p) == r)
p = ((2) x - (3)) ((-9) x - (-1)) ((9) x - (9))
r = (1/9,9/9,3/2)
check(roots(p) == r)
p = ((-4) x - (-4)) ((3) x - (-6)) ((-6) x - (5))
r = (-6/3,-5/6,4/4)
check(roots(p) == r)
p = ((-8) x - (-2)) ((-5) x - (-3)) ((8) x - (-1))
r = (-1/8,2/8,3/5)
check(roots(p) == r)
p = ((3) x - (2)) ((-4) x - (2)) ((-9) x - (-8))
r = (-2/4,2/3,8/9)
check(roots(p) == r)
p = ((-5) x - (1)) ((-4) x - (1)) ((-6) x - (1))
r = (-1/4,-1/5,-1/6)
check(roots(p) == r)
p = ((1) x - (-7)) ((-1) x - (6)) ((-2) x - (4))
r = (-7/1,-6/1,-4/2)
check(roots(p) == r)
p = ((2) x - (-4)) ((2) x - (9)) ((-6) x - (-2))
r = (-4/2,2/6,9/2)
check(roots(p) == r)
p = ((2) x - (1)) ((6) x - (5)) ((9) x - (-3))
r = (-3/9,1/2,5/6)
check(roots(p) == r)
p = ((-7) x - (-8)) ((-7) x - (6)) ((7) x - (-1))
r = (-6/7,-1/7,8/7)
check(roots(p) == r)
p = ((8) x - (7)) ((-3) x - (7)) ((-1) x - (-8))
r = (-7/3,7/8,8/1)
check(roots(p) == r)
p = ((-1) x - (6)) ((5) x - (2)) ((3) x - (-4))
r = (-6/1,-4/3,2/5)
check(roots(p) == r)
p = ((8) x - (-9)) ((3) x - (1)) ((8) x - (9))
r = (-9/8,1/3,9/8)
check(roots(p) == r)
p = ((-7) x - (4)) ((8) x - (-6)) ((7) x - (3))
r = (-6/8,-4/7,3/7)
check(roots(p) == r)
p = ((-4) x - (2)) ((9) x - (4)) ((2) x - (8))
r = (-2/4,4/9,8/2)
check(roots(p) == r)
p = ((1) x - (-9)) ((-1) x - (-2)) ((-8) x - (-9))
r = (-9/1,9/8,2/1)
check(roots(p) == r)
p = ((-2) x - (-4)) ((-7) x - (8)) ((2) x - (-7))
r = (-7/2,-8/7,4/2)
check(roots(p) == r)
p = ((8) x - (-2)) ((2) x - (9)) ((4) x - (6))
r = (-2/8,6/4,9/2)
check(roots(p) == r)
p = ((7) x - (-8)) ((-4) x - (-6)) ((8) x - (9))
r = (-8/7,9/8,6/4)
check(roots(p) == r)
p = ((6) x - (1)) ((-5) x - (-2)) ((5) x - (-8))
r = (-8/5,1/6,2/5)
check(roots(p) == r)
p = ((8) x - (-5)) ((-2) x - (8)) ((2) x - (6))
r = (-8/2,-5/8,6/2)
check(roots(p) == r)
p = ((8) x - (-2)) ((-6) x - (-3)) ((2) x - (-4))
r = (-4/2,-2/8,3/6)
check(roots(p) == r)
p = ((-6) x - (-6)) ((9) x - (1)) ((-7) x - (-2))
r = (1/9,2/7,6/6)
check(roots(p) == r)
p = ((-1) x - (-3)) ((2) x - (-8)) ((6) x - (5))
r = (-8/2,5/6,3/1)
check(roots(p) == r)
p = ((-8) x - (5)) ((4) x - (3)) ((7) x - (-9))
r = (-9/7,-5/8,3/4)
check(roots(p) == r)
p = ((-5) x - (-5)) ((-7) x - (2)) ((3) x - (-7))
r = (-7/3,-2/7,5/5)
check(roots(p) == r)
p = ((2) x - (1)) ((3) x - (-9)) ((3) x - (6))
r = (-9/3,1/2,6/3)
check(roots(p) == r)
"Testing rotate"

clear

ket0 = (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket1 = (0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket2 = (0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket3 = (0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0)
ket4 = (0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0)
ket5 = (0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0)
ket6 = (0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0)
ket7 = (0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0)
ket8 = (0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0)
ket9 = (0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0)
ket10 = (0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0)
ket11 = (0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0)
ket12 = (0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0)
ket13 = (0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0)
ket14 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0)
ket15 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)

H0 =
sqrt(1/2) outer(ket0,ket0 + ket1) +
sqrt(1/2) outer(ket1,ket0 - ket1) +
sqrt(1/2) outer(ket2,ket2 + ket3) +
sqrt(1/2) outer(ket3,ket2 - ket3) +
sqrt(1/2) outer(ket4,ket4 + ket5) +
sqrt(1/2) outer(ket5,ket4 - ket5) +
sqrt(1/2) outer(ket6,ket6 + ket7) +
sqrt(1/2) outer(ket7,ket6 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket9) +
sqrt(1/2) outer(ket9,ket8 - ket9) +
sqrt(1/2) outer(ket10,ket10 + ket11) +
sqrt(1/2) outer(ket11,ket10 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket13) +
sqrt(1/2) outer(ket13,ket12 - ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P0(phi) = I - P0M + exp(i phi) P0M

P0M =
outer(ket1,ket1) +
outer(ket3,ket3) +
outer(ket5,ket5) +
outer(ket7,ket7) +
outer(ket9,ket9) +
outer(ket11,ket11) +
outer(ket13,ket13) +
outer(ket15,ket15)

X0 =
outer(ket0,ket1) +
outer(ket1,ket0) +
outer(ket2,ket3) +
outer(ket3,ket2) +
outer(ket4,ket5) +
outer(ket5,ket4) +
outer(ket6,ket7) +
outer(ket7,ket6) +
outer(ket8,ket9) +
outer(ket9,ket8) +
outer(ket10,ket11) +
outer(ket11,ket10) +
outer(ket12,ket13) +
outer(ket13,ket12) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y0 =
outer(ket0,-i ket1) +
outer(ket1,i ket0) +
outer(ket2,-i ket3) +
outer(ket3,i ket2) +
outer(ket4,-i ket5) +
outer(ket5,i ket4) +
outer(ket6,-i ket7) +
outer(ket7,i ket6) +
outer(ket8,-i ket9) +
outer(ket9,i ket8) +
outer(ket10,-i ket11) +
outer(ket11,i ket10) +
outer(ket12,-i ket13) +
outer(ket13,i ket12) +
outer(ket14,-i ket15) +
outer(ket15,i ket14)

Z0 =
outer(ket0,ket0) +
outer(ket1,-ket1) +
outer(ket2,ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,-ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,-ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

H00 =
sqrt(1/2) outer(ket0,ket0 + ket1) +
sqrt(1/2) outer(ket1,ket0 - ket1) +
sqrt(1/2) outer(ket2,ket2 + ket3) +
sqrt(1/2) outer(ket3,ket2 - ket3) +
sqrt(1/2) outer(ket4,ket4 + ket5) +
sqrt(1/2) outer(ket5,ket4 - ket5) +
sqrt(1/2) outer(ket6,ket6 + ket7) +
sqrt(1/2) outer(ket7,ket6 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket9) +
sqrt(1/2) outer(ket9,ket8 - ket9) +
sqrt(1/2) outer(ket10,ket10 + ket11) +
sqrt(1/2) outer(ket11,ket10 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket13) +
sqrt(1/2) outer(ket13,ket12 - ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P00(phi) = I - P00M + exp(i phi) P00M

P00M =
outer(ket1,ket1) +
outer(ket3,ket3) +
outer(ket5,ket5) +
outer(ket7,ket7) +
outer(ket9,ket9) +
outer(ket11,ket11) +
outer(ket13,ket13) +
outer(ket15,ket15)

X00 =
outer(ket0,ket1) +
outer(ket1,ket0) +
outer(ket2,ket3) +
outer(ket3,ket2) +
outer(ket4,ket5) +
outer(ket5,ket4) +
outer(ket6,ket7) +
outer(ket7,ket6) +
outer(ket8,ket9) +
outer(ket9,ket8) +
outer(ket10,ket11) +
outer(ket11,ket10) +
outer(ket12,ket13) +
outer(ket13,ket12) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y00 =
outer(ket0,-i ket1) +
outer(ket1,i ket0) +
outer(ket2,-i ket3) +
outer(ket3,i ket2) +
outer(ket4,-i ket5) +
outer(ket5,i ket4) +
outer(ket6,-i ket7) +
outer(ket7,i ket6) +
outer(ket8,-i ket9) +
outer(ket9,i ket8) +
outer(ket10,-i ket11) +
outer(ket11,i ket10) +
outer(ket12,-i ket13) +
outer(ket13,i ket12) +
outer(ket14,-i ket15) +
outer(ket15,i ket14)

Z00 =
outer(ket0,ket0) +
outer(ket1,-ket1) +
outer(ket2,ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,-ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,-ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W00 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H10 =
outer(ket0,ket0) +
outer(ket1,ket1) +
sqrt(1/2) outer(ket2,ket2 + ket3) +
sqrt(1/2) outer(ket3,ket2 - ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
sqrt(1/2) outer(ket6,ket6 + ket7) +
sqrt(1/2) outer(ket7,ket6 - ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
sqrt(1/2) outer(ket10,ket10 + ket11) +
sqrt(1/2) outer(ket11,ket10 - ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P10(phi) = I - P10M + exp(i phi) P10M

P10M =
outer(ket3,ket3) +
outer(ket7,ket7) +
outer(ket11,ket11) +
outer(ket15,ket15)

X10 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket3) +
outer(ket3,ket2) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket7) +
outer(ket7,ket6) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket11) +
outer(ket11,ket10) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y10 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,-i ket3) +
outer(ket3,i ket2) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-i ket7) +
outer(ket7,i ket6) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-i ket11) +
outer(ket11,i ket10) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-i ket15) +
outer(ket15,i ket14)

Z10 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W10 =
outer(ket0,ket0) +
outer(ket1,ket2) +
outer(ket2,ket1) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket6) +
outer(ket6,ket5) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket10) +
outer(ket10,ket9) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket14) +
outer(ket14,ket13) +
outer(ket15,ket15)

H20 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
sqrt(1/2) outer(ket4,ket4 + ket5) +
sqrt(1/2) outer(ket5,ket4 - ket5) +
sqrt(1/2) outer(ket6,ket6 + ket7) +
sqrt(1/2) outer(ket7,ket6 - ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
sqrt(1/2) outer(ket12,ket12 + ket13) +
sqrt(1/2) outer(ket13,ket12 - ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P20(phi) = I - P20M + exp(i phi) P20M

P20M =
outer(ket5,ket5) +
outer(ket7,ket7) +
outer(ket13,ket13) +
outer(ket15,ket15)

X20 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket5) +
outer(ket5,ket4) +
outer(ket6,ket7) +
outer(ket7,ket6) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket13) +
outer(ket13,ket12) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y20 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,-i ket5) +
outer(ket5,i ket4) +
outer(ket6,-i ket7) +
outer(ket7,i ket6) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-i ket13) +
outer(ket13,i ket12) +
outer(ket14,-i ket15) +
outer(ket15,i ket14)

Z20 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,-ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W20 =
outer(ket0,ket0) +
outer(ket1,ket4) +
outer(ket2,ket2) +
outer(ket3,ket6) +
outer(ket4,ket1) +
outer(ket5,ket5) +
outer(ket6,ket3) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket12) +
outer(ket10,ket10) +
outer(ket11,ket14) +
outer(ket12,ket9) +
outer(ket13,ket13) +
outer(ket14,ket11) +
outer(ket15,ket15)

H30 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
sqrt(1/2) outer(ket8,ket8 + ket9) +
sqrt(1/2) outer(ket9,ket8 - ket9) +
sqrt(1/2) outer(ket10,ket10 + ket11) +
sqrt(1/2) outer(ket11,ket10 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket13) +
sqrt(1/2) outer(ket13,ket12 - ket13) +
sqrt(1/2) outer(ket14,ket14 + ket15) +
sqrt(1/2) outer(ket15,ket14 - ket15)

P30(phi) = I - P30M + exp(i phi) P30M

P30M =
outer(ket9,ket9) +
outer(ket11,ket11) +
outer(ket13,ket13) +
outer(ket15,ket15)

X30 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket9) +
outer(ket9,ket8) +
outer(ket10,ket11) +
outer(ket11,ket10) +
outer(ket12,ket13) +
outer(ket13,ket12) +
outer(ket14,ket15) +
outer(ket15,ket14)

Y30 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,-i ket9) +
outer(ket9,i ket8) +
outer(ket10,-i ket11) +
outer(ket11,i ket10) +
outer(ket12,-i ket13) +
outer(ket13,i ket12) +
outer(ket14,-i ket15) +
outer(ket15,i ket14)

Z30 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,-ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W30 =
outer(ket0,ket0) +
outer(ket1,ket8) +
outer(ket2,ket2) +
outer(ket3,ket10) +
outer(ket4,ket4) +
outer(ket5,ket12) +
outer(ket6,ket6) +
outer(ket7,ket14) +
outer(ket8,ket1) +
outer(ket9,ket9) +
outer(ket10,ket3) +
outer(ket11,ket11) +
outer(ket12,ket5) +
outer(ket13,ket13) +
outer(ket14,ket7) +
outer(ket15,ket15)

H1 =
sqrt(1/2) outer(ket0,ket0 + ket2) +
sqrt(1/2) outer(ket1,ket1 + ket3) +
sqrt(1/2) outer(ket2,ket0 - ket2) +
sqrt(1/2) outer(ket3,ket1 - ket3) +
sqrt(1/2) outer(ket4,ket4 + ket6) +
sqrt(1/2) outer(ket5,ket5 + ket7) +
sqrt(1/2) outer(ket6,ket4 - ket6) +
sqrt(1/2) outer(ket7,ket5 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket10) +
sqrt(1/2) outer(ket9,ket9 + ket11) +
sqrt(1/2) outer(ket10,ket8 - ket10) +
sqrt(1/2) outer(ket11,ket9 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket14) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
sqrt(1/2) outer(ket14,ket12 - ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P1(phi) = I - P1M + exp(i phi) P1M

P1M =
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

X1 =
outer(ket0,ket2) +
outer(ket1,ket3) +
outer(ket2,ket0) +
outer(ket3,ket1) +
outer(ket4,ket6) +
outer(ket5,ket7) +
outer(ket6,ket4) +
outer(ket7,ket5) +
outer(ket8,ket10) +
outer(ket9,ket11) +
outer(ket10,ket8) +
outer(ket11,ket9) +
outer(ket12,ket14) +
outer(ket13,ket15) +
outer(ket14,ket12) +
outer(ket15,ket13)

Y1 =
outer(ket0,-i ket2) +
outer(ket1,-i ket3) +
outer(ket2,i ket0) +
outer(ket3,i ket1) +
outer(ket4,-i ket6) +
outer(ket5,-i ket7) +
outer(ket6,i ket4) +
outer(ket7,i ket5) +
outer(ket8,-i ket10) +
outer(ket9,-i ket11) +
outer(ket10,i ket8) +
outer(ket11,i ket9) +
outer(ket12,-i ket14) +
outer(ket13,-i ket15) +
outer(ket14,i ket12) +
outer(ket15,i ket13)

Z1 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,-ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

H01 =
outer(ket0,ket0) +
sqrt(1/2) outer(ket1,ket1 + ket3) +
outer(ket2,ket2) +
sqrt(1/2) outer(ket3,ket1 - ket3) +
outer(ket4,ket4) +
sqrt(1/2) outer(ket5,ket5 + ket7) +
outer(ket6,ket6) +
sqrt(1/2) outer(ket7,ket5 - ket7) +
outer(ket8,ket8) +
sqrt(1/2) outer(ket9,ket9 + ket11) +
outer(ket10,ket10) +
sqrt(1/2) outer(ket11,ket9 - ket11) +
outer(ket12,ket12) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
outer(ket14,ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P01(phi) = I - P01M + exp(i phi) P01M

P01M =
outer(ket3,ket3) +
outer(ket7,ket7) +
outer(ket11,ket11) +
outer(ket15,ket15)

X01 =
outer(ket0,ket0) +
outer(ket1,ket3) +
outer(ket2,ket2) +
outer(ket3,ket1) +
outer(ket4,ket4) +
outer(ket5,ket7) +
outer(ket6,ket6) +
outer(ket7,ket5) +
outer(ket8,ket8) +
outer(ket9,ket11) +
outer(ket10,ket10) +
outer(ket11,ket9) +
outer(ket12,ket12) +
outer(ket13,ket15) +
outer(ket14,ket14) +
outer(ket15,ket13)

Y01 =
outer(ket0,ket0) +
outer(ket1,-i ket3) +
outer(ket2,ket2) +
outer(ket3,i ket1) +
outer(ket4,ket4) +
outer(ket5,-i ket7) +
outer(ket6,ket6) +
outer(ket7,i ket5) +
outer(ket8,ket8) +
outer(ket9,-i ket11) +
outer(ket10,ket10) +
outer(ket11,i ket9) +
outer(ket12,ket12) +
outer(ket13,-i ket15) +
outer(ket14,ket14) +
outer(ket15,i ket13)

Z01 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W01 =
outer(ket0,ket0) +
outer(ket1,ket2) +
outer(ket2,ket1) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket6) +
outer(ket6,ket5) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket10) +
outer(ket10,ket9) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket14) +
outer(ket14,ket13) +
outer(ket15,ket15)

H11 =
sqrt(1/2) outer(ket0,ket0 + ket2) +
sqrt(1/2) outer(ket1,ket1 + ket3) +
sqrt(1/2) outer(ket2,ket0 - ket2) +
sqrt(1/2) outer(ket3,ket1 - ket3) +
sqrt(1/2) outer(ket4,ket4 + ket6) +
sqrt(1/2) outer(ket5,ket5 + ket7) +
sqrt(1/2) outer(ket6,ket4 - ket6) +
sqrt(1/2) outer(ket7,ket5 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket10) +
sqrt(1/2) outer(ket9,ket9 + ket11) +
sqrt(1/2) outer(ket10,ket8 - ket10) +
sqrt(1/2) outer(ket11,ket9 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket14) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
sqrt(1/2) outer(ket14,ket12 - ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P11(phi) = I - P11M + exp(i phi) P11M

P11M =
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

X11 =
outer(ket0,ket2) +
outer(ket1,ket3) +
outer(ket2,ket0) +
outer(ket3,ket1) +
outer(ket4,ket6) +
outer(ket5,ket7) +
outer(ket6,ket4) +
outer(ket7,ket5) +
outer(ket8,ket10) +
outer(ket9,ket11) +
outer(ket10,ket8) +
outer(ket11,ket9) +
outer(ket12,ket14) +
outer(ket13,ket15) +
outer(ket14,ket12) +
outer(ket15,ket13)

Y11 =
outer(ket0,-i ket2) +
outer(ket1,-i ket3) +
outer(ket2,i ket0) +
outer(ket3,i ket1) +
outer(ket4,-i ket6) +
outer(ket5,-i ket7) +
outer(ket6,i ket4) +
outer(ket7,i ket5) +
outer(ket8,-i ket10) +
outer(ket9,-i ket11) +
outer(ket10,i ket8) +
outer(ket11,i ket9) +
outer(ket12,-i ket14) +
outer(ket13,-i ket15) +
outer(ket14,i ket12) +
outer(ket15,i ket13)

Z11 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,-ket2) +
outer(ket3,-ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W11 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
sqrt(1/2) outer(ket4,ket4 + ket6) +
sqrt(1/2) outer(ket5,ket5 + ket7) +
sqrt(1/2) outer(ket6,ket4 - ket6) +
sqrt(1/2) outer(ket7,ket5 - ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
sqrt(1/2) outer(ket12,ket12 + ket14) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
sqrt(1/2) outer(ket14,ket12 - ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P21(phi) = I - P21M + exp(i phi) P21M

P21M =
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket14,ket14) +
outer(ket15,ket15)

X21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket6) +
outer(ket5,ket7) +
outer(ket6,ket4) +
outer(ket7,ket5) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket14) +
outer(ket13,ket15) +
outer(ket14,ket12) +
outer(ket15,ket13)

Y21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,-i ket6) +
outer(ket5,-i ket7) +
outer(ket6,i ket4) +
outer(ket7,i ket5) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-i ket14) +
outer(ket13,-i ket15) +
outer(ket14,i ket12) +
outer(ket15,i ket13)

Z21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W21 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket4) +
outer(ket3,ket5) +
outer(ket4,ket2) +
outer(ket5,ket3) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket12) +
outer(ket11,ket13) +
outer(ket12,ket10) +
outer(ket13,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

H31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
sqrt(1/2) outer(ket8,ket8 + ket10) +
sqrt(1/2) outer(ket9,ket9 + ket11) +
sqrt(1/2) outer(ket10,ket8 - ket10) +
sqrt(1/2) outer(ket11,ket9 - ket11) +
sqrt(1/2) outer(ket12,ket12 + ket14) +
sqrt(1/2) outer(ket13,ket13 + ket15) +
sqrt(1/2) outer(ket14,ket12 - ket14) +
sqrt(1/2) outer(ket15,ket13 - ket15)

P31(phi) = I - P31M + exp(i phi) P31M

P31M =
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

X31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket10) +
outer(ket9,ket11) +
outer(ket10,ket8) +
outer(ket11,ket9) +
outer(ket12,ket14) +
outer(ket13,ket15) +
outer(ket14,ket12) +
outer(ket15,ket13)

Y31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,-i ket10) +
outer(ket9,-i ket11) +
outer(ket10,i ket8) +
outer(ket11,i ket9) +
outer(ket12,-i ket14) +
outer(ket13,-i ket15) +
outer(ket14,i ket12) +
outer(ket15,i ket13)

Z31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W31 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket8) +
outer(ket3,ket9) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket12) +
outer(ket7,ket13) +
outer(ket8,ket2) +
outer(ket9,ket3) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket6) +
outer(ket13,ket7) +
outer(ket14,ket14) +
outer(ket15,ket15)

H2 =
sqrt(1/2) outer(ket0,ket0 + ket4) +
sqrt(1/2) outer(ket1,ket1 + ket5) +
sqrt(1/2) outer(ket2,ket2 + ket6) +
sqrt(1/2) outer(ket3,ket3 + ket7) +
sqrt(1/2) outer(ket4,ket0 - ket4) +
sqrt(1/2) outer(ket5,ket1 - ket5) +
sqrt(1/2) outer(ket6,ket2 - ket6) +
sqrt(1/2) outer(ket7,ket3 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket12) +
sqrt(1/2) outer(ket9,ket9 + ket13) +
sqrt(1/2) outer(ket10,ket10 + ket14) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
sqrt(1/2) outer(ket12,ket8 - ket12) +
sqrt(1/2) outer(ket13,ket9 - ket13) +
sqrt(1/2) outer(ket14,ket10 - ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P2(phi) = I - P2M + exp(i phi) P2M

P2M =
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X2 =
outer(ket0,ket4) +
outer(ket1,ket5) +
outer(ket2,ket6) +
outer(ket3,ket7) +
outer(ket4,ket0) +
outer(ket5,ket1) +
outer(ket6,ket2) +
outer(ket7,ket3) +
outer(ket8,ket12) +
outer(ket9,ket13) +
outer(ket10,ket14) +
outer(ket11,ket15) +
outer(ket12,ket8) +
outer(ket13,ket9) +
outer(ket14,ket10) +
outer(ket15,ket11)

Y2 =
outer(ket0,-i ket4) +
outer(ket1,-i ket5) +
outer(ket2,-i ket6) +
outer(ket3,-i ket7) +
outer(ket4,i ket0) +
outer(ket5,i ket1) +
outer(ket6,i ket2) +
outer(ket7,i ket3) +
outer(ket8,-i ket12) +
outer(ket9,-i ket13) +
outer(ket10,-i ket14) +
outer(ket11,-i ket15) +
outer(ket12,i ket8) +
outer(ket13,i ket9) +
outer(ket14,i ket10) +
outer(ket15,i ket11)

Z2 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,-ket4) +
outer(ket5,-ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

H02 =
outer(ket0,ket0) +
sqrt(1/2) outer(ket1,ket1 + ket5) +
outer(ket2,ket2) +
sqrt(1/2) outer(ket3,ket3 + ket7) +
outer(ket4,ket4) +
sqrt(1/2) outer(ket5,ket1 - ket5) +
outer(ket6,ket6) +
sqrt(1/2) outer(ket7,ket3 - ket7) +
outer(ket8,ket8) +
sqrt(1/2) outer(ket9,ket9 + ket13) +
outer(ket10,ket10) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
outer(ket12,ket12) +
sqrt(1/2) outer(ket13,ket9 - ket13) +
outer(ket14,ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P02(phi) = I - P02M + exp(i phi) P02M

P02M =
outer(ket5,ket5) +
outer(ket7,ket7) +
outer(ket13,ket13) +
outer(ket15,ket15)

X02 =
outer(ket0,ket0) +
outer(ket1,ket5) +
outer(ket2,ket2) +
outer(ket3,ket7) +
outer(ket4,ket4) +
outer(ket5,ket1) +
outer(ket6,ket6) +
outer(ket7,ket3) +
outer(ket8,ket8) +
outer(ket9,ket13) +
outer(ket10,ket10) +
outer(ket11,ket15) +
outer(ket12,ket12) +
outer(ket13,ket9) +
outer(ket14,ket14) +
outer(ket15,ket11)

Y02 =
outer(ket0,ket0) +
outer(ket1,-i ket5) +
outer(ket2,ket2) +
outer(ket3,-i ket7) +
outer(ket4,ket4) +
outer(ket5,i ket1) +
outer(ket6,ket6) +
outer(ket7,i ket3) +
outer(ket8,ket8) +
outer(ket9,-i ket13) +
outer(ket10,ket10) +
outer(ket11,-i ket15) +
outer(ket12,ket12) +
outer(ket13,i ket9) +
outer(ket14,ket14) +
outer(ket15,i ket11)

Z02 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,-ket5) +
outer(ket6,ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W02 =
outer(ket0,ket0) +
outer(ket1,ket4) +
outer(ket2,ket2) +
outer(ket3,ket6) +
outer(ket4,ket1) +
outer(ket5,ket5) +
outer(ket6,ket3) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket12) +
outer(ket10,ket10) +
outer(ket11,ket14) +
outer(ket12,ket9) +
outer(ket13,ket13) +
outer(ket14,ket11) +
outer(ket15,ket15)

H12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
sqrt(1/2) outer(ket2,ket2 + ket6) +
sqrt(1/2) outer(ket3,ket3 + ket7) +
outer(ket4,ket4) +
outer(ket5,ket5) +
sqrt(1/2) outer(ket6,ket2 - ket6) +
sqrt(1/2) outer(ket7,ket3 - ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
sqrt(1/2) outer(ket10,ket10 + ket14) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
outer(ket12,ket12) +
outer(ket13,ket13) +
sqrt(1/2) outer(ket14,ket10 - ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P12(phi) = I - P12M + exp(i phi) P12M

P12M =
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket14,ket14) +
outer(ket15,ket15)

X12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket6) +
outer(ket3,ket7) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket2) +
outer(ket7,ket3) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket14) +
outer(ket11,ket15) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket10) +
outer(ket15,ket11)

Y12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,-i ket6) +
outer(ket3,-i ket7) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,i ket2) +
outer(ket7,i ket3) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-i ket14) +
outer(ket11,-i ket15) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,i ket10) +
outer(ket15,i ket11)

Z12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W12 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket4) +
outer(ket3,ket5) +
outer(ket4,ket2) +
outer(ket5,ket3) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket12) +
outer(ket11,ket13) +
outer(ket12,ket10) +
outer(ket13,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

H22 =
sqrt(1/2) outer(ket0,ket0 + ket4) +
sqrt(1/2) outer(ket1,ket1 + ket5) +
sqrt(1/2) outer(ket2,ket2 + ket6) +
sqrt(1/2) outer(ket3,ket3 + ket7) +
sqrt(1/2) outer(ket4,ket0 - ket4) +
sqrt(1/2) outer(ket5,ket1 - ket5) +
sqrt(1/2) outer(ket6,ket2 - ket6) +
sqrt(1/2) outer(ket7,ket3 - ket7) +
sqrt(1/2) outer(ket8,ket8 + ket12) +
sqrt(1/2) outer(ket9,ket9 + ket13) +
sqrt(1/2) outer(ket10,ket10 + ket14) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
sqrt(1/2) outer(ket12,ket8 - ket12) +
sqrt(1/2) outer(ket13,ket9 - ket13) +
sqrt(1/2) outer(ket14,ket10 - ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P22(phi) = I - P22M + exp(i phi) P22M

P22M =
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X22 =
outer(ket0,ket4) +
outer(ket1,ket5) +
outer(ket2,ket6) +
outer(ket3,ket7) +
outer(ket4,ket0) +
outer(ket5,ket1) +
outer(ket6,ket2) +
outer(ket7,ket3) +
outer(ket8,ket12) +
outer(ket9,ket13) +
outer(ket10,ket14) +
outer(ket11,ket15) +
outer(ket12,ket8) +
outer(ket13,ket9) +
outer(ket14,ket10) +
outer(ket15,ket11)

Y22 =
outer(ket0,-i ket4) +
outer(ket1,-i ket5) +
outer(ket2,-i ket6) +
outer(ket3,-i ket7) +
outer(ket4,i ket0) +
outer(ket5,i ket1) +
outer(ket6,i ket2) +
outer(ket7,i ket3) +
outer(ket8,-i ket12) +
outer(ket9,-i ket13) +
outer(ket10,-i ket14) +
outer(ket11,-i ket15) +
outer(ket12,i ket8) +
outer(ket13,i ket9) +
outer(ket14,i ket10) +
outer(ket15,i ket11)

Z22 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,-ket4) +
outer(ket5,-ket5) +
outer(ket6,-ket6) +
outer(ket7,-ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W22 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
sqrt(1/2) outer(ket8,ket8 + ket12) +
sqrt(1/2) outer(ket9,ket9 + ket13) +
sqrt(1/2) outer(ket10,ket10 + ket14) +
sqrt(1/2) outer(ket11,ket11 + ket15) +
sqrt(1/2) outer(ket12,ket8 - ket12) +
sqrt(1/2) outer(ket13,ket9 - ket13) +
sqrt(1/2) outer(ket14,ket10 - ket14) +
sqrt(1/2) outer(ket15,ket11 - ket15)

P32(phi) = I - P32M + exp(i phi) P32M

P32M =
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket12) +
outer(ket9,ket13) +
outer(ket10,ket14) +
outer(ket11,ket15) +
outer(ket12,ket8) +
outer(ket13,ket9) +
outer(ket14,ket10) +
outer(ket15,ket11)

Y32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,-i ket12) +
outer(ket9,-i ket13) +
outer(ket10,-i ket14) +
outer(ket11,-i ket15) +
outer(ket12,i ket8) +
outer(ket13,i ket9) +
outer(ket14,i ket10) +
outer(ket15,i ket11)

Z32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W32 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket8) +
outer(ket5,ket9) +
outer(ket6,ket10) +
outer(ket7,ket11) +
outer(ket8,ket4) +
outer(ket9,ket5) +
outer(ket10,ket6) +
outer(ket11,ket7) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H3 =
sqrt(1/2) outer(ket0,ket0 + ket8) +
sqrt(1/2) outer(ket1,ket1 + ket9) +
sqrt(1/2) outer(ket2,ket2 + ket10) +
sqrt(1/2) outer(ket3,ket3 + ket11) +
sqrt(1/2) outer(ket4,ket4 + ket12) +
sqrt(1/2) outer(ket5,ket5 + ket13) +
sqrt(1/2) outer(ket6,ket6 + ket14) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
sqrt(1/2) outer(ket8,ket0 - ket8) +
sqrt(1/2) outer(ket9,ket1 - ket9) +
sqrt(1/2) outer(ket10,ket2 - ket10) +
sqrt(1/2) outer(ket11,ket3 - ket11) +
sqrt(1/2) outer(ket12,ket4 - ket12) +
sqrt(1/2) outer(ket13,ket5 - ket13) +
sqrt(1/2) outer(ket14,ket6 - ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P3(phi) = I - P3M + exp(i phi) P3M

P3M =
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X3 =
outer(ket0,ket8) +
outer(ket1,ket9) +
outer(ket2,ket10) +
outer(ket3,ket11) +
outer(ket4,ket12) +
outer(ket5,ket13) +
outer(ket6,ket14) +
outer(ket7,ket15) +
outer(ket8,ket0) +
outer(ket9,ket1) +
outer(ket10,ket2) +
outer(ket11,ket3) +
outer(ket12,ket4) +
outer(ket13,ket5) +
outer(ket14,ket6) +
outer(ket15,ket7)

Y3 =
outer(ket0,-i ket8) +
outer(ket1,-i ket9) +
outer(ket2,-i ket10) +
outer(ket3,-i ket11) +
outer(ket4,-i ket12) +
outer(ket5,-i ket13) +
outer(ket6,-i ket14) +
outer(ket7,-i ket15) +
outer(ket8,i ket0) +
outer(ket9,i ket1) +
outer(ket10,i ket2) +
outer(ket11,i ket3) +
outer(ket12,i ket4) +
outer(ket13,i ket5) +
outer(ket14,i ket6) +
outer(ket15,i ket7)

Z3 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,-ket8) +
outer(ket9,-ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

H03 =
outer(ket0,ket0) +
sqrt(1/2) outer(ket1,ket1 + ket9) +
outer(ket2,ket2) +
sqrt(1/2) outer(ket3,ket3 + ket11) +
outer(ket4,ket4) +
sqrt(1/2) outer(ket5,ket5 + ket13) +
outer(ket6,ket6) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
outer(ket8,ket8) +
sqrt(1/2) outer(ket9,ket1 - ket9) +
outer(ket10,ket10) +
sqrt(1/2) outer(ket11,ket3 - ket11) +
outer(ket12,ket12) +
sqrt(1/2) outer(ket13,ket5 - ket13) +
outer(ket14,ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P03(phi) = I - P03M + exp(i phi) P03M

P03M =
outer(ket9,ket9) +
outer(ket11,ket11) +
outer(ket13,ket13) +
outer(ket15,ket15)

X03 =
outer(ket0,ket0) +
outer(ket1,ket9) +
outer(ket2,ket2) +
outer(ket3,ket11) +
outer(ket4,ket4) +
outer(ket5,ket13) +
outer(ket6,ket6) +
outer(ket7,ket15) +
outer(ket8,ket8) +
outer(ket9,ket1) +
outer(ket10,ket10) +
outer(ket11,ket3) +
outer(ket12,ket12) +
outer(ket13,ket5) +
outer(ket14,ket14) +
outer(ket15,ket7)

Y03 =
outer(ket0,ket0) +
outer(ket1,-i ket9) +
outer(ket2,ket2) +
outer(ket3,-i ket11) +
outer(ket4,ket4) +
outer(ket5,-i ket13) +
outer(ket6,ket6) +
outer(ket7,-i ket15) +
outer(ket8,ket8) +
outer(ket9,i ket1) +
outer(ket10,ket10) +
outer(ket11,i ket3) +
outer(ket12,ket12) +
outer(ket13,i ket5) +
outer(ket14,ket14) +
outer(ket15,i ket7)

Z03 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,-ket9) +
outer(ket10,ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,-ket13) +
outer(ket14,ket14) +
outer(ket15,-ket15)

W03 =
outer(ket0,ket0) +
outer(ket1,ket8) +
outer(ket2,ket2) +
outer(ket3,ket10) +
outer(ket4,ket4) +
outer(ket5,ket12) +
outer(ket6,ket6) +
outer(ket7,ket14) +
outer(ket8,ket1) +
outer(ket9,ket9) +
outer(ket10,ket3) +
outer(ket11,ket11) +
outer(ket12,ket5) +
outer(ket13,ket13) +
outer(ket14,ket7) +
outer(ket15,ket15)

H13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
sqrt(1/2) outer(ket2,ket2 + ket10) +
sqrt(1/2) outer(ket3,ket3 + ket11) +
outer(ket4,ket4) +
outer(ket5,ket5) +
sqrt(1/2) outer(ket6,ket6 + ket14) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
sqrt(1/2) outer(ket10,ket2 - ket10) +
sqrt(1/2) outer(ket11,ket3 - ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
sqrt(1/2) outer(ket14,ket6 - ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P13(phi) = I - P13M + exp(i phi) P13M

P13M =
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket14,ket14) +
outer(ket15,ket15)

X13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket10) +
outer(ket3,ket11) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket14) +
outer(ket7,ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket2) +
outer(ket11,ket3) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket6) +
outer(ket15,ket7)

Y13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,-i ket10) +
outer(ket3,-i ket11) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,-i ket14) +
outer(ket7,-i ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,i ket2) +
outer(ket11,i ket3) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,i ket6) +
outer(ket15,i ket7)

Z13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W13 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket8) +
outer(ket3,ket9) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket12) +
outer(ket7,ket13) +
outer(ket8,ket2) +
outer(ket9,ket3) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket6) +
outer(ket13,ket7) +
outer(ket14,ket14) +
outer(ket15,ket15)

H23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
sqrt(1/2) outer(ket4,ket4 + ket12) +
sqrt(1/2) outer(ket5,ket5 + ket13) +
sqrt(1/2) outer(ket6,ket6 + ket14) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
sqrt(1/2) outer(ket12,ket4 - ket12) +
sqrt(1/2) outer(ket13,ket5 - ket13) +
sqrt(1/2) outer(ket14,ket6 - ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P23(phi) = I - P23M + exp(i phi) P23M

P23M =
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket12) +
outer(ket5,ket13) +
outer(ket6,ket14) +
outer(ket7,ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket4) +
outer(ket13,ket5) +
outer(ket14,ket6) +
outer(ket15,ket7)

Y23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,-i ket12) +
outer(ket5,-i ket13) +
outer(ket6,-i ket14) +
outer(ket7,-i ket15) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,i ket4) +
outer(ket13,i ket5) +
outer(ket14,i ket6) +
outer(ket15,i ket7)

Z23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W23 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket8) +
outer(ket5,ket9) +
outer(ket6,ket10) +
outer(ket7,ket11) +
outer(ket8,ket4) +
outer(ket9,ket5) +
outer(ket10,ket6) +
outer(ket11,ket7) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

H33 =
sqrt(1/2) outer(ket0,ket0 + ket8) +
sqrt(1/2) outer(ket1,ket1 + ket9) +
sqrt(1/2) outer(ket2,ket2 + ket10) +
sqrt(1/2) outer(ket3,ket3 + ket11) +
sqrt(1/2) outer(ket4,ket4 + ket12) +
sqrt(1/2) outer(ket5,ket5 + ket13) +
sqrt(1/2) outer(ket6,ket6 + ket14) +
sqrt(1/2) outer(ket7,ket7 + ket15) +
sqrt(1/2) outer(ket8,ket0 - ket8) +
sqrt(1/2) outer(ket9,ket1 - ket9) +
sqrt(1/2) outer(ket10,ket2 - ket10) +
sqrt(1/2) outer(ket11,ket3 - ket11) +
sqrt(1/2) outer(ket12,ket4 - ket12) +
sqrt(1/2) outer(ket13,ket5 - ket13) +
sqrt(1/2) outer(ket14,ket6 - ket14) +
sqrt(1/2) outer(ket15,ket7 - ket15)

P33(phi) = I - P33M + exp(i phi) P33M

P33M =
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

X33 =
outer(ket0,ket8) +
outer(ket1,ket9) +
outer(ket2,ket10) +
outer(ket3,ket11) +
outer(ket4,ket12) +
outer(ket5,ket13) +
outer(ket6,ket14) +
outer(ket7,ket15) +
outer(ket8,ket0) +
outer(ket9,ket1) +
outer(ket10,ket2) +
outer(ket11,ket3) +
outer(ket12,ket4) +
outer(ket13,ket5) +
outer(ket14,ket6) +
outer(ket15,ket7)

Y33 =
outer(ket0,-i ket8) +
outer(ket1,-i ket9) +
outer(ket2,-i ket10) +
outer(ket3,-i ket11) +
outer(ket4,-i ket12) +
outer(ket5,-i ket13) +
outer(ket6,-i ket14) +
outer(ket7,-i ket15) +
outer(ket8,i ket0) +
outer(ket9,i ket1) +
outer(ket10,i ket2) +
outer(ket11,i ket3) +
outer(ket12,i ket4) +
outer(ket13,i ket5) +
outer(ket14,i ket6) +
outer(ket15,i ket7)

Z33 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,-ket8) +
outer(ket9,-ket9) +
outer(ket10,-ket10) +
outer(ket11,-ket11) +
outer(ket12,-ket12) +
outer(ket13,-ket13) +
outer(ket14,-ket14) +
outer(ket15,-ket15)

W33 =
outer(ket0,ket0) +
outer(ket1,ket1) +
outer(ket2,ket2) +
outer(ket3,ket3) +
outer(ket4,ket4) +
outer(ket5,ket5) +
outer(ket6,ket6) +
outer(ket7,ket7) +
outer(ket8,ket8) +
outer(ket9,ket9) +
outer(ket10,ket10) +
outer(ket11,ket11) +
outer(ket12,ket12) +
outer(ket13,ket13) +
outer(ket14,ket14) +
outer(ket15,ket15)

I = unit(16)

Q = dot(
W03,
W12,
H0,
P01(pi/2),
H1,
P12(pi/2),
P02(pi/4),
H2,
P23(pi/2),
P13(pi/4),
P03(pi/8),
H3)

V = dot(
H3,
P03(-pi/8),
P13(-pi/4),
P23(-pi/2),
H2,
P02(-pi/4),
P12(-pi/2),
H1,
P01(-pi/2),
H0,
W12,
W03)

M(psi,P) = do(
  P = ((0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)),
  P[1] = hadamard(psi,conj(psi)),
  xrange = (0,16),
  yrange = (0,1),
  draw(P[1,ceiling(x)],x),
  P
)

psi = (
psi0,
psi1,
psi2,
psi3,
psi4,
psi5,
psi6,
psi7,
psi8,
psi9,
psi10,
psi11,
psi12,
psi13,
psi14,
psi15)

-- x

check(rotate(psi,X,0) == dot(X0,psi))
check(rotate(psi,X,1) == dot(X1,psi))
check(rotate(psi,X,2) == dot(X2,psi))
check(rotate(psi,X,3) == dot(X3,psi))

check(X0 == X00)
check(X1 == X11)
check(X2 == X22)
check(X3 == X33)

check(rotate(psi,C,0,X,0) == dot(X00,psi))
check(rotate(psi,C,0,X,1) == dot(X01,psi))
check(rotate(psi,C,0,X,2) == dot(X02,psi))
check(rotate(psi,C,0,X,3) == dot(X03,psi))

check(rotate(psi,C,1,X,0) == dot(X10,psi))
check(rotate(psi,C,1,X,1) == dot(X11,psi))
check(rotate(psi,C,1,X,2) == dot(X12,psi))
check(rotate(psi,C,1,X,3) == dot(X13,psi))

check(rotate(psi,C,2,X,0) == dot(X20,psi))
check(rotate(psi,C,2,X,1) == dot(X21,psi))
check(rotate(psi,C,2,X,2) == dot(X22,psi))
check(rotate(psi,C,2,X,3) == dot(X23,psi))

check(rotate(psi,C,3,X,0) == dot(X30,psi))
check(rotate(psi,C,3,X,1) == dot(X31,psi))
check(rotate(psi,C,3,X,2) == dot(X32,psi))
check(rotate(psi,C,3,X,3) == dot(X33,psi))

-- y

check(rotate(psi,Y,0) == dot(Y0,psi))
check(rotate(psi,Y,1) == dot(Y1,psi))
check(rotate(psi,Y,2) == dot(Y2,psi))
check(rotate(psi,Y,3) == dot(Y3,psi))

check(Y0 == Y00)
check(Y1 == Y11)
check(Y2 == Y22)
check(Y3 == Y33)

check(rotate(psi,C,0,Y,0) == dot(Y00,psi))
check(rotate(psi,C,0,Y,1) == dot(Y01,psi))
check(rotate(psi,C,0,Y,2) == dot(Y02,psi))
check(rotate(psi,C,0,Y,3) == dot(Y03,psi))

check(rotate(psi,C,1,Y,0) == dot(Y10,psi))
check(rotate(psi,C,1,Y,1) == dot(Y11,psi))
check(rotate(psi,C,1,Y,2) == dot(Y12,psi))
check(rotate(psi,C,1,Y,3) == dot(Y13,psi))

check(rotate(psi,C,2,Y,0) == dot(Y20,psi))
check(rotate(psi,C,2,Y,1) == dot(Y21,psi))
check(rotate(psi,C,2,Y,2) == dot(Y22,psi))
check(rotate(psi,C,2,Y,3) == dot(Y23,psi))

check(rotate(psi,C,3,Y,0) == dot(Y30,psi))
check(rotate(psi,C,3,Y,1) == dot(Y31,psi))
check(rotate(psi,C,3,Y,2) == dot(Y32,psi))
check(rotate(psi,C,3,Y,3) == dot(Y33,psi))

-- z

check(rotate(psi,Z,0) == dot(Z0,psi))
check(rotate(psi,Z,1) == dot(Z1,psi))
check(rotate(psi,Z,2) == dot(Z2,psi))
check(rotate(psi,Z,3) == dot(Z3,psi))

check(Z0 == Z00)
check(Z1 == Z11)
check(Z2 == Z22)
check(Z3 == Z33)

check(rotate(psi,C,0,Z,0) == dot(Z00,psi))
check(rotate(psi,C,0,Z,1) == dot(Z01,psi))
check(rotate(psi,C,0,Z,2) == dot(Z02,psi))
check(rotate(psi,C,0,Z,3) == dot(Z03,psi))

check(rotate(psi,C,1,Z,0) == dot(Z10,psi))
check(rotate(psi,C,1,Z,1) == dot(Z11,psi))
check(rotate(psi,C,1,Z,2) == dot(Z12,psi))
check(rotate(psi,C,1,Z,3) == dot(Z13,psi))

check(rotate(psi,C,2,Z,0) == dot(Z20,psi))
check(rotate(psi,C,2,Z,1) == dot(Z21,psi))
check(rotate(psi,C,2,Z,2) == dot(Z22,psi))
check(rotate(psi,C,2,Z,3) == dot(Z23,psi))

check(rotate(psi,C,3,Z,0) == dot(Z30,psi))
check(rotate(psi,C,3,Z,1) == dot(Z31,psi))
check(rotate(psi,C,3,Z,2) == dot(Z32,psi))
check(rotate(psi,C,3,Z,3) == dot(Z33,psi))

-- phase

check(rotate(psi,P,0,theta) == dot(P0(theta),psi))
check(rotate(psi,P,1,theta) == dot(P1(theta),psi))
check(rotate(psi,P,2,theta) == dot(P2(theta),psi))
check(rotate(psi,P,3,theta) == dot(P3(theta),psi))

check(P0 == P00)
check(P1 == P11)
check(P2 == P22)
check(P3 == P33)

check(rotate(psi,C,0,P,0,theta) == dot(P00(theta),psi))
check(rotate(psi,C,0,P,1,theta) == dot(P01(theta),psi))
check(rotate(psi,C,0,P,2,theta) == dot(P02(theta),psi))
check(rotate(psi,C,0,P,3,theta) == dot(P03(theta),psi))

check(rotate(psi,C,1,P,0,theta) == dot(P10(theta),psi))
check(rotate(psi,C,1,P,1,theta) == dot(P11(theta),psi))
check(rotate(psi,C,1,P,2,theta) == dot(P12(theta),psi))
check(rotate(psi,C,1,P,3,theta) == dot(P13(theta),psi))

check(rotate(psi,C,2,P,0,theta) == dot(P20(theta),psi))
check(rotate(psi,C,2,P,1,theta) == dot(P21(theta),psi))
check(rotate(psi,C,2,P,2,theta) == dot(P22(theta),psi))
check(rotate(psi,C,2,P,3,theta) == dot(P23(theta),psi))

check(rotate(psi,C,3,P,0,theta) == dot(P30(theta),psi))
check(rotate(psi,C,3,P,1,theta) == dot(P31(theta),psi))
check(rotate(psi,C,3,P,2,theta) == dot(P32(theta),psi))
check(rotate(psi,C,3,P,3,theta) == dot(P33(theta),psi))

-- hadamard

check(rotate(psi,H,0) == dot(H0,psi))
check(rotate(psi,H,1) == dot(H1,psi))
check(rotate(psi,H,2) == dot(H2,psi))
check(rotate(psi,H,3) == dot(H3,psi))

check(H0 == H00)
check(H1 == H11)
check(H2 == H22)
check(H3 == H33)

check(rotate(psi,C,0,H,0) == dot(H00,psi))
check(rotate(psi,C,0,H,1) == dot(H01,psi))
check(rotate(psi,C,0,H,2) == dot(H02,psi))
check(rotate(psi,C,0,H,3) == dot(H03,psi))

check(rotate(psi,C,1,H,0) == dot(H10,psi))
check(rotate(psi,C,1,H,1) == dot(H11,psi))
check(rotate(psi,C,1,H,2) == dot(H12,psi))
check(rotate(psi,C,1,H,3) == dot(H13,psi))

check(rotate(psi,C,2,H,0) == dot(H20,psi))
check(rotate(psi,C,2,H,1) == dot(H21,psi))
check(rotate(psi,C,2,H,2) == dot(H22,psi))
check(rotate(psi,C,2,H,3) == dot(H23,psi))

check(rotate(psi,C,3,H,0) == dot(H30,psi))
check(rotate(psi,C,3,H,1) == dot(H31,psi))
check(rotate(psi,C,3,H,2) == dot(H32,psi))
check(rotate(psi,C,3,H,3) == dot(H33,psi))

-- swap

check(rotate(psi,W,0,0) == psi)
check(rotate(psi,W,0,1) == dot(W01,psi))
check(rotate(psi,W,0,2) == dot(W02,psi))
check(rotate(psi,W,0,3) == dot(W03,psi))

check(rotate(psi,W,1,0) == dot(W10,psi))
check(rotate(psi,W,1,1) == psi)
check(rotate(psi,W,1,2) == dot(W12,psi))
check(rotate(psi,W,1,3) == dot(W13,psi))

check(rotate(psi,W,2,0) == dot(W20,psi))
check(rotate(psi,W,2,1) == dot(W21,psi))
check(rotate(psi,W,2,2) == psi)
check(rotate(psi,W,2,3) == dot(W23,psi))

check(rotate(psi,W,3,0) == dot(W30,psi))
check(rotate(psi,W,3,1) == dot(W31,psi))
check(rotate(psi,W,3,2) == dot(W32,psi))
check(rotate(psi,W,3,3) == psi)

-- qft

check(rotate(psi,Q,3) == dot(Q,psi))
check(rotate(psi,V,3) == dot(V,psi))

-- Deutsch-Jozsa algorithm

psi = rotate(ket0,H,0,H,1,H,2,X,3,H,3,C,0,X,3,C,1,X,3,C,2,X,3,H,0,H,1,H,2)
P = hadamard(psi,conj(psi))
check(P == (0,0,0,0,0,0,0,1/2,0,0,0,0,0,0,0,1/2))

-- Bernstein-Vazirani algorithm

psi = rotate(ket0,H,0,H,1,H,2,H,3,Z,3,C,0,X,3,C,2,X,3,H,0,H,1,H,2)
P = hadamard(psi,conj(psi))
check(P == (0,0,0,0,0,1/2,0,0,0,0,0,0,0,1/2,0,0))

-- phase estimation

theta = 0.3
pi = float(pi)
psi = rotate(ket0,H,0,H,1,H,2,X,3)
psi = rotate(psi,C,0,P,3,2 pi theta,C,1,P,3,4 pi theta,C,2,P,3,8 pi theta) -- U
psi = rotate(psi,W,0,2,H,0,C,0,P,1,-pi/2,H,1,C,1,P,2,-pi/2,C,0,P,2,-pi/4,H,2) -- inverse qft
P = psi conj(psi)
theta = sum(k,0,15,k/8 P[k + 1]) - 1
check(infixform(theta) == "0.30465")

theta = 0.3
pi = float(pi)
psi = rotate(ket0,H,0,H,1,H,2,X,3)
psi = rotate(psi,C,0,P,3,2 pi theta,C,1,P,3,4 pi theta,C,2,P,3,8 pi theta) -- U
psi = rotate(psi,V,2) -- inverse qft
P = psi conj(psi)
theta = sum(k,0,15,k/8 P[k + 1]) - 1
check(infixform(theta) == "0.30465")

-- Test order finding

clear

U(psi,k) = rotate(psi,

  C,k,W,10,11,  -- conditional swap bits 10 and 11
  C,k,W,9,10,   -- conditional swap bits 9 and 10
  C,k,W,8,9,    -- conditional swap bits 8 and 9
  C,k,X,8,      -- conditional not bit 8
  C,k,X,9,      -- conditional not bit 9
  C,k,X,10,     -- conditional not bit 10
  C,k,X,11)     -- conditional not bit 11

-- 12 quantum bits have 2^12 = 4096 eigenstates

psi = zero(4096)

-- initial state is eigenstate zero

psi[1] = 1

-- start computing

psi = rotate(psi,

  H,0,   -- hadamard bit 0
  H,1,   -- hadamard bit 1
  H,2,   -- hadamard bit 2
  H,3,   -- hadamard bit 3
  H,4,   -- hadamard bit 4
  H,5,   -- hadamard bit 5
  H,6,   -- hadamard bit 6
  H,7,   -- hadamard bit 7
  X,8)   -- not bit 8

-- U^(2^0) U^(2^1) U^(2^2) ... U^(2^7)

for(k,1,1,   psi = U(psi,0))
for(k,1,2,   psi = U(psi,1))
for(k,1,4,   psi = U(psi,2))
for(k,1,8,   psi = U(psi,3))
for(k,1,16,  psi = U(psi,4))
for(k,1,32,  psi = U(psi,5))
for(k,1,64,  psi = U(psi,6))
for(k,1,128, psi = U(psi,7))

-- inverse QFT on bits 0-7

psi = rotate(psi,V,7)

-- result is a probability distribution

P = psi conj(psi)

-- qubits 8-11 are don't care, sum probabilities over eigenstates modulo 256

for(j,1,256, P[j] = sum(k,0,15,P[j + 256 k]))

n = 0
for(k,1,256,test(P[k],n=n+1))
test(n<2,n=2)
M = zero(2,n) -- 2 rows, n columns
n = 1
for(k,1,256,test(P[k],do(M[1,n]=float(P[k]),M[2,n]=(k-1)/256,n=n+1)))

check(M[2] == (0,1/4,1/2,3/4))

-- Test full adder

clear

U(psi) = rotate(psi,C,0,X,2,C,1,X,2,C,0,C,1,X,3)

ket0000 = (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket0001 = (0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket0010 = (0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0)
ket0011 = (0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0)
ket0100 = (0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0)
ket0101 = (0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0)
ket0110 = (0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0)
ket0111 = (0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0)
ket1000 = (0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0)
ket1001 = (0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0)
ket1010 = (0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0)
ket1011 = (0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0)
ket1100 = (0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0)
ket1101 = (0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0)
ket1110 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0)
ket1111 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)

check(U(ket0000) == ket0000)
check(U(ket0001) == ket0101)
check(U(ket0010) == ket0110)
check(U(ket0011) == ket1011)
"Testing sgn"
clear
check(infixform(sgn(0)) == "0")
check(infixform(sgn(1/2)) == "1")
check(infixform(sgn(-1/2)) == "-1")
check(infixform(sgn(-x)) == "sgn(-x)")
"Testing simple powers"

clear

check(prefixform(0 ^ 0) == "1")
check(prefixform(0 ^ 0.0) == "1")
check(prefixform(0.0 ^ 0) == "1")
check(prefixform(0.0 ^ 0.0) == "1")

check(prefixform(0 ^ 1) == "0")
check(prefixform(0 ^ 1.0) == "0")
check(prefixform(0.0 ^ 1) == "0")
check(prefixform(0.0 ^ 1.0) == "0")

check(prefixform(0 ^ 2) == "0")
check(prefixform(0 ^ 2.0) == "0")
check(prefixform(0.0 ^ 2) == "0")
check(prefixform(0.0 ^ 2.0) == "0")

check(prefixform(1 ^ 0) == "1")
check(prefixform(1 ^ 0.0) == "1")
check(prefixform(1.0 ^ 0) == "1")
check(prefixform(1.0 ^ 0.0) == "1")

check(prefixform(1 ^ 1) == "1")
check(prefixform(1 ^ 1.0) == "1")
check(prefixform(1.0 ^ 1) == "1")
check(prefixform(1.0 ^ 1.0) == "1")

check(prefixform(1 ^ 2) == "1")
check(prefixform(1 ^ 2.0) == "1")
check(prefixform(1.0 ^ 2) == "1")
check(prefixform(1.0 ^ 2.0) == "1")

check(prefixform(2 ^ 0) == "1")
check(prefixform(2 ^ 0.0) == "1")
check(prefixform(2.0 ^ 0) == "1")
check(prefixform(2.0 ^ 0.0) == "1")

check(prefixform(2 ^ 1) == "2")
check(prefixform(2 ^ 1.0) == "2")
check(prefixform(2.0 ^ 1) == "2.0")
check(prefixform(2.0 ^ 1.0) == "2.0")

check(prefixform(2 ^ 2) == "4")
check(prefixform(2 ^ 2.0) == "4.0")
check(prefixform(2.0 ^ 2) == "4.0")
check(prefixform(2.0 ^ 2.0) == "4.0")

check(prefixform(x ^ 0) == "1")
check(prefixform(x ^ 0.0) == "1")

check(prefixform(0 ^ x) == "(^ 0 x)")
check(prefixform(0.0 ^ x) == "(^ 0.0 x)")

check(prefixform(1 ^ x) == "1")
check(prefixform(1.0 ^ x) == "1")

check(prefixform(x ^ 1) == "x")
check(prefixform(x ^ 1.0) == "x")

check((-1)^(1/9) == -1)
check((-1)^(2/9) == 1)
check((-1)^(3/9) == -1)
check((-1)^(4/9) == 1)
check((-1)^(5/9) == -1)
check((-1)^(6/9) == 1)
check((-1)^(7/9) == -1)
check((-1)^(8/9) == 1)

A = ((1,2),(3,4))
check(1/A == ((1,1/2),(1/3,1/4)))
check(A^(-1) == ((1,1/2),(1/3,1/4)))

check(infixform(1 / ((a + b) (c + d))^2) == "1 / ((a + b)^2 (c + d)^2)")

check(prefixform((-2)^(3/2)) == "(* -2 (^ 2 1/2) (^ -1 1/2))") -- bug fix
check(prefixform((-2)^(7/2)) == "(* -8 (^ 2 1/2) (^ -1 1/2))") -- bug fix
N = 46349 46349
check(sqrt(N) == 46349) -- bug fix
"Testing simplify"

clear

check(infixform(simplify(2 a / (2 b + 2 c))) == "a / (b + c)")
check(infixform(simplify(4 a / (2 b + 2 c))) == "2 a / (b + c)")
check(infixform(simplify(2 a / (4 b + 4 c))) == "a / (2 b + 2 c)")

-- ratio of expressions
check(infixform(simplify((a x + a) / (x + 1))) == "a")

-- continued fraction
check(infixform(simplify(1 / (1 + 1 / x))) == "x / (x + 1)")

-- another continued fraction
check(infixform(simplify(1 / (x + y^2 / x))) == "x / (x^2 + y^2)")

-- mixed forms of complex numbers
check(exp(i pi / 4) == (1 + i) / sqrt(2))

check(infixform(simplify(sqrt(1 + x^2 / (1 - x^2)))) == "1 / (-x^2 + 1)^(1/2)")

T = simplify((A^2 C^2 + A^2 D^2 + B^2 C^2 + B^2 D^2)/(A^2+B^2)/(C^2+D^2))
check(T = 1)

T = simplify(-3*x*A/(A-B) + 3*x*B/(A-B))
check(infixform(T)="-3 x")

T = simplify(-y/(x^2*(y^2/x^2+1)))
check(infixform(T) = "-y / (x^2 + y^2)")

T = simplify(1/(x*(y^2/x^2+1)))
check(infixform(T) = "x / (x^2 + y^2)")

T = simplify(tan(x) - sin(x)/cos(x))
check(infixform(T) = "0")

T = simplify(sin(x)^2 + cos(x)^2)
check(infixform(T) = "1")

T = simplify(sinh(x)^2 - cosh(x)^2)
check(infixform(T) = "-1")

T = simplify(((sin(x)^2 + cos(x)^2,0),(0,sin(x))))
check(T = ((1,0),(0,sin(x))))

T = simplify(2 * M / (-2 * M * r^2 + r^3) + r^(-2) - 1 / (-2 * M * r + r^2))
check(T = 0)

T = rationalize(2 * M / (-2 * M * r^2 + r^3) + r^(-2) - 1 / (-2 * M * r + r^2) + 1)
check(T = (4 * M^2 * r^3 - 4 * M * r^4 + r^5) / ((-2 * M * r + r^2) * (-2 * M * r^2 + r^3)))
T = simplify(T)
check(T = 1)

T = -3 exp(-1/3 r + i phi) cos(theta) / sin(theta) + 3 exp(-1/3 r + i phi) cos(theta) sin(theta) + 3 exp(-1/3 r + i phi) cos(theta)^3 / sin(theta)
check(T == 0)
check(simplify(sqrt(1 + x^2 / (1 - x^2))) == 1 / sqrt(1 - x^2))

-- simplify tensors

A = ((A11,A12),(A21,A22))
T = simplify(dot(A,inv(A)))
check(T=unit(2))

A = ((A11,A12,A13),(A21,A22,A23),(A31,A32,A33))
T = simplify(dot(A,inv(A)))
check(T=unit(3))

A = ((A11,A12,A13,A14),(A21,A22,A23,A24),(A31,A32,A33,A34),(A41,A42,A43,A44))
T = simplify(dot(A,inv(A)))
check(T=unit(4))

clear
T = 2 m / hbar^2 abs(E - V)
T1 = (+sqrt(+T))^(-1/2)
T2 = (+sqrt(-T))^(-1/2)
T3 = (-sqrt(+T))^(-1/2)
T4 = (-sqrt(-T))^(-1/2)
check(T1 == T^(-1/4))
check(T2 == exp(-1/4 i pi) T^(-1/4))
check(T3 == exp(-1/2 i pi) T^(-1/4))
check(T4 == exp(-3/4 i pi) T^(-1/4))

check(infixform(simplify(c / (a c + b c))) == "1 / (a + b)") -- version 3.24

clear
T = exp(-x^2 + i omega + 1/4 i pi) / (sqrt(sqrt(-1)) pi)
T = simplify(T)
check(infixform(T) == "exp(-x^2 + i omega) / pi")

clear
A = -i m omega exp(i omega T) / (2 hbar sin(omega T))
B = -i m omega xb / (hbar sin(omega T))
C = i m omega xb^2 cos(omega T) / (2 hbar sin(omega T))
D = -m^(5/4) omega^(5/4) / ((-1)^(1/4) hbar^(5/4) pi^(3/4) *
     sin(omega T)^(1/2))
I = 1/2 sqrt(pi) D B A^(-3/2) exp(B^2 / (4 A) + C)
I = simplify(I)
check(infixform(I) == "2^(1/2) m^(3/4) omega^(3/4) xb exp(-m omega xb^2 / (2 hbar) - 3/2 i T omega) / (hbar^(3/4) pi^(1/4))")

clear
x = theta - sin(theta)
z = 1 - cos(theta)
a = d(x,theta)^2 + d(z,theta)^2
f = simplify(sqrt(a / (2 g z)))
check(infixform(f) == "1 / g^(1/2)")

clear
T = hbar^2 kappa x^2 f(x,y,z) / (m (x^2 + y^2 + z^2)^(3/2)) + hbar^2 kappa y^2 f(x,y,z) / (m (x^2 + y^2 + z^2)^(3/2)) + hbar^2 kappa z^2 f(x,y,z) / (m (x^2 + y^2 + z^2)^(3/2)) - hbar^2 kappa f(x,y,z) / (m (x^2 + y^2 + z^2)^(1/2)) + kappa^2 x^2 f(x,y,z) / (x^2 + y^2 + z^2) + kappa^2 y^2 f(x,y,z) / (x^2 + y^2 + z^2) + kappa^2 z^2 f(x,y,z) / (x^2 + y^2 + z^2) - kappa^2 f(x,y,z)
T = simplify(T)
check(infixform(T) == "0")

-- T = kappa^2 m x^2 (x^2 + y^2 + z^2)^(1/2) f(x,y,z) + kappa^2 m y^2 (x^2 + y^2 + z^2)^(1/2) f(x,y,z) + kappa^2 m z^2 (x^2 + y^2 + z^2)^(1/2) f(x,y,z) - kappa^2 m (x^2 + y^2 + z^2)^(3/2) f(x,y,z)
-- T^2 simplifies to 0

clear
check(infixform(simplify((i - z) / (i + z))) == "exp(-i arctan(1,z) + i arctan(1,-z))")
"Testing sin"

clear

check(sin(-x) == -sin(x))
check(sin(arctan(y,x)) == y (x^2 + y^2)^(-1/2))
check(sin(arccos(x)) == sqrt(1 - x^2))
check(sin((x,y)) == (sin(x),sin(y)))

-- special angles

check(sin(0/360 2 pi) == 0)
check(sin(180/360 2 pi) == 0)

check(sin(30/360 2 pi) == 1/2)
check(sin(150/360 2 pi) == 1/2)

check(sin(210/360 2 pi) == -1/2)
check(sin(330/360 2 pi) == -1/2)

check(sin(45/360 2 pi) == 1/2 sqrt(2))
check(sin(135/360 2 pi) == 1/2 sqrt(2))

check(sin(225/360 2 pi) == -1/2 sqrt(2))
check(sin(315/360 2 pi) == -1/2 sqrt(2))

check(sin(60/360 2 pi) == 1/2 sqrt(3))
check(sin(120/360 2 pi) == 1/2 sqrt(3))

check(sin(240/360 2 pi) == -1/2 sqrt(3))
check(sin(300/360 2 pi) == -1/2 sqrt(3))

check(sin(90/360 2 pi) == 1)

-- negative

check(sin(-0/360 2 pi) == 0)
check(sin(-180/360 2 pi) == 0)

check(sin(-30/360 2 pi) == -1/2)
check(sin(-150/360 2 pi) == -1/2)

check(sin(-210/360 2 pi) == 1/2)
check(sin(-330/360 2 pi) == 1/2)

check(sin(-45/360 2 pi) == -1/2 sqrt(2))
check(sin(-135/360 2 pi) == -1/2 sqrt(2))

check(sin(-225/360 2 pi) == 1/2 sqrt(2))
check(sin(-315/360 2 pi) == 1/2 sqrt(2))

check(sin(-60/360 2 pi) == -1/2 sqrt(3))
check(sin(-120/360 2 pi) == -1/2 sqrt(3))

check(sin(-240/360 2 pi) == 1/2 sqrt(3))
check(sin(-300/360 2 pi) == 1/2 sqrt(3))

check(sin(-90/360 2 pi) == -1)

-- compare intrinsic

for(x,-720,720,
  d = float(sin(2 pi x / 360)) - sin(float(2 pi x / 360)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  w = -i/2 exp(i z) + i/2 exp(-i z),
  check(abs(sin(z) - w) < 1.0 10^(-6))
))

-- implicit float pi

for(x,-1,1,
  a = infixform(sin(x pi / 3.0)),
  b = infixform(sin(x float(pi) / 3.0)),
  check(a == b)
)
"Testing sinh"

clear

check(sinh(0) == 0)
check(sinh(-x) == -sinh(x))
check(sinh(arcsinh(x)) == x)
check(sinh((x,y)) == (sinh(x),sinh(y)))

-- compare intrinsic

for(x,-12,12,
  d = float(sinh(x/12)) - sinh(float(x/12)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  w = 1/2 exp(z) - 1/2 exp(-z),
  check(abs(sinh(z) - w) < 1.0 10^(-6))
))
"Testing sum"

clear

k = 123
check(sum(k,1,10,k) == 55)
check(k == 123)
"Testing tan"

clear

check(tan(-x) == -tan(x))
check(tan(arctan(y,x)) == y / x)
check(tan((x,y)) == (tan(x),tan(y)))

-- special angles

check(tan(0/360 2 pi) == 0)
check(tan(180/360 2 pi) == 0)

check(tan(30/360 2 pi) == 1/3 sqrt(3))
check(tan(210/360 2 pi) == 1/3 sqrt(3))

check(tan(150/360 2 pi) == -1/3 sqrt(3))
check(tan(330/360 2 pi) == -1/3 sqrt(3))

check(tan(45/360 2 pi) == 1)
check(tan(225/360 2 pi) == 1)

check(tan(135/360 2 pi) == -1)
check(tan(315/360 2 pi) == -1)

check(tan(60/360 2 pi) == sqrt(3))
check(tan(240/360 2 pi) == sqrt(3))

check(tan(120/360 2 pi) == -sqrt(3))
check(tan(300/360 2 pi) == -sqrt(3))

-- negative

check(tan(-0/360 2 pi) == 0)
check(tan(-180/360 2 pi) == 0)

check(tan(-30/360 2 pi) == -1/3 sqrt(3))
check(tan(-210/360 2 pi) == -1/3 sqrt(3))

check(tan(-150/360 2 pi) == 1/3 sqrt(3))
check(tan(-330/360 2 pi) == 1/3 sqrt(3))

check(tan(-45/360 2 pi) == -1)
check(tan(-225/360 2 pi) == -1)

check(tan(-135/360 2 pi) == 1)
check(tan(-315/360 2 pi) == 1)

check(tan(-60/360 2 pi) == -sqrt(3))
check(tan(-240/360 2 pi) == -sqrt(3))

check(tan(-120/360 2 pi) == sqrt(3))
check(tan(-300/360 2 pi) == sqrt(3))

-- compare intrinsic

for(x,-720,720,
  d = float(tan(2 pi x / 360)) - tan(float(2 pi x / 360)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  test(cos(z),do(
    w = sin(z) / cos(z),
    check(abs(tan(z) - w) < 1.0 10^(-6))
  ))
))

-- implicit float pi

for(x,-1,1,
  a = infixform(tan(x pi / 3.0)),
  b = infixform(tan(x float(pi) / 3.0)),
  check(a == b)
)
"Testing tanh"

clear

check(tanh(0) == 0)
check(tanh(-x) == -tanh(x))
check(tanh(arctanh(x)) == x)
check(tanh((x,y)) == (tanh(x),tanh(y)))

-- compare intrinsic

for(x,-12,12,
  d = float(tanh(x/12)) - tanh(float(x/12)),
  check(abs(d) < 1.0 10^(-6))
)

-- complex arg

for(x,-3,3,for(y,-3,3,
  z = 1/3.0 (x + i y),
  test(cosh(z),do(
    w = sinh(z) / cosh(z),
    check(abs(tanh(z) - w) < 1.0 10^(-6))
  ))
))
"Testing taylor"

clear

A = taylor(cos(x),x,5)
B = 1/24 x^4 - 1/2 x^2 + 1
check(A == B)

A = taylor(sin(x),x,5,a)
B = -1/120 a^5 cos(a) + 1/24 a^4 x cos(a) + 1/24 a^4 sin(a) - 1/12 a^3 x^2 cos(a) - 1/6 a^3 x sin(a) + 1/6 a^3 cos(a) + 1/12 a^2 x^3 cos(a) + 1/4 a^2 x^2 sin(a) - 1/2 a^2 x cos(a) - 1/2 a^2 sin(a) - 1/24 a x^4 cos(a) - 1/6 a x^3 sin(a) + 1/2 a x^2 cos(a) + a x sin(a) - a cos(a) + 1/120 x^5 cos(a) + 1/24 x^4 sin(a) - 1/6 x^3 cos(a) - 1/2 x^2 sin(a) + x cos(a) + sin(a)
check(A == B)

A = eval(A,a,0)
B = 1/120 x^5 - 1/6 x^3 + x
check(A == B)

A = taylor(1/(5+4*cos(x)),x,6,0)
B = 1/9+2/81*x^2+5/1458*x^4+49/131220*x^6
check(A == B)
"Testing tdist"
clear
-- R: pt
check(infixform(tdist(-3,10)) == "0.00667183")
check(infixform(tdist(-2,10)) == "0.036694")
check(infixform(tdist(-1,10)) == "0.170447")
check(infixform(tdist(0,10)) == "0.5")
check(infixform(tdist(1,10)) == "0.829553")
check(infixform(tdist(2,10)) == "0.963306")
check(infixform(tdist(3,10)) == "0.993328")
-- R: qt
check(infixform(tdistinv(0.000001,10)) == "-9.752")
check(infixform(tdistinv(0.5,10)) == "0")
check(infixform(tdistinv(0.999999,10)) == "9.752")
"Testing tensor arithmetic"

clear

A = (A1,A2,A3)
B = (B1,B2,B3,B4)
C = (C1,C2,C3,C4,C5)
D = (D1,D2,D3,D4,D5)
E = (E1,E2,E3,E4,E5,E6)
F = (F1,F2,F3,F4,F5,F6,F7)

G = dot(outer(A,B,C),outer(D,E,F))
H = contract(outer(A,B,C,D,E,F),3,4)
check(G=H)

G = transpose(outer(A,B,C,D,E,F))
H = outer(B,A,C,D,E,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),1,2)
H = outer(B,A,C,D,E,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),1,3)
H = outer(C,B,A,D,E,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),1,4)
H = outer(D,B,C,A,E,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),1,5)
H = outer(E,B,C,D,A,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),1,6)
H = outer(F,B,C,D,E,A)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),2,3)
H = outer(A,C,B,D,E,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),2,4)
H = outer(A,D,C,B,E,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),2,5)
H = outer(A,E,C,D,B,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),2,6)
H = outer(A,F,C,D,E,B)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),3,4)
H = outer(A,B,D,C,E,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),3,5)
H = outer(A,B,E,D,C,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),3,6)
H = outer(A,B,F,D,E,C)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),4,5)
H = outer(A,B,C,E,D,F)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),4,6)
H = outer(A,B,C,F,E,D)
check(G=H)

G = transpose(outer(A,B,C,D,E,F),5,6)
H = outer(A,B,C,D,F,E)
check(G=H)

A = (A1,A2,A3)
B = (B1,B2,B3)
check(contract(outer(A,B))=dot(A,B))

A = (A1,A2,A3,A4)
B = (B1,B2,B3)
C = (C1,C2,C3)
check(contract(outer(A,B,C),2,3)=dot(B,C)*A)

A = (A1,A2,A3)
B = (B1,B2,B3)
C = (C1,C2,C3,C4)
check(contract(outer(A,B,C))=dot(A,B)*C)
"Testing tensor promotion"

clear

a = quote(a)
b = quote(b)
c = quote(c)
d = quote(d)

A = ((a,b),(c,d))

a = (11,12,13)
b = (21,22,23)
c = (31,32,33)
d = (41,42,43)

B = A

check(B[1,1] = a)
check(B[1,2] = b)
check(B[2,1] = c)
check(B[2,2] = d)
"Testing tgamma"
clear
for(k,1,3,check(tgamma(k)==factorial(k-1)))
"Testing transpose"

clear

check(transpose((1,2,3)) == (1,2,3))

T = transpose(((a,b),(c,d)))
check(T = ((a,c),(b,d)))
T = transpose(((a,b),(c,d)),1,2)
check(T = ((a,c),(b,d)))
T = transpose(((a,b,c),(d,e,f)),1,2)
check(T = ((a,d),(b,e),(c,f)))
T = transpose(((a,d),(b,e),(c,f)),1,2)
check(T = ((a,b,c),(d,e,f)))

v1 = (A1,B1,C1)
v2 = (A2,B2,C2)
v3 = (A3,B3,C3)

A = outer(v1,v2,v3)

check(transpose(A) == outer(v2,v1,v3))
check(transpose(A,1,2) == outer(v2,v1,v3))
check(transpose(A,2,3) == outer(v1,v3,v2))
check(transpose(A,1,3) == outer(v3,v2,v1))
check(transpose(A,1,2,2,3) == outer(v2,v3,v1))
check(transpose(A,2,3,1,2) == outer(v3,v1,v2))
"Testing vector arithmetic"

clear

check((1,2,3,4) + 10 == (11,12,13,14))
check((1,2,3,4)^2 == (1,4,9,16))
check(sum((1,2,3,4)) == 10)
check(product((1,2,3,4)) == 24)
