print("i*i = {0}".format(i*i))
 print("j*j = {0}".format(j*j))
 print("k*k = {0}".format(k*k))
 print()
 
 print("Products of components:")
 print("o*i = {0}\ti*o = {1}".format(o*i, i*o))
 print("o*j = {0}\tj*o = {1}".format(o*j, j*o))
 print("o*k = {0}\tk*o = {1}".format(o*k, k*o))
 print("i*j = {0}\tj*i = {1}".format(i*j, j*i))
 print("i*k = {0}\tk*i = {1}".format(i*k, k*i))
 print("j*k = {0}\tk*j = {1}".format(j*k, k*j))
 print()
 
 p = Quaternion(i)
 p.setScalar(-3).setJ(2).setK(-1)
 print("p=({0}, {1}, {2}, {3})".format(p.getScalar(), p.getI(), p.getJ(), p.getK()))
 # sqrt(15) = 3.87298
 print("||p|| = {0} (correct: 3.87298)".format(p.norm()))
 
 q = p.reciprocal()
 qc = "-0.2-0.0666666666667i-0.133333333333j+0.0666666666667k"
 
 print("p**(-1) = {0}\n(correct: {1})".format(q, qc))
 print("p*p**(-1) = {0}".format(p*q)) 
 print("p**(-1)*p = {0}".format(q*p))
 print()
 
 q = Quaternion(1, -2, 3, -4)
 print("q = {0}".format(q))
 print("p+q = {0}".format(p+q))