Hello,

I'm using SAGE 8.9 via CoCalc.

Calling eigenvectors_right() on a matrix m with entries in the number field 
Q(i) returns some vectors with entries in Q(i), others with entries in 
QQbar (see example below).  I would have expected that applying 
change_ring(QQbar) to such vectors would produce the same vectors as 
returned by m.change_ring(QQbar).eigenvectors_right(), at least for some 
choice of embedding Q(i) -> QQbar.  This does not appear to be the case: 
the former approach gives inconsistent answers, the latter seems correct.

I've pasted below some code and output demonstrating the issue in the 
simplest example I could find.

The reason I'm not just working over QQbar from the beginning is that doing 
so seems much slower than working directly over Q(i).  I managed to 
circumvent the issue by using eigenspaces_right(format='galois') and 
embedding things clunkily by hand (see below), but would appreciate any 
suggestions on how to do things better.

Thanks,

Paul

---

Code:

def print_eigenspace(e):
    print "Eigenvalue:", e[0]
    print "Basis for eigenspace:"
    for v in e[1]:
        print "  ", v.change_ring(QQbar)

K.<i> = QuadraticField(-1)
M = MatrixSpace(K, 4)
m = M([2,4*i,-i,0, -4*i,2,-1,0, 2*i,-2,0,0, 4*i+4, 4*i-4,1-i,-2])
print "The following matrices are related by i \mapsto I:"
print
print m
print
print m.change_ring(QQbar)
print
print "We note that the results of m.eigenvectors_right() are defined over 
both Q(i) and QQbar:"
print
for e in m.eigenvectors_right():
    print "Eigenvalue:", e[0]
    print e[0].parent()
    assert e[0].parent() == e[1][0][0].parent()
    print
print
print "We aim to compute a basis of eigenvectors for these matrices."
print
print "1. Working over QQbar gives the correct answer:"
print
for e in m.change_ring(QQbar).eigenvectors_right():
    print_eigenspace(e)
    print
print
print "2. Working over Q(i) and  changing to QQbar gives the wrong answer: 
some (but not all) eigenspaces get conjugated:"
print
for e in m.eigenvectors_right():
    print_eigenspace(e)
    print
print
print "3. We obtain the correct answer by working over Q(i) and calling 
eigenspaces() with format='galois':"
print
for e in m.eigenspaces_right(format='galois'):
    I = QQbar.gens()[0]
    F = e[0].parent()
    for iota in F.embeddings(QQbar):
        if iota(i) == I:
            print_eigenspace((iota(e[0]), [v.apply_map(iota) for v in 
e[1].basis()]))
    print

---

Output:

The following matrices are related by i \mapsto I: [ 2 4*i -i 0] [ -4*i 2 
-1 0] [ 2*i -2 0 0] [4*i + 4 4*i - 4 -i + 1 -2] [ 2 4*I -I 0] [ -4*I 2 -1 
0] [ 2*I -2 0 0] [4*I + 4 4*I - 4 -I + 1 -2] We note that the results of 
m.eigenvectors_right() are defined over both Q(i) and QQbar: Eigenvalue: -2 
Number Field in i with defining polynomial x^2 + 1 with i = 1*I Eigenvalue: 
-0.6055512754639893? Algebraic Field Eigenvalue: 6.605551275463989? 
Algebraic Field We aim to compute a basis of eigenvectors for these 
matrices. 1. Working over QQbar gives the correct answer: Eigenvalue: 
6.605551275463989? Basis for eigenspace: (1.000000000000000? + 0.?e-17*I, 
0.?e-17 - 1.000000000000000?*I, 0.?e-17 + 0.6055512754639893?*I, 
1.000000000000000? + 1.000000000000000?*I) Eigenvalue: -0.6055512754639893? 
Basis for eigenspace: (1.000000000000000? + 0.?e-16*I, 0.?e-16 - 
1.000000000000000?*I, 0.?e-16 - 6.605551275463989?*I, 1.000000000000000? + 
1.000000000000000?*I) Eigenvalue: -2 Basis for eigenspace: (1, 1*I, 0, 0) 
(0, 0, 0, 1) 2. Working over Q(i) and changing to QQbar gives the wrong 
answer: some (but not all) eigenspaces get conjugated: Eigenvalue: -2 Basis 
for eigenspace: (1, I, 0, 0) (0, 0, 0, 1) Eigenvalue: -0.6055512754639893? 
Basis for eigenspace: (1, 0.?e-54 + 1.000000000000000?*I, 0.?e-53 + 
6.605551275463989?*I, 1.000000000000000? - 1.000000000000000?*I) 
Eigenvalue: 6.605551275463989? Basis for eigenspace: (1, 0.?e-53 + 
1.000000000000000?*I, 0.?e-52 - 0.6055512754639893?*I, 1.000000000000000? - 
1.000000000000000?*I) 3. We obtain the correct answer by working over Q(i) 
and calling eigenspaces() with format='galois': Eigenvalue: -2 Basis for 
eigenspace: (1, 1*I, 0, 0) (0, 0, 0, 1) Eigenvalue: -0.6055512754639893? + 
0.?e-54*I Basis for eigenspace: (1, 0.?e-54 - 1.000000000000000?*I, 0.?e-53 
- 6.605551275463989?*I, 1.000000000000000? + 1.000000000000000?*I) 
Eigenvalue: 6.605551275463989? + 0.?e-51*I Basis for eigenspace: (1, 
0.?e-52 - 1.000000000000000?*I, 0.?e-51 + 0.6055512754639893?*I, 
1.000000000000000? + 1.000000000000000?*I)

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sage-devel/9f9b6a7d-a2db-474e-b93b-5583473c5dcbo%40googlegroups.com.

Reply via email to