(1) Let me add some notation to the question. (To see if i get it right.)
Let A,B be two square matrices of shape n×n, n>0 natural number, A,B∈Mn(Z).
We know there is an invertible matrix S∈Mn(Q) with:
A=SBS−1 .
The question is - if i am interpreting it right - if we can do the above with S even in Mn(Z).
Yes, if S has entries with denominators, build the common denominator (lcm of all denominators of the entries) d and use dS instead of S.
(2) Let us fix ideas and use a specific number field K:
sage: K.<a> = QuadraticField( -46 )
sage: ClK = K.class_group()
sage: ClK
Class group of order 4 with structure C4 of Number Field in a with defining polynomial x^2 + 46
sage: for c in ClK:
....: print c
....:
Trivial principal fractional ideal class
Fractional ideal class (5, a + 3)
Fractional ideal class (2, a)
Fractional ideal class (5, a + 2)
sage: c = ClK[3]
sage: c
Fractional ideal class (5, a + 2)
sage: c.ideal()
Fractional ideal (5, a + 2)
sage: c.ideal().integral_basis()
[5, a + 2]
(From the class c, we have to go first to its ideal, c.ideal()
, first, then we can apply the method integral_basis.)
Conversely, let us suppose we have the above two elements 5, and a+2, and want to associate (in the given setting):
- the ideal J in OK generated by these two elements, and
- the ideal class in the class group, which is J modulo principal ideals.
Now i am finally in position to answer (by sample code) the question:
sage: J = K.ideal( [5, a+2] )
sage: J == c.ideal()
True
sage: ClK(J)
Fractional ideal class (5, a + 2)
sage: ClK(J) == c
True
In words, the constructor to be applied on the list is K.ideal
.
We have got a (fractional) ideal in (the ring of integers of) K, called J
. (Ideals and fractional ideals are sometimes hard to separate in sage.) In order to pass with it modulo principal ideals, we simply convert it via ClK( J )
to an object inClK
.
So far, things are coherent in a natural way. To break slightly the perfect picture, note that...
sage: J
Fractional ideal (5, a + 2)
sage: J.parent()
Monoid of ideals of Number Field in a with defining polynomial x^2 + 46
sage: c.parent()
Class group of order 4 with structure C4 of Number Field in a with defining polynomial x^2 + 46
sage: J == c
True
(The true boolean eval of J == c
is maybe unexpected.)
Note: The above also works in more complicated number fields. For instance:
sage: R.<x> = PolynomialRing(QQ)
sage: K.<a> = NumberField( x^3 - x - 2017 )
sage: a.minpoly()
x^3 - x - 2017
sage: ClK = K.class_group()
sage: ClK
Class group of order 6 with structure C6 of Number Field in a with defining polynomial x^3 - x - 2017
sage: c = ClK.list()[-1]
sage: c.order()
6
sage: c
Fractional ideal class (119, a + 9)
sage: J = K.ideal( [ 119, a+9 ] )
sage: J == c.ideal()
True
sage: ClK(J) == c
True
sage: J*J
Fractional ideal (14161, a + 2865)
sage: c*c
Fractional ideal class (103, a - 33)
sage: J == c
True
sage: c.parent()
Class group of order 6 with structure C6 of Number Field in a with defining polynomial x^3 - x - 2017
sage: J.parent()
Monoid of ideals of Number Field in a with defining polynomial x^3 - x - 2017
sage: J^6
Fractional ideal (2839760855281, a - 688711041646)
sage: c^6
Trivial principal fractional ideal class
sage: ClK( J^6 )
Trivial principal fractional ideal class
sage: J^6 == c^6
False
So care should be taken, e.g. J6 is not c6, although...