-
Notifications
You must be signed in to change notification settings - Fork 193
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tensor product of cyclic groups #2022
Comments
Hi, I'd like to work on this issue, please. |
@ndcroos Great! I would start with introducing a new version of the cyclic group in I think at some point we want to show that If you create a PR for that first, then I can help you set up the statement for this lemma. Let me know if you need any help. |
@Alizter A definition of
I also can't find the cokernel definition in |
@ndcroos Yes, this is an older definition. There, the integers are defined as a free group on a single element, but this doesn't agree with the integers in The reason I suggest making a new cyclic type is so that you can use existing lemmas about the integers for the main result. |
|
@jdchristensen Yes of course. I'm still managing to get confused which is which. 😅 |
The lemma I mentioned at the end of #2050 should look like: Definition cyclic_in {n : nat} : abgroup_Z $-> cyclic' n
:= grp_quotient_map.
Definition ab_mul_cyclic_in (n : nat) (x y : abgroup_Z)
: ab_mul y (@cyclic_in n x) = cyclic_in (x * y)%int.
Proof. You will need to import Let me know if you need any hints on how to proceed. |
The RHS should be |
(BTW, I'm not sure why this lemma is highlighted as the next thing to do...) |
@jdchristensen you can post the proof in a comment. I have the following: Definition ab_mul_cyclic_in (n : nat) (x y : abgroup_Z)
: ab_mul y (@cyclic_in n x) = cyclic_in (y * x)%int.
Proof.
unfold cyclic_in.
exact (ab_mul_natural grp_quotient_map n).
Defined. Naturalness seems one of the right properties to use.
It looks like it's an error in usage and I should find a way to 'convert' the type |
@ndcroos Definition ab_mul_cyclic_in (n : nat) (x y : abgroup_Z)
: ab_mul y (@cyclic_in n x) = cyclic_in (y * x)%int.
Proof.
lhs_V nrapply ab_mul_natural.
apply ap, abgroup_Z_ab_mul.
Defined. |
Thanks for proving that lemma. I've done some more thinking and partial formalization to see which lemmas about
Definition cyclic_rec (n : nat) {G : Group} (g : G) (p : grp_pow g n = mon_unit)
: GroupHomomorphism (cyclic n) G.
Definition cyclic_ind_hprop (n : nat) (P : cyclic n -> Type)
`{forall x, IsHProp (P x)}
(H1 : forall (x : nat), P (cyclic_in n x)) (H2 : forall x, P x -> P (negate x))
: forall x, P x.
Definition cyclic_ind_homotopy (n : nat) {G : Group}
(f g : GroupHomomorphism (cyclic n) G)
(p : forall (k : nat), f (cyclic_in n k) = g (cyclic_in n k))
: f == g.
Definition cyclic_ind_homotopy_op (n : nat) {A : AbGroup}
(f f' f'' : (cyclic n) $-> A)
(p : forall (k : nat), f (cyclic_in n k) = f' (cyclic_in n k) + f'' (cyclic_in n k))
: forall x, f x = f' x + f'' x
:= cyclic_ind_homotopy n _ (ab_homo_add f' f'') p. Note that
Definition cyclic_in_mod (n : nat) (x : nat)
: cyclic_in n x = cyclic_in n (x mod n)%nat.
Definition cyclic_in_divides n m : (n | m)%nat -> cyclic_in n m = mon_unit. I have the proofs of all these lemmas already, but I thought it would be instructional for you to attempt to prove them yourself. Let me know if you need any hints or if you get stuck. You can do these all in one PR or one-by-one however you like. |
@Alizter That's a helpful list. About item 2, the hypothesis |
|
@ndcroos When I say "compute definitionally" I mean that if you have a term like Definition cyclic_rec_beta_in (n k : nat) {G : Group} (g : G)
(p : grp_pow g n = mon_unit)
: cyclic_rec n g p (cyclic_in n k) = grp_pow g k
:= idpath. And yes, I am talking about |
@Alizter for item 1, I have for the first line: |
You can use |
This is what I have at the moment for item 1. However, it doesn't use (** Recursion principle for `cyclic`. *)
Definition cyclic_rec `{Funext} (n : nat) {G : Group} (g : G) (p : grp_pow g n = mon_unit)
: GroupHomomorphism (cyclic n) G.
Proof.
snrapply Build_GroupHomomorphism.
1: trivial.
1: unfold IsSemiGroupPreserving.
intros x1 x2.
unfold sg_op.
induction n.
- simpl.
Defined.
It seems like one should find a way to use |
When you create a group homomorphism, the first goal will be the underlying map. For that, you have used It's maybe best to take a step back and explain what we are trying to construct with My suggestion to use The second part will be to show that the equivalence class is respected. To see the goal more clearly, we need to import some more things which are available (from the transitive nature of forall n0 : Int, Tr (-1) {a : Int & grp_pow a n = n0} -> grp_pow g n0 = mon_unit Introducing two hypotheses, the second hypothesis will look like Now you should have all the pieces that you need to show the final goal. |
@ndcroos Also, the fact that you had to add funext, indicates that you still have the old |
For (1), I have now: (** Recursion principle for `cyclic`. *)
Definition cyclic_rec (n : nat) {G : Group} (g : G) (p : grp_pow g n = mon_unit)
: GroupHomomorphism (cyclic n) G.
Proof.
snrapply grp_quotient_rec.
1: apply grp_pow_homo; assumption.
1: simpl.
intros x y.
strip_truncations.
destruct y as [a H].
Defined. And
The proof For (2), I have a somewhat similar issue: (** Induction principle for `cyclic`. *)
Definition cyclic_ind_hprop (n : nat) (P : cyclic n -> Type)
`{forall x, IsHProp (P x)}
(H1 : forall (x : nat), P (cyclic_in n x))
: forall x, P x.
Proof.
srapply grp_quotient_ind_hprop.
unfold cyclic_in in H1.
Defined. And
|
For (1), you are on the right track. Recall that change (ab_mul n a) in H. to write it that way. Now see if you can use At that point, we should notice we need one of the lemmas in #2015. So it would be good to address that issue too. |
For (2), I would suggest that you continue with my proposal with |
Yes, @Alizter is right that |
@Alizter and @jdchristensen, thanks both for your feedback. I am going to try to address also #2015. |
@Alizter For (1) I get the follow error:
For: (** Recursion principle for `cyclic`. *)
Definition cyclic_rec (n : nat) {G : Group} (g : G) (p : grp_pow g n = mon_unit)
: GroupHomomorphism (cyclic n) G.
Proof.
snrapply grp_quotient_rec.
1: apply grp_pow_homo; assumption.
1: simpl.
intros x y.
strip_truncations.
destruct y as [a H].
change (ab_mul n a) in H. |
You need to help Coq along a little. It doesn't see that |
What is the correct way to do such a type conversion in this case? I tried to do something like this: Definition int_to_abgroup_Z (a : Int) : abgroup_Z := a.
Definition cyclic_rec (n : nat) {G : Group} (g : G) (p : grp_pow g n = mon_unit)
: GroupHomomorphism (cyclic n) G.
... (previous code)
destruct y as [a H].
set (a' := int_to_abgroup_Z a).
change (ab_mul n a') in H. Sorry for the late response. |
You can write |
Thanks. I get the error |
Here is my proof for you to compare with: Click meDefinition cyclic_rec' (n : nat) {G : Group} (g : G) (p : grp_pow g n = mon_unit)
: GroupHomomorphism (cyclic n) G.
Proof.
snrapply grp_quotient_rec.
1: snrapply (grp_pow_homo g).
intros x.
apply Trunc_rec.
intros [y q].
rewrite abgroup_Z_ab_mul in q.
destruct q.
simpl.
lhs nrapply grp_pow_int_mul.
rewrite p.
apply grp_pow_unit.
Defined. You're welcome to ask me any questions about why I've done things this way. You can see why I asked you to prove the laws in #2015 before. |
@Alizter I have been quiet here the last few weeks, but this weekend I have time to attempt the remaining items in the list. Edit: I did not have time this weekend, but starting from the beginning of November I should have time then. |
@ndcroos Did you get another chance to look at this? Is there anything I can help with? |
Now that we have tensor products of abelian groups in #2021, a nice exercise (and something useful for calculations) would be to show that
For this we will need some improvement to the material we have on cyclic groups. One important thing would be to have a multiplication formula for equivalence classes, i.e.$[xy]_a=[x]_a y$ for integers $x$ and $y$ .
Once we have that the proof of the result is very straightforward. We have a bilinear (biadditive) map$f : \mathbb{Z}/a\mathbb{Z} \times \mathbb{Z}/b\mathbb{Z}\to \mathbb{Z}/(a,b)\mathbb{Z}$ given by $f ([x]_a ,[y]_{b})=[xy]_{(a,b)}$ and an inverse map $g : \mathbb{Z}/(a,b)\mathbb{Z} \to \mathbb{Z}/a\mathbb{Z} \otimes_{\mathbb{Z}} \mathbb{Z}/b\mathbb{Z}$ given by $g([x]_{(a,b)})=[x]_a \otimes [1]_b$ . We only need show one direction is a homomorphism which seems easiest for $f$ . Checking the inverses should then be a straightforward exercise.
The text was updated successfully, but these errors were encountered: