@@ -446,11 +446,58 @@ def set_bad(i,j):
446
446
assert M1 * x == b
447
447
assert M1 .solve (b ) == x
448
448
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 )
449
455
assert raises (lambda : M ([[1 ,2 ,3 ],[4 ,5 ,6 ]]).inv (), ValueError )
450
456
assert raises (lambda : M ([[1 ,1 ],[1 ,1 ]]).inv (), ZeroDivisionError )
451
457
assert raises (lambda : M ([[1 ,0 ],[1 ,2 ]]).inv (integer = True ), ValueError )
452
458
half = flint .fmpq (1 ,2 )
453
459
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 ])
454
501
455
502
def test_fmpq ():
456
503
Q = flint .fmpq
0 commit comments