@@ -340,9 +340,61 @@ noncomputable abbrev zHatsub : AddSubgroup QHat :=
340
340
noncomputable abbrev zsub : AddSubgroup QHat :=
341
341
(Int.castRingHom QHat : ℤ →+ QHat).range
342
342
343
- lemma rat_meet_zHat : ratsub ⊓ zHatsub = zsub := sorry
343
+ lemma ZMod.isUnit_natAbs {z : ℤ} {N : ℕ} : IsUnit (z.natAbs : ZMod N) ↔ IsUnit (z : ZMod N) := by
344
+ cases z.natAbs_eq with
345
+ | inl h | inr h => rw [h]; simp [-Int.natCast_natAbs]
344
346
345
- lemma rat_join_zHat : ratsub ⊔ zHatsub = ⊤ := sorry
347
+ @[simp]
348
+ lemma _root_.Algebra.TensorProduct.one_tmul_intCast {R : Type *} {A : Type *} {B : Type *}
349
+ [CommRing R] [Ring A] [Algebra R A] [Ring B] [Algebra R B] {z : ℤ} :
350
+ (1 : A) ⊗ₜ[R] (z : B) = (z : TensorProduct R A B) := by
351
+ rw [← map_intCast (F := B →ₐ[R] TensorProduct R A B),
352
+ Algebra.TensorProduct.includeRight_apply]
353
+
354
+ lemma rat_meet_zHat : ratsub ⊓ zHatsub = zsub := by
355
+ apply le_antisymm
356
+ · intro x ⟨⟨l, hl⟩, ⟨r, hr⟩⟩
357
+ simp only [AddMonoidHom.coe_coe, Algebra.TensorProduct.includeLeft_apply,
358
+ Algebra.TensorProduct.includeRight_apply] at hl hr
359
+ rcases lowestTerms x with ⟨⟨N, z, hNz, hx⟩, unique⟩
360
+ have cop1 : IsCoprime l.den.toPNat' l.num := by
361
+ simp_rw [IsCoprime, ZHat.intCast_val, ← ZMod.isUnit_natAbs, ZMod.isUnit_iff_coprime,
362
+ PNat.toPNat'_coe l.den_pos]
363
+ exact l.reduced
364
+ have cop2 : IsCoprime 1 r := by
365
+ simp only [IsCoprime, PNat.val_ofNat]
366
+ exact isUnit_of_subsingleton _
367
+ have hcanon : x = (1 /(l.den : ℚ)) ⊗ₜ[ℤ] (l.num : ZHat) := by
368
+ nth_rw 1 [← hl, ← Rat.num_div_den l, ← mul_one ((l.num : ℚ) / l.den), div_mul_comm,
369
+ mul_comm, ← zsmul_eq_mul, TensorProduct.smul_tmul, zsmul_eq_mul, mul_one]
370
+ rw [← PNat.toPNat'_coe l.den_pos, hx] at hcanon
371
+ obtain ⟨rfl, rfl⟩ := unique _ _ _ _ ⟨hNz, cop1, hcanon⟩
372
+ have : 1 = 1 / (((1 : ℕ+) : ℕ) : ℚ) := by simp
373
+ nth_rw 1 [← hx, ← hr, this] at hcanon
374
+ use l.num; rw [hx, (unique _ 1 _ r ⟨hNz, cop2, hcanon.symm⟩).1 ]
375
+ simp
376
+ · exact fun x ⟨k, hk⟩ ↦ by constructor <;> (use k; simp; exact hk)
377
+
378
+ lemma rat_join_zHat : ratsub ⊔ zHatsub = ⊤ := by
379
+ rw [eq_top_iff]
380
+ intro x _
381
+ rcases x.canonicalForm with ⟨N, z, hNz⟩
382
+ rcases ZHat.nat_dense N z with ⟨q, r, hz, _⟩
383
+ have h : z - r = N * q := sub_eq_of_eq_add hz
384
+ rw [AddSubgroup.mem_sup]
385
+ use ((r : ℤ) / N : ℚ) ⊗ₜ[ℤ] 1
386
+ constructor
387
+ · simp
388
+ use 1 ⊗ₜ[ℤ] q
389
+ constructor
390
+ · simp
391
+ nth_rw 1 [← mul_one ((r : ℤ) / N : ℚ), div_mul_comm,
392
+ mul_comm, ← zsmul_eq_mul, TensorProduct.smul_tmul, zsmul_eq_mul, mul_one]
393
+ have : 1 = 1 / (N : ℚ) * (N : ℤ) := by simp
394
+ nth_rw 2 [this]
395
+ rw [mul_comm, ← zsmul_eq_mul, TensorProduct.smul_tmul, zsmul_eq_mul]
396
+ norm_cast; rw [← h, ← TensorProduct.tmul_add]
397
+ simp [hNz]
346
398
347
399
end additive_structure_of_QHat
348
400
0 commit comments