@@ -491,15 +491,14 @@ Lemma m3_3 : forall (u0 u1 : C),
491491 Cmod u0 = 1 -> Cmod u1 = 1 ->
492492 (exists (P : Square 2), WF_Unitary P /\
493493 exists (U : Square 4), WF_Unitary U /\
494- exists (c d : C), c <> C0 /\ d <> C0 /\
495- ((I 2) ⊗ P) × control (diag2 u0 u1) = U × diag4 c c d d × U†)
494+ exists (c d : C), ((I 2) ⊗ P) × control (diag2 u0 u1) = U × diag4 c c d d × U†)
496495 <-> u0 = u1 \/ u0 * u1 = C1.
497496Proof .
498497 intros u0 u1 unit_u0 unit_u1.
499498 split.
500499 {
501500 intro.
502- destruct H as [P [Unitary_P [U [Unitary_U [c [d [c_neq_0 [d_neq_0 H]] ]]]]]].
501+ destruct H as [P [Unitary_P [U [Unitary_U [c [d H ]]]]]].
503502 set (PD := P × diag2 u0 u1).
504503 assert (Unitary_PD : WF_Unitary (P × diag2 u0 u1)).
505504 {
@@ -542,7 +541,7 @@ Proof.
542541 all: specialize (step3 2%nat) as eigen2.
543542 all: specialize (step3 3%nat) as eigen3.
544543
545- assert (case_A : forall (c d : C), (c <> C0 -> DP 0 0 = c -> DP 1 1 = c ->
544+ assert (case_A : forall (c d : C), (DP 0 0 = c -> DP 1 1 = c ->
546545 DPD 0 0 = d -> DPD 1 1 = d -> u0 = u1)%nat).
547546 {
548547 intros.
@@ -554,7 +553,7 @@ Proof.
554553 }
555554 {
556555 unfold scale, I; simpl.
557- rewrite H1 ; lca.
556+ rewrite H0 ; lca.
558557 }
559558 {
560559 unfold scale, I; simpl.
@@ -572,7 +571,7 @@ Proof.
572571 }
573572 {
574573 unfold scale, I; simpl.
575- rewrite H2 ; lca.
574+ rewrite H1 ; lca.
576575 }
577576 }
578577 assert (DPD_dI : DPD = d0 .* I 2).
@@ -583,7 +582,7 @@ Proof.
583582 }
584583 {
585584 unfold scale, I; simpl.
586- rewrite H3 ; lca.
585+ rewrite H2 ; lca.
587586 }
588587 {
589588 destruct Diagonal_DPD as [_ DPD_0].
@@ -599,8 +598,33 @@ Proof.
599598 }
600599 {
601600 unfold scale, I; simpl.
602- rewrite H4; lca.
601+ rewrite H3; lca.
602+ }
603+ }
604+ assert (c0_neq_C0 : c0 <> C0).
605+ {
606+ assert (det_P : Determinant P = c0 * c0).
607+ {
608+ assert (VP_u : WF_Unitary (VP†)).
609+ {
610+ apply adjoint_unitary; assumption.
611+ }
612+ rewrite P_decomp, DP_cI.
613+ replace (c0 .* I 2) with (diag2 c0 c0).
614+ repeat rewrite <- Determinant_multiplicative.
615+ rewrite Cmult_comm, Cmult_assoc.
616+ rewrite Determinant_multiplicative.
617+ destruct Unitary_VP as [_ Unitary_VP].
618+ rewrite Unitary_VP, Det_I, Cmult_1_l.
619+ apply Det_diag2.
620+ lma'.
621+ all: unfold diag2, I, scale; simpl; lca.
603622 }
623+ pose proof (unit_det_neq_0 P Unitary_P).
624+ rewrite det_P in H4; clear det_P.
625+ intro.
626+ contradict H4.
627+ rewrite H5; lca.
604628 }
605629 rewrite DP_cI in P_decomp; clear DP_cI.
606630 rewrite DPD_dI in PD_decomp; clear DPD_dI.
@@ -644,10 +668,10 @@ Proof.
644668 unfold scale, diag2, I in PD_dI; simpl in PD_dI.
645669 rewrite PD_dI; lca.
646670 }
647- apply (Cmult_cancel_l c0); try apply H0.
671+ apply (Cmult_cancel_l c0); try apply H0; auto .
648672 rewrite cu0_d, cu1_d; reflexivity.
649673 }
650- assert (case_B : forall (c d : C), c <> C0 -> d <> C0 ->
674+ assert (case_B : forall (c d : C),
651675 (DP 0 0)%nat = c -> (DP 1 1)%nat = d ->
652676 (DPD 0 0)%nat = c -> (DPD 1 1)%nat = d -> u0 * u1 = C1).
653677 {
@@ -660,7 +684,7 @@ Proof.
660684 }
661685 {
662686 unfold diag2; simpl.
663- rewrite H2 ; reflexivity.
687+ rewrite H0 ; reflexivity.
664688 }
665689 {
666690 destruct Diagonal_DP as [_ DP_0].
@@ -674,7 +698,7 @@ Proof.
674698 }
675699 {
676700 unfold diag2; simpl.
677- rewrite H3 ; reflexivity.
701+ rewrite H1 ; reflexivity.
678702 }
679703 }
680704 assert (DPD_diag : DPD = diag2 c0 d0).
@@ -685,7 +709,7 @@ Proof.
685709 }
686710 {
687711 unfold diag2; simpl.
688- rewrite H4 ; reflexivity.
712+ rewrite H2 ; reflexivity.
689713 }
690714 {
691715 destruct Diagonal_DPD as [_ DPD_0].
@@ -699,7 +723,7 @@ Proof.
699723 }
700724 {
701725 unfold diag2; simpl.
702- rewrite H5 ; reflexivity.
726+ rewrite H3 ; reflexivity.
703727 }
704728 }
705729 rewrite DP_diag in P_decomp; clear DP_diag.
@@ -726,14 +750,18 @@ Proof.
726750 rewrite Det_I, Cmult_1_l.
727751 rewrite Det_diag2; reflexivity.
728752 }
753+ assert (c0d0_neq_C0 : c0 * d0 <> C0).
754+ {
755+ rewrite <- detP.
756+ apply unit_det_neq_0; auto.
757+ }
729758 unfold PD in detPD.
730759 rewrite a1 in detPD.
731760 rewrite detP, Det_diag2 in detPD.
732- apply (Cmult_cancel_l (c0 * d0)).
733- apply Cmult_nonzero; auto.
761+ apply (Cmult_cancel_l (c0 * d0)); auto.
734762 rewrite detPD; lca.
735763 }
736- assert (case_C : forall (c d : C), c <> C0 -> d <> C0 ->
764+ assert (case_C : forall (c d : C),
737765 (DP 0 0)%nat = c -> (DP 1 1)%nat = d ->
738766 (DPD 0 0)%nat = d -> (DPD 1 1)%nat = c -> u0 * u1 = C1).
739767 {
@@ -746,7 +774,7 @@ Proof.
746774 }
747775 {
748776 unfold diag2; simpl.
749- rewrite H2 ; reflexivity.
777+ rewrite H0 ; reflexivity.
750778 }
751779 {
752780 destruct Diagonal_DP as [_ DP_0].
@@ -760,7 +788,7 @@ Proof.
760788 }
761789 {
762790 unfold diag2; simpl.
763- rewrite H3 ; reflexivity.
791+ rewrite H1 ; reflexivity.
764792 }
765793 }
766794 assert (DPD_diag : DPD = diag2 d0 c0).
@@ -771,7 +799,7 @@ Proof.
771799 }
772800 {
773801 unfold diag2; simpl.
774- rewrite H4 ; reflexivity.
802+ rewrite H2 ; reflexivity.
775803 }
776804 {
777805 destruct Diagonal_DPD as [_ DPD_0].
@@ -785,7 +813,7 @@ Proof.
785813 }
786814 {
787815 unfold diag2; simpl.
788- rewrite H5 ; reflexivity.
816+ rewrite H3 ; reflexivity.
789817 }
790818 }
791819 rewrite DP_diag in P_decomp; clear DP_diag.
@@ -814,11 +842,15 @@ Proof.
814842 rewrite Det_I, Cmult_1_l.
815843 rewrite Det_diag2, Cmult_comm; reflexivity.
816844 }
845+ assert (c0d0_neq_C0 : c0 * d0 <> C0).
846+ {
847+ rewrite <- detP.
848+ apply unit_det_neq_0; auto.
849+ }
817850 unfold PD in detPD.
818851 rewrite a1 in detPD.
819852 rewrite detP, Det_diag2 in detPD.
820- apply (Cmult_cancel_l (c0 * d0)).
821- apply Cmult_nonzero; auto.
853+ apply (Cmult_cancel_l (c0 * d0)); auto.
822854 rewrite detPD; lca.
823855 }
824856
@@ -936,8 +968,6 @@ Proof.
936968 exists (I 4).
937969 split; try apply id_unitary.
938970 exists C1, u0.
939- split; try apply C1_neq_C0.
940- split. rewrite Cmod_gt_0, unit_u0; lra.
941971 rewrite id_kron; Msimpl_light.
942972 lma'; solve_WF_matrix.
943973 }
@@ -956,8 +986,6 @@ Proof.
956986 }
957987 {
958988 exists C1, u0.
959- split; try apply C1_neq_C0.
960- split; try rewrite Cmod_gt_0, unit_u0; try lra.
961989 assert (H : I 2 ⊗ diag2 C1 u0 × control (diag2 u0 u1) = diag4 C1 u0 u0 (u0 * u1)).
962990 {
963991 lma'; solve_WF_matrix.
0 commit comments