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()
        t0 = time.time()
        rY0 = sympy_0(F)
        t1 = time.time()
        rY1 = sympy_1(F)
        t2 = time.time()
        rS0 = sage_0(F)
        t3 = time.time()
        F._clear_cache()
        rS1 = sage_1(F)
        t4 = time.time()
        rF = flint_0(Ff)
        t5 = time.time()
        be[-1] += 1
        be[0] += t1 - t0
        be[1] += t2 - t1
        be[2] += t3 - t2
        be[3] += t4 - t3
        be[4] += t5 - t4
        Yi, Si = sympy.eye(dim), identity_matrix(dim)
        # print rY0[0],'\n*\n',rY0[1],'\n=\n',rY0[0]*rY0[1],'\n=?=\n',Yi
        assert rY0[0] * rY0[1] == Yi
        assert rY1[0] * rY1[1] == Yi
        assert rS0[0] * rS0[1] == Si
        assert rS1[0] * rS1[1] == Si
        assert multiply_test_fmpz_fmpq(rF[0], rF[1], dim)
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)
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(A,det_div,loud):
 H=hnf(A,include_zero_rows=0)[0]
 for d in det_div:
  assert 1<d and d <= max_det_divisor
  F=flint.fmpz_mat_hermite_form_nonsquare( fmpz_mat(A), d )
  if loud:
   print '\n\n\n'
   test_dump(A, F.export_sage(), d)
   print '\n\n'
  err=0
  if trace(F) != d:
   print 'Determinant of F is bad: %s != %s' % (trace(F),d)
   err=1
  if not divides( F, H ):
   print 'F does not divide H'
   err=1
  if err: 
   if not loud:
    test_dump(A, F.export_sage(), d)
   print 'H=\n',H
   if A.nrows() == A.ncols():
    x=trace(H)
    if x<2**64:
     Q=flint.fmpz_mat_hermite_form( fmpz_mat(A), x ).export_sage()
     print 'Q=\n',Q
   sys.exit(1)