I have banged my head on this for a couple of hours and I can't find what's wrong:
$$ \begin{align} \frac{\partial}{\partial A_{pq}}\det(\mathbb{1} - AA^\dagger) &= \det(\mathbb{1} - AA^\dagger)\mathrm{tr}\left[(\mathbb{1} - AA^\dagger)^{-1}\frac{\partial(\mathbb{1} - AA^\dagger)}{\partial A_{pq}}\right]\\ &=\det(\mathbb{1} - AA^\dagger)\sum_{mnk}(\mathbb{1} - AA^\dagger)^{-1}_{mn}\frac{\partial(\mathbb{1}_{nm} - A_{nk}A^\dagger_{km})}{\partial A_{pq}}\\ &= \det(\mathbb{1} - AA^\dagger)\sum_{mnk}(\mathbb{1} - AA^\dagger)^{-1}_{mn}\delta_{np}\delta_{kq}(-A^\dagger_{km})\\ &=\det(\mathbb{1} - AA^\dagger)\sum_{m}(\mathbb{1} - AA^\dagger)^{-1}_{mp}(-A^\dagger_{qm})\\ &=-\det(\mathbb{1} - AA^\dagger)(\mathbb{1} - AA^\dagger)^{-T}A^* \end{align} $$
When I try it out numerically though, it's off by a factor 2:
def det(A):
return np.linalg.det(np.identity(A.shape[0]) - A @ np.conj(A.T))
def ddet(A):
return - det(A) * np.linalg.inv(np.identity(A.shape[0]) - [email protected](A.T)).T @ np.conj(A)
A1 = np.array([[0.1, 0.2],[0.2, 0.3]])
A2 = np.array([[0.1, 0.2],[0.2, 0.3+delta]])
delta = 1e-6
np.isclose((det(A2) - det(A1))/delta, 2*ddet(A1)[1,1])
>>> True
When the entries of $A$ are complex it's even more wrong, but let's solve the 2x issue first.