@@ -3095,3 +3095,82 @@ Proof.
30953095 assumption.
30963096 }
30973097Qed .
3098+
3099+ Lemma m7_1 : forall (u0 u1 : C), Cmod u0 = 1 -> Cmod u1 = 1 ->
3100+ forall (U : Square 8), WF_Unitary U ->
3101+ forall (W : Square 4), WF_Unitary W ->
3102+ ccu (diag2 u0 u1) = abgate W × U -> exists (V : Square 4), WF_Unitary V /\
3103+ ccu (diag2 C1 (u0^* * u1)) = abgate V × U.
3104+ Proof .
3105+ intros u0 u1 u0_unit u1_unit U U_unitary W W_unitary H.
3106+ exists (control (diag2 C1 (u0^*)) × W).
3107+ split.
3108+ {
3109+ solve_WF_matrix.
3110+ apply diag2_unitary.
3111+ apply Cmod_1.
3112+ rewrite Cmod_Cconj.
3113+ exact u0_unit.
3114+ }
3115+ {
3116+ unfold abgate.
3117+ rewrite <- Mmult_1_l with (A := I 2); solve_WF_matrix.
3118+ rewrite <- kron_mixed_product.
3119+ unfold abgate in H.
3120+ rewrite Mmult_assoc.
3121+ rewrite <- H at 1; clear H.
3122+ (* For performance reasons, we'll show both sides are diagonal first,
3123+ instead of directly invoking lma'. *)
3124+ assert (WF_Diagonal (ccu (diag2 C1 (u0 ^* * u1)))).
3125+ {
3126+ apply ccu_diag.
3127+ apply Diag_diag2.
3128+ }
3129+ assert (WF_Diagonal (control (diag2 C1 (u0 ^*)) ⊗ I 2 × ccu (diag2 u0 u1))).
3130+ {
3131+ apply diag_mult.
3132+ apply diag_kron.
3133+ apply diag_control.
3134+ apply Diag_diag2.
3135+ apply diag_I.
3136+ apply ccu_diag.
3137+ apply Diag_diag2.
3138+ }
3139+ prep_matrix_equality.
3140+ bdestruct (x =? y).
3141+ {
3142+ rewrite <- H1; clear H1.
3143+ destruct H as [H _].
3144+ destruct H0 as [H0 _].
3145+ specialize (H x x).
3146+ specialize (H0 x x).
3147+ destruct x.
3148+ unfold ccu, control, diag2, I, kron, Mmult; lca.
3149+ destruct x.
3150+ unfold ccu, control, diag2, I, kron, Mmult; lca.
3151+ destruct x.
3152+ unfold ccu, control, diag2, I, kron, Mmult; lca.
3153+ destruct x.
3154+ unfold ccu, control, diag2, I, kron, Mmult; lca.
3155+ destruct x.
3156+ unfold ccu, control, diag2, I, kron, Mmult; lca.
3157+ destruct x.
3158+ unfold ccu, control, diag2, I, kron, Mmult; lca.
3159+ destruct x.
3160+ unfold ccu, control, diag2, I, kron, Mmult; simpl; Csimpl.
3161+ rewrite <- Cmod_sqr, u0_unit; lca.
3162+ destruct x.
3163+ unfold ccu, control, diag2, I, kron, Mmult; lca.
3164+ rewrite H, <- H0.
3165+ reflexivity.
3166+ all: lia.
3167+ }
3168+ {
3169+ destruct H as [_ H].
3170+ destruct H0 as [_ H0].
3171+ specialize (H x y H1).
3172+ specialize (H0 x y H1).
3173+ rewrite H, <- H0; reflexivity.
3174+ }
3175+ }
3176+ Qed .
0 commit comments