@@ -757,11 +757,23 @@ def test_fmpq_mat():
757757 assert Z (2 ,3 ,[1 ,2 ,3 ,4 ,5 ,6 ]) * Q (3 ,2 ,[4 ,5 ,6 ,7 ,8 ,9 ]) == Q (2 ,2 ,[40 ,46 ,94 ,109 ])
758758 assert - Q (2 ,1 ,[2 ,5 ]) == Q (2 ,1 ,[- 2 ,- 5 ])
759759 assert + Q (1 ,1 ,[3 ]) == Z (1 ,1 ,[3 ])
760+ assert (Q (1 ,1 ,[1 ]) == 1 ) is False
761+ assert (Q (1 ,1 ,[1 ]) != 1 ) is True
762+ assert (1 == Q (1 ,1 ,[1 ])) is False
763+ assert (1 != Q (1 ,1 ,[1 ])) is True
760764 assert Q (1 ,2 ,[3 ,4 ]) * 2 == Q (1 ,2 ,[6 ,8 ])
761765 assert Q (1 ,2 ,[3 ,4 ]) * flint .fmpq (1 ,3 ) == Q (1 ,2 ,[1 ,flint .fmpq (4 ,3 )])
762766 assert Q (1 ,2 ,[3 ,4 ]) * flint .fmpq (5 ,3 ) == Q (1 ,2 ,[5 ,flint .fmpq (20 ,3 )])
763767 assert 2 * Q (1 ,2 ,[3 ,4 ]) == Q (1 ,2 ,[6 ,8 ])
764768 assert flint .fmpq (1 ,3 ) * Q (1 ,2 ,[3 ,4 ]) == Q (1 ,2 ,[1 ,flint .fmpq (4 ,3 )])
769+ M = Q ([[1 ,2 ],[3 ,4 ]])
770+ assert M ** - 1 == Q ([[- 4 ,2 ],[3 ,- 1 ]]) / 2
771+ assert M ** 0 == Q ([[1 ,0 ],[0 ,1 ]])
772+ assert M ** 1 == M
773+ assert M ** 2 == Q ([[7 ,10 ],[15 ,22 ]])
774+ assert M ** 12 == Q ([[138067399 , 201223170 ],[301834755 , 439902154 ]])
775+ M = Q ([[1 ,2 ],[2 ,4 ]])
776+ assert raises (lambda : M ** - 1 , ZeroDivisionError )
765777 assert Q (1 ,2 ,[3 ,4 ]) / 2 == Q (1 ,2 ,[flint .fmpq (3 ,2 ),2 ])
766778 assert Q (1 ,2 ,[3 ,4 ]) / flint .fmpq (2 ,3 ) == Q (1 ,2 ,[flint .fmpq (9 ,2 ),6 ])
767779 assert Q (3 ,2 ,range (6 )).table () == Z (3 ,2 ,range (6 )).table ()
@@ -776,7 +788,72 @@ def test_fmpq_mat():
776788 assert raises (lambda : Q (2 ,1 ,[1 ,1 ]).inv (), ValueError )
777789 assert raises (lambda : Q ([1 ]), TypeError )
778790 assert raises (lambda : Q ([[1 ],[2 ,3 ]]), ValueError )
791+ assert raises (lambda : Q (None ), TypeError )
779792 assert Q ([[1 ,2 ,3 ],[4 ,5 ,6 ]]) == Q (2 ,3 ,[1 ,2 ,3 ,4 ,5 ,6 ])
793+ assert raises (lambda : Q (2 ,3 ,[1 ,2 ,3 ,4 ,5 ]), ValueError )
794+ # XXX: Should be TypeError not ValueError:
795+ assert raises (lambda : Q ([[1 ,2 ,3 ],[4 ,[],6 ]]), ValueError )
796+ assert raises (lambda : Q (2 ,3 ,[1 ,2 ,3 ,4 ,[],6 ]), ValueError )
797+ assert raises (lambda : Q (2 ,3 ,[1 ,2 ],[3 ,4 ]), ValueError )
798+ assert bool (Q ([[1 ]])) is True
799+ assert bool (Q ([[0 ]])) is False
800+ assert raises (lambda : Q ([[1 ]]) < Q ([[0 ]]), TypeError )
801+ M = Q ([[1 ,2 ],[3 ,4 ]])
802+ assert M [0 ,1 ] == 2
803+ M [0 ,1 ] = - 1
804+ assert M [0 ,1 ] == - 1
805+ # XXX: Negative indices should probably be allowed
806+ def set_bad (i ):
807+ M [i ,0 ] = - 1
808+ raises (lambda : M [- 1 ,0 ], ValueError )
809+ raises (lambda : M [0 ,- 1 ], ValueError )
810+ raises (lambda : set_bad (- 1 ), ValueError )
811+ # XXX: Should be IndexError
812+ raises (lambda : M [2 ,0 ], ValueError )
813+ raises (lambda : M [0 ,2 ], ValueError )
814+ raises (lambda : set_bad (2 ), ValueError )
815+ assert Q ([[1 ,2 ,3 ],[4 ,5 ,6 ]]).transpose () == Q ([[1 ,4 ],[2 ,5 ],[3 ,6 ]])
816+ raises (lambda : M + [], TypeError )
817+ raises (lambda : M - [], TypeError )
818+ raises (lambda : M * [], TypeError )
819+ raises (lambda : M / [], TypeError )
820+ raises (lambda : [] / M , TypeError )
821+ raises (lambda : [] + M , TypeError )
822+ raises (lambda : [] - M , TypeError )
823+ raises (lambda : [] * M , TypeError )
824+ # XXX: Maybe a ShapeError?
825+ raises (lambda : Q (1 ,2 ,[3 ,4 ]) + Q (1 ,3 ,[5 ,6 ,7 ]), ValueError )
826+ raises (lambda : Q (1 ,2 ,[3 ,4 ]) - Q (1 ,3 ,[5 ,6 ,7 ]), ValueError )
827+ raises (lambda : Q (1 ,2 ,[3 ,4 ]) * Q (1 ,3 ,[5 ,6 ,7 ]), ValueError )
828+ raises (lambda : Q (1 ,2 ,[3 ,4 ]) * Z (1 ,3 ,[5 ,6 ,7 ]), ValueError )
829+ raises (lambda : Z (1 ,2 ,[3 ,4 ]) * Q (1 ,3 ,[5 ,6 ,7 ]), ValueError )
830+ A = Q ([[3 ,4 ],[5 ,7 ]]) / 11
831+ X = Q ([[1 ,2 ],[3 ,4 ]])
832+ B = A * X
833+ assert A .solve (B ) == X
834+ for algorithm in None , "fflu" , "dixon" :
835+ assert A .solve (B , algorithm = algorithm ) == X
836+ assert raises (lambda : A .solve (B , algorithm = "invalid" ), ValueError )
837+ assert raises (lambda : A .solve (None ), TypeError )
838+ assert raises (lambda : A .solve ([1 ,2 ]), TypeError )
839+ assert raises (lambda : A .solve (Q ([[1 ,2 ]])), ValueError )
840+ assert raises (lambda : Q ([[1 ,2 ],[2 ,4 ]]).solve (Q ([[1 ],[2 ]])), ZeroDivisionError )
841+ M = Q ([[1 ,2 ,3 ],[flint .fmpq (1 ,2 ),5 ,6 ]])
842+ Mcopy = Q (M )
843+ Mrref = Q ([[1 ,0 ,flint .fmpq (3 ,4 )],[0 ,1 ,flint .fmpq (9 ,8 )]])
844+ assert M .rref () == (Mrref , 2 )
845+ assert M != Mrref
846+ assert M == Mcopy
847+ assert M .rref (inplace = True ) == (Mrref , 2 )
848+ assert M == Mrref
849+ assert M != Mcopy
850+ assert Q .hilbert (1 , 2 ) == Q ([[1 ,flint .fmpq (1 ,2 )]])
851+ M2 = Q ([[2 , 4 , 6 ], [8 , 10 , 12 ]]) / 4
852+ assert M2 .numer_denom () == (Q ([[1 ,2 ,3 ],[4 ,5 ,6 ]]), 2 )
853+ half = flint .fmpq (1 ,2 )
854+ M3 = Q ([[half ,0 ,0 ],[0 ,half ,1 ],[0 ,0 ,half ]])
855+ assert M3 .charpoly () == flint .fmpq_poly ([- 1 ,6 ,- 12 ,8 ]) / 8
856+ assert M3 .minpoly () == flint .fmpq_poly ([1 ,- 4 ,4 ]) / 4
780857
781858def test_nmod ():
782859 G = flint .nmod
0 commit comments