Ask Your Question

Computing in a quaternion algebra over a complex field?

asked 2015-12-23 18:15:45 +0200

j0equ1nn gravatar image

updated 2015-12-28 10:42:32 +0200

slelievre gravatar image

If I enter

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

there is no problem. I can then type something like


and get the appropriate answer

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


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/ 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/ 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


which is not imaginary... I also tried typing


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 flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted

answered 2015-12-23 19:58:33 +0200

vdelecroix gravatar image

You should use

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

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))
sage: parent(_)
Complex Field with 53 bits of precision

To be compared with

sage: sqrt(-1)
sage: parent(_)
Symbolic Ring
edit flag offensive delete link 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?

j0equ1nn gravatar imagej0equ1nn ( 2015-12-24 14:53:47 +0200 )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.

vdelecroix gravatar imagevdelecroix ( 2015-12-24 18:47:53 +0200 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower


Asked: 2015-12-23 18:15:45 +0200

Seen: 327 times

Last updated: Dec 28 '15