Skip to content

Commit abb4f57

Browse files
authored
feat(M4.3): Fully prove. (#40)
* feat(M4.3): Prove most of forwards direction. Reordered parts of M3.3 in order to get the order of diagonal elements correct. Ideally, we would have a Lemma stating that given one permutation of the diagonal elements in a spectral decomposition, we can get all of them for different conjugation matrices. * perf(M4.1): Apply some helpers before `lma'`. * perf(M4.1): Pre-solve another `lma'`. * feat(M4.3): Prove half of reverse direction. * feat(M4.3): Finish forwards direction. * feat(M4.3): Mostly prove reverse direction. Missing existential quantifier for unit complex numbers. * feat(M4.3): Prove Cexp_Cmod, finishing this lemma. * refactor: Remove `swap_kron`. * perf(M3.1): Pre-solve matrix. * docs: Add PERF todo.
1 parent 5dba765 commit abb4f57

File tree

4 files changed

+642
-123
lines changed

4 files changed

+642
-123
lines changed

AlgebraHelpers.v

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,3 +808,109 @@ rewrite <- (Nat.Div0.mod_add (i - j) 1).
808808
replace (1 * j)%nat with j by lia.
809809
rewrite Nat.sub_add; auto.
810810
Qed.
811+
812+
(* TODO: Can this proof be made shorter? It's a bit unwieldy at the moment *)
813+
Lemma Cexp_Cmod : forall (c : C), Cmod c = 1 -> exists (θ : R), Cexp θ = c.
814+
Proof.
815+
intros.
816+
destruct c as [re im].
817+
assert (re * re + im * im = 1)%R.
818+
{
819+
fold (Rsqr re) (Rsqr im).
820+
unfold Cmod in H; simpl in H.
821+
repeat rewrite Rmult_1_r in H.
822+
rewrite <- Rmult_1_l.
823+
rewrite <- H.
824+
symmetry.
825+
apply (Rsqr_sqrt).
826+
apply Rplus_le_le_0_compat; apply Rle_0_sqr.
827+
}
828+
assert (re <> 0 -> (√(1 + (im / re)²) = 1 / √(re * re))%R).
829+
{
830+
intros.
831+
unfold Rsqr.
832+
rewrite Rmult_div; auto.
833+
unfold Rdiv.
834+
rewrite <- Rinv_r with (r := (re * re)%R) at 1; auto.
835+
rewrite <- Rmult_plus_distr_r.
836+
rewrite H0.
837+
rewrite <- Rdiv_unfold, sqrt_div; try lra.
838+
rewrite sqrt_1.
839+
reflexivity.
840+
fold (Rsqr re).
841+
apply Rlt_0_sqr.
842+
assumption.
843+
}
844+
destruct (Req_appart_dec re 0)%R as [re_eq_0 | [re_lt_0 | req_gt_0]].
845+
{
846+
clear H1.
847+
rewrite re_eq_0 in H0.
848+
rewrite Rmult_0_l, Rplus_0_l in H0.
849+
rewrite <- Rsqr_1 in H0.
850+
fold (Rsqr im) in H0.
851+
pose proof (Rsqr_eq_abs_0 im 1 H0) as H1.
852+
rewrite Rabs_R1 in H1.
853+
unfold Rabs in H1.
854+
destruct (Rcase_abs im).
855+
{
856+
exists (3 * (PI / 2))%R.
857+
unfold Cexp.
858+
rewrite sin_3PI2, cos_3PI2.
859+
rewrite re_eq_0.
860+
replace (im) with (-1)%R by lra.
861+
reflexivity.
862+
}
863+
{
864+
exists (PI / 2)%R.
865+
unfold Cexp.
866+
rewrite sin_PI2, cos_PI2.
867+
rewrite re_eq_0, H1.
868+
reflexivity.
869+
}
870+
}
871+
{
872+
assert (re <> 0)%R by lra.
873+
exists (atan (im / re) + PI)%R.
874+
unfold Cexp.
875+
rewrite sin_plus, cos_plus.
876+
rewrite sin_atan, cos_atan.
877+
rewrite H1; auto; clear H1.
878+
unfold Rdiv.
879+
rewrite Rinv_mult.
880+
rewrite Rinv_1.
881+
rewrite Rinv_inv.
882+
repeat rewrite Rmult_1_l.
883+
replace (re * re)%R with ((-re) * (-re))%R by lra.
884+
rewrite sqrt_mult; try lra.
885+
rewrite sqrt_sqrt; try lra.
886+
rewrite sin_PI, cos_PI.
887+
repeat rewrite Rmult_0_r.
888+
unfold Rminus.
889+
rewrite Ropp_0.
890+
repeat rewrite Rplus_0_r.
891+
rewrite Rmult_assoc.
892+
replace (-re * -1)%R with re by lra.
893+
rewrite Rmult_assoc.
894+
rewrite Rmult_inv_l; auto.
895+
rewrite Rmult_1_r.
896+
reflexivity.
897+
}
898+
{
899+
assert (re <> 0)%R by lra.
900+
exists (atan (im / re)).
901+
unfold Cexp.
902+
rewrite sin_atan, cos_atan.
903+
rewrite H1; auto; clear H1.
904+
unfold Rdiv.
905+
rewrite Rinv_mult.
906+
rewrite Rinv_1.
907+
rewrite Rinv_inv.
908+
repeat rewrite Rmult_1_l.
909+
rewrite sqrt_mult; try lra.
910+
rewrite sqrt_sqrt; try lra.
911+
rewrite Rmult_assoc.
912+
rewrite Rmult_inv_l; auto.
913+
rewrite Rmult_1_r.
914+
reflexivity.
915+
}
916+
Qed.

0 commit comments

Comments
 (0)