Misc matrix algorithms using MPFR

sage.matrix.misc_mpfr.hadamard_row_bound_mpfr(A)[source]

Given a matrix \(A\) with entries that coerce to RR, compute the row Hadamard bound on the determinant.

INPUT:

  • A – a matrix over RR

OUTPUT:

integer – an integer n such that the absolute value of the determinant of this matrix is at most \(10^n\).

EXAMPLES:

We create a very large matrix, compute the row Hadamard bound, and also compute the row Hadamard bound of the transpose, which happens to be sharp.

sage: a = matrix(ZZ, 2, [2^10000, 3^10000, 2^50, 3^19292])
sage: from sage.matrix.misc_mpfr import hadamard_row_bound_mpfr
sage: hadamard_row_bound_mpfr(a.change_ring(RR))
13976
sage: len(str(a.det()))
12215
sage: hadamard_row_bound_mpfr(a.transpose().change_ring(RR))
12215
>>> from sage.all import *
>>> a = matrix(ZZ, Integer(2), [Integer(2)**Integer(10000), Integer(3)**Integer(10000), Integer(2)**Integer(50), Integer(3)**Integer(19292)])
>>> from sage.matrix.misc_mpfr import hadamard_row_bound_mpfr
>>> hadamard_row_bound_mpfr(a.change_ring(RR))
13976
>>> len(str(a.det()))
12215
>>> hadamard_row_bound_mpfr(a.transpose().change_ring(RR))
12215
a = matrix(ZZ, 2, [2^10000, 3^10000, 2^50, 3^19292])
from sage.matrix.misc_mpfr import hadamard_row_bound_mpfr
hadamard_row_bound_mpfr(a.change_ring(RR))
len(str(a.det()))
hadamard_row_bound_mpfr(a.transpose().change_ring(RR))

Note that in the above example using RDF would overflow:

sage: b = a.change_ring(RDF)
sage: b._hadamard_row_bound()
Traceback (most recent call last):
...
OverflowError: cannot convert float infinity to integer
>>> from sage.all import *
>>> b = a.change_ring(RDF)
>>> b._hadamard_row_bound()
Traceback (most recent call last):
...
OverflowError: cannot convert float infinity to integer
b = a.change_ring(RDF)
b._hadamard_row_bound()