@@ -446,11 +446,58 @@ def set_bad(i,j):
446446 assert M1 * x == b
447447 assert M1 .solve (b ) == x
448448 assert M1 .solve (b , integer = True ) == x
449+ assert raises (lambda : M1 .solve ([]), TypeError )
450+ assert raises (lambda : M1 .solve (M ([[1 ]])), ValueError )
451+ assert raises (lambda : M ([[1 ,1 ],[1 ,1 ]]).solve (b ), ZeroDivisionError )
452+ assert raises (lambda : M ([[1 ,2 ],[3 ,4 ],[5 ,6 ]]).solve (b ), ValueError )
453+ assert M ([[1 ,0 ],[1 ,2 ]]).solve (b ) == flint .fmpq_mat ([[3 ],[2 ]])
454+ assert raises (lambda : M ([[1 ,0 ],[1 ,2 ]]).solve (b , integer = True ), ValueError )
449455 assert raises (lambda : M ([[1 ,2 ,3 ],[4 ,5 ,6 ]]).inv (), ValueError )
450456 assert raises (lambda : M ([[1 ,1 ],[1 ,1 ]]).inv (), ZeroDivisionError )
451457 assert raises (lambda : M ([[1 ,0 ],[1 ,2 ]]).inv (integer = True ), ValueError )
452458 half = flint .fmpq (1 ,2 )
453459 assert M ([[1 ,0 ],[1 ,2 ]]).inv () == flint .fmpq_mat ([[1 , 0 ], [- half , half ]])
460+ M3 = M ([[1 ,2 ,3 ],[4 ,5 ,6 ],[7 ,8 ,9 ]])
461+ M3_copy = M (M3 )
462+ M3r = M ([[- 3 ,0 ,3 ],[0 ,- 3 ,- 6 ],[0 ,0 ,0 ]])
463+ assert M3 .rref () == (M3r , - 3 , 2 )
464+ assert M3 != M3r
465+ assert M3 .rref (inplace = True ) == (M3r , - 3 , 2 )
466+ assert M3 == M3r
467+ M3 = M3_copy
468+ M3n = M ([[3 ,0 ,0 ],[- 6 ,0 ,0 ],[3 ,0 ,0 ]])
469+ assert M3 .nullspace () == (M3n , 1 )
470+ assert M3 * M3 .nullspace ()[0 ] == M (3 ,3 ,[0 ]* 9 )
471+ # XXX: lll core dumps on a singular matrix
472+ M4 = M ([[1 ,2 ,3 ],[4 ,5 ,6 ],[7 ,8 ,10 ]])
473+ L4 = M ([[0 ,0 ,1 ],[- 1 ,1 ,0 ],[2 ,1 ,0 ]])
474+ T4 = M ([[1 ,- 2 ,1 ],[0 ,5 ,- 3 ],[- 2 ,1 ,0 ]])
475+ assert L4 == T4 * M4
476+ assert M4 .lll () == L4
477+ assert M4 .lll (transform = True ) == (L4 , T4 )
478+ # XXX: rep="gram" consumes all memory in the system and core dumps
479+ #for rep in "zbasis", "gram":
480+ rep = "zbasis"
481+ for gram in "approx" , "exact" :
482+ assert M4 .lll (rep = rep , gram = gram ) == L4
483+ assert M4 .lll (rep = rep , gram = gram , transform = True ) == (L4 , T4 )
484+ assert raises (lambda : M4 .lll (rep = "bad" ), ValueError )
485+ assert raises (lambda : M4 .lll (gram = "bad" ), ValueError )
486+ M5 = M ([[1 ,2 ,3 ],[4 ,5 ,6 ]])
487+ H5 = M ([[1 ,2 ,3 ],[0 ,3 ,6 ]])
488+ T5 = M ([[1 ,0 ],[4 ,- 1 ]])
489+ assert H5 == T5 * M5
490+ assert M5 .hnf () == H5
491+ assert M5 .hnf (transform = True ) == (H5 , T5 )
492+ assert M5 .is_hnf () is False
493+ assert H5 .is_hnf () is True
494+ S5 = M ([[1 ,0 ,0 ],[0 ,3 ,0 ]])
495+ assert M5 .snf () == S5
496+ assert M5 .is_snf () is False
497+ assert S5 .is_snf () is True
498+ M6 = M ([[2 ,0 ,0 ],[0 ,2 ,1 ],[0 ,0 ,2 ]])
499+ assert M6 .charpoly () == flint .fmpz_poly ([- 8 ,12 ,- 6 ,1 ])
500+ assert M6 .minpoly () == flint .fmpz_poly ([4 ,- 4 ,1 ])
454501
455502def test_fmpq ():
456503 Q = flint .fmpq
0 commit comments