Skip to content

Commit c06e964

Browse files
authored
feat(M3.3): Remove c, d <> C0 stipulation. (#41)
1 parent bf6aa96 commit c06e964

File tree

1 file changed

+55
-27
lines changed

1 file changed

+55
-27
lines changed

Main.v

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
497496
Proof.
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

Comments
 (0)