# Computing in a quaternion algebra over a complex field?

If I enter

Q.<i,j,k> = QuaternionAlgebra(CC,1,1)


there is no problem. I can then type something like

(2+i+j)*(3*i-j)


2.00000000000000 + 6.00000000000000*i + (-2.00000000000000)*j + (-4.00000000000000)*k


The problem comes when I want to use non-real numbers. If I type

i*sqrt(-1)


then I get

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-0b500ba4930f> in <module>()
1 Q = QuaternionAlgebra(CC,Integer(1),Integer(1), names=('i', 'j', 'k',)); (i, j, k,) = Q._first_ngens(3)
----> 2 i*sqrt(-Integer(1))

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/structure/element.so in sage.structure.element.RingElement.__mul__ (/home/sc_serv/sage/src/build/cythonized/sage/structure/element.c:17265)()

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/structure/coerce.so in sage.structure.coerce.CoercionModel_cache_maps.bin_op (/home/sc_serv/sage/src/build/cythonized/sage/structure/coerce.c:9721)()

TypeError: unsupported operand parent(s) for '*': 'Quaternion Algebra (1.00000000000000, 1.00000000000000) with base ring Complex Field with 53 bits of precision' and 'Symbolic Ring'


As a matter of fact, something similar happens if I type

i*sqrt(2)


which is not imaginary... I also tried typing

I*i


and got a similar error message. Since I am supposedly working in the quaternion algebra over the complex numbers, how do I specify arbitrary complex coefficients?

edit retag close merge delete

Sort by » oldest newest most voted

You should use

sage:  sage: Q.<i,j,k> = QuaternionAlgebra(CC,1,1)
sage: i * CC(-1).sqrt()
1.00000000000000*I*i
sage: j * CC(2).sqrt()
1.41421356237310*j


The reason it fails with your code is that the function sqrt returns symbolic objects when called with non square integers

sage: s = sqrt(2)
sage: print s ,type(s)
sqrt(2) <type 'sage.symbolic.expression.Expression'>


But the symbolic world has nothing such as generalized quaternions and hence it fails. As you wanted a result in your algebra just avoid symbolic objects.

Note that the following works fine

sage: sqrt(CC(-1))
1.00000000000000*I
sage: parent(_)
Complex Field with 53 bits of precision


To be compared with

sage: sqrt(-1)
I
sage: parent(_)
Symbolic Ring

more

Cool. In light of this I prefer to include

Im = CC(-1).sqrt()


rather than typing that every time, though I'd still need to worry about irrational square roots and whatnot. I guess the quaternion algebra stuff is designed more for computing properties of the algebras than for computations within them?

( 2015-12-24 07:53:47 -0600 )edit

@j0equ1nn people who wrote the quaternion code were careful about speed. So I wouldn't say so. Though, I think that it was more designed to be used with coefficients in number fields rather than with floating points.

( 2015-12-24 11:47:53 -0600 )edit