def test_serie_2(be,A,det_div):
 dim=A.ncols()
 for d in det_div:
  assert 1<d and d <= max_det_divisor
  Ff=flint.fmpz_mat_hermite_form_nonsquare( fmpz_mat(A), d )
  F=Ff.export_sage()
  t2=time.time()
  rS0=sage_0( F )
  t3=time.time()
  rF0=flint_0( Ff )
  t4=time.time()
  # calling flint_sage method A before B makes method A appear to run slower, at
  #  least for small dim. Calling fmpz_triU_small_det_inverse() first, to give 
  #  FLINT subroutine fmpz_mat_inv() a handicap
  rM0=mine_0( Ff )
  t5=time.time()
  rF1=flint_1( Ff )
  t6=time.time()
  be[-1] += 1
  be[0] += t3-t2
  be[1] += t4-t3
  be[3] += t5-t4
  be[2] += t6-t5
  Si=identity_matrix(dim)
  assert rS0[0]*rS0[1] == Si
  assert multiply_test_fmpz_fmpq( rF0[0], rF0[1], dim )
  # den must divide determinant
  trace_F = trace(F)
  assert 0 == trace_F % rF1[2]
  assert multiply_test_fmpz_fmpz_den( rF1, Si )
  assert 0 == trace_F % rM0[2]
  assert multiply_test_fmpz_fmpz_den( rM0, Si )
def test_serie_2(be, A, det_div):
    dim = A.ncols()
    for d in det_div:
        assert 1 < d and d <= max_det_divisor
        Ff = flint.fmpz_mat_hermite_form_nonsquare(fmpz_mat(A), d)
        F = Ff.export_sage()
        t2 = time.time()
        rS0 = sage_0(F)
        t3 = time.time()
        rF0 = flint_0(Ff)
        t4 = time.time()
        rF1 = flint_1(Ff)
        t5 = time.time()
        # print 'A sou=\n',F
        # print 'A    =\n',rF1[0].export_sage()
        be[-1] += 1
        be[0] += t3 - t2
        be[1] += t4 - t3
        be[2] += t5 - t4
        Si = identity_matrix(dim)
        assert rS0[0] * rS0[1] == Si
        assert multiply_test_fmpz_fmpq(rF0[0], rF0[1], dim)
        # FLINT documentation on mpz_mat_inv() says den must divide determinant
        assert 0 == trace(F) % rF1[2]
        assert multiply_test_fmpz_fmpz_den(rF1, Si)