Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit f9571f0

Browse files
committed
feat(analysis/normed*): add instances about balls and spheres (#14808)
Non-bc change: `has_inv.inv` on the unit circle is now defined using `has_inv.inv` instead of complex conjugation.
1 parent 6f923bd commit f9571f0

File tree

7 files changed

+272
-54
lines changed

7 files changed

+272
-54
lines changed

src/analysis/complex/circle.lean

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Heather Macbeth
55
-/
66
import analysis.special_functions.exp
77
import topology.continuous_function.basic
8+
import analysis.normed.field.unit_ball
89

910
/-!
1011
# The circle
@@ -36,14 +37,7 @@ open complex metric
3637
open_locale complex_conjugate
3738

3839
/-- The unit circle in `ℂ`, here given the structure of a submonoid of `ℂ`. -/
39-
def circle : submonoid ℂ :=
40-
{ carrier := sphere (0:ℂ) 1,
41-
one_mem' := by simp,
42-
mul_mem' := λ a b, begin
43-
simp only [norm_eq_abs, mem_sphere_zero_iff_norm],
44-
intros ha hb,
45-
simp [ha, hb],
46-
end }
40+
def circle : submonoid ℂ := submonoid.unit_sphere ℂ
4741

4842
@[simp] lemma mem_circle_iff_abs {z : ℂ} : z ∈ circle ↔ abs z = 1 := mem_sphere_zero_iff_norm
4943

@@ -59,42 +53,26 @@ by rw [mem_circle_iff_abs, complex.abs, real.sqrt_eq_one]
5953

6054
lemma ne_zero_of_mem_circle (z : circle) : (z:ℂ) ≠ 0 := ne_zero_of_mem_unit_sphere z
6155

62-
instance : comm_group circle :=
63-
{ inv := λ z, ⟨conj (z : ℂ), by simp⟩,
64-
mul_left_inv := λ z, subtype.ext $ by { simp [has_inv.inv, ← norm_sq_eq_conj_mul_self,
65-
← mul_self_abs] },
66-
.. circle.to_comm_monoid }
56+
instance : comm_group circle := metric.sphere.comm_group
6757

68-
lemma coe_inv_circle_eq_conj (z : circle) : ↑(z⁻¹) = conj (z : ℂ) := rfl
58+
@[simp] lemma coe_inv_circle (z : circle) : ↑(z⁻¹) = (z : ℂ)⁻¹ := rfl
6959

70-
@[simp] lemma coe_inv_circle (z : circle) : ↑(z⁻¹) = (z : ℂ)⁻¹ :=
71-
begin
72-
rw coe_inv_circle_eq_conj,
73-
apply eq_inv_of_mul_eq_one_right,
74-
rw [mul_comm, ← complex.norm_sq_eq_conj_mul_self],
75-
simp,
76-
end
60+
lemma coe_inv_circle_eq_conj (z : circle) : ↑(z⁻¹) = conj (z : ℂ) :=
61+
by rw [coe_inv_circle, inv_def, norm_sq_eq_of_mem_circle, inv_one, of_real_one, mul_one]
7762

7863
@[simp] lemma coe_div_circle (z w : circle) : ↑(z / w) = (z:ℂ) / w :=
79-
show ↑(z * w⁻¹) = (z:ℂ) * w⁻¹, by simp
64+
circle.subtype.map_div z w
8065

8166
/-- The elements of the circle embed into the units. -/
82-
@[simps]
83-
def circle.to_units : circle →* units ℂ :=
84-
{ to_fun := λ x, units.mk0 x $ ne_zero_of_mem_circle _,
85-
map_one' := units.ext rfl,
86-
map_mul' := λ x y, units.ext rfl }
67+
@[simps apply] def circle.to_units : circle →* units ℂ := unit_sphere_to_units ℂ
8768

8869
instance : compact_space circle := metric.sphere.compact_space _ _
8970

90-
-- the following result could instead be deduced from the Lie group structure on the circle using
91-
-- `topological_group_of_lie_group`, but that seems a little awkward since one has to first provide
92-
-- and then forget the model space
93-
instance : topological_group circle :=
94-
{ continuous_mul := let h : continuous (λ x : circle, (x : ℂ)) := continuous_subtype_coe in
95-
continuous_induced_rng (continuous_mul.comp (h.prod_map h)),
96-
continuous_inv := continuous_induced_rng $
97-
complex.conj_cle.continuous.comp continuous_subtype_coe }
71+
instance : topological_group circle := metric.sphere.topological_group
72+
73+
/-- If `z` is a nonzero complex number, then `conj z / z` belongs to the unit circle. -/
74+
@[simps] def circle.of_conj_div_self (z : ℂ) (hz : z ≠ 0) : circle :=
75+
⟨conj z / z, mem_circle_iff_abs.2 $ by rw [complex.abs_div, abs_conj, div_self (abs_ne_zero.2 hz)]⟩
9876

9977
/-- The map `λ t, exp (t * I)` from `ℝ` to the unit circle in `ℂ`. -/
10078
def exp_map_circle : C(ℝ, circle) :=
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/-
2+
Copyright (c) 2022 Yury Kudryashov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yury Kudryashov, Heather Macbeth
5+
-/
6+
import analysis.normed.field.basic
7+
import analysis.normed.group.ball_sphere
8+
9+
/-!
10+
# Algebraic structures on unit balls and spheres
11+
12+
In this file we define algebraic structures (`semigroup`, `comm_semigroup`, `monoid`, `comm_monoid`,
13+
`group`, `comm_group`) on `metric.ball (0 : 𝕜) 1`, `metric.closed_ball (0 : 𝕜) 1`, and
14+
`metric.sphere (0 : 𝕜) 1`. In each case we use the weakest possible typeclass assumption on `𝕜`,
15+
from `non_unital_semi_normed_ring` to `normed_field`.
16+
-/
17+
18+
open set metric
19+
20+
variables {𝕜 : Type*}
21+
22+
/-- Unit ball in a non unital semi normed ring as a bundled `subsemigroup`. -/
23+
def subsemigroup.unit_ball (𝕜 : Type*) [non_unital_semi_normed_ring 𝕜] :
24+
subsemigroup 𝕜 :=
25+
{ carrier := ball (0 : 𝕜) 1,
26+
mul_mem' := λ x y hx hy,
27+
begin
28+
rw [mem_ball_zero_iff] at *,
29+
exact (norm_mul_le x y).trans_lt (mul_lt_one_of_nonneg_of_lt_one_left (norm_nonneg _)
30+
hx hy.le)
31+
end }
32+
33+
instance [non_unital_semi_normed_ring 𝕜] : semigroup (ball (0 : 𝕜) 1) :=
34+
mul_mem_class.to_semigroup (subsemigroup.unit_ball 𝕜)
35+
36+
instance [non_unital_semi_normed_ring 𝕜] : has_continuous_mul (ball (0 : 𝕜) 1) :=
37+
⟨continuous_subtype_mk _ $ continuous.mul (continuous_subtype_val.comp continuous_fst)
38+
(continuous_subtype_val.comp continuous_snd)⟩
39+
40+
instance [semi_normed_comm_ring 𝕜] : comm_semigroup (ball (0 : 𝕜) 1) :=
41+
mul_mem_class.to_comm_semigroup (subsemigroup.unit_ball 𝕜)
42+
43+
instance [non_unital_semi_normed_ring 𝕜] : has_distrib_neg (ball (0 : 𝕜) 1) :=
44+
subtype.coe_injective.has_distrib_neg (coe : ball (0 : 𝕜) 1 → 𝕜) (λ _, rfl) (λ _ _, rfl)
45+
46+
/-- Closed unit ball in a non unital semi normed ring as a bundled `subsemigroup`. -/
47+
def subsemigroup.unit_closed_ball (𝕜 : Type*) [non_unital_semi_normed_ring 𝕜] :
48+
subsemigroup 𝕜 :=
49+
{ carrier := closed_ball 0 1,
50+
mul_mem' := λ x y hx hy,
51+
begin
52+
rw [mem_closed_ball_zero_iff] at *,
53+
exact (norm_mul_le x y).trans (mul_le_one hx (norm_nonneg _) hy)
54+
end }
55+
56+
instance [non_unital_semi_normed_ring 𝕜] : semigroup (closed_ball (0 : 𝕜) 1) :=
57+
mul_mem_class.to_semigroup (subsemigroup.unit_closed_ball 𝕜)
58+
59+
instance [non_unital_semi_normed_ring 𝕜] : has_distrib_neg (closed_ball (0 : 𝕜) 1) :=
60+
subtype.coe_injective.has_distrib_neg (coe : closed_ball (0 : 𝕜) 1 → 𝕜) (λ _, rfl) (λ _ _, rfl)
61+
62+
instance [non_unital_semi_normed_ring 𝕜] : has_continuous_mul (closed_ball (0 : 𝕜) 1) :=
63+
⟨continuous_subtype_mk _ $ continuous.mul (continuous_subtype_val.comp continuous_fst)
64+
(continuous_subtype_val.comp continuous_snd)⟩
65+
66+
/-- Closed unit ball in a semi normed ring as a bundled `submonoid`. -/
67+
def submonoid.unit_closed_ball (𝕜 : Type*) [semi_normed_ring 𝕜] [norm_one_class 𝕜] :
68+
submonoid 𝕜 :=
69+
{ carrier := closed_ball 0 1,
70+
one_mem' := mem_closed_ball_zero_iff.2 norm_one.le,
71+
.. subsemigroup.unit_closed_ball 𝕜 }
72+
73+
instance [semi_normed_ring 𝕜] [norm_one_class 𝕜] : monoid (closed_ball (0 : 𝕜) 1) :=
74+
submonoid_class.to_monoid (submonoid.unit_closed_ball 𝕜)
75+
76+
instance [semi_normed_comm_ring 𝕜] [norm_one_class 𝕜] : comm_monoid (closed_ball (0 : 𝕜) 1) :=
77+
submonoid_class.to_comm_monoid (submonoid.unit_closed_ball 𝕜)
78+
79+
/-- Unit sphere in a normed division ring as a bundled `submonoid`. -/
80+
def submonoid.unit_sphere (𝕜 : Type*) [normed_division_ring 𝕜] : submonoid 𝕜 :=
81+
{ carrier := sphere (0 : 𝕜) 1,
82+
mul_mem' := λ x y hx hy, by { rw [mem_sphere_zero_iff_norm] at *, simp * },
83+
one_mem' := mem_sphere_zero_iff_norm.2 norm_one }
84+
85+
instance [normed_division_ring 𝕜] : group (sphere (0 : 𝕜) 1) :=
86+
{ inv := λ x, ⟨x⁻¹, mem_sphere_zero_iff_norm.2 $
87+
by rw [norm_inv, mem_sphere_zero_iff_norm.1 x.coe_prop, inv_one]⟩,
88+
mul_left_inv := λ x, subtype.coe_injective $ inv_mul_cancel $ ne_zero_of_mem_unit_sphere x,
89+
.. submonoid_class.to_monoid (submonoid.unit_sphere 𝕜) }
90+
91+
instance [normed_division_ring 𝕜] : has_distrib_neg (sphere (0 : 𝕜) 1) :=
92+
subtype.coe_injective.has_distrib_neg (coe : sphere (0 : 𝕜) 1 → 𝕜) (λ _, rfl) (λ _ _, rfl)
93+
94+
/-- Monoid homomorphism from the unit sphere to the group of units. -/
95+
def unit_sphere_to_units (𝕜 : Type*) [normed_division_ring 𝕜] : sphere (0 : 𝕜) 1 →* units 𝕜 :=
96+
units.lift_right (submonoid.unit_sphere 𝕜).subtype (λ x, units.mk0 x $ ne_zero_of_mem_unit_sphere _)
97+
(λ x, rfl)
98+
99+
instance [normed_division_ring 𝕜] : topological_group (sphere (0 : 𝕜) 1) :=
100+
{ continuous_mul := continuous_subtype_mk _ $ (continuous_subtype_val.comp continuous_fst).mul
101+
(continuous_subtype_val.comp continuous_snd),
102+
continuous_inv := continuous_subtype_mk _ $
103+
continuous_subtype_coe.inv₀ ne_zero_of_mem_unit_sphere }
104+
105+
instance [normed_field 𝕜] : comm_group (sphere (0 : 𝕜) 1) :=
106+
{ .. metric.sphere.group,
107+
.. submonoid_class.to_comm_monoid (submonoid.unit_sphere 𝕜) }
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/-
2+
Copyright (c) 2022 Yury Kudryashov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yury Kudryashov, Heather Macbeth
5+
-/
6+
import analysis.normed.group.basic
7+
8+
/-!
9+
# Negation on spheres and balls
10+
11+
In this file we define `has_involutive_neg` instances for spheres, open balls, and closed balls in a
12+
semi normed group.
13+
-/
14+
15+
open metric set
16+
17+
variables {E : Type*} [semi_normed_group E] {r : ℝ}
18+
19+
/-- We equip the sphere, in a seminormed group, with a formal operation of negation, namely the
20+
antipodal map. -/
21+
instance : has_involutive_neg (sphere (0 : E) r) :=
22+
{ neg := λ w, ⟨-↑w, by simp⟩,
23+
neg_neg := λ x, subtype.ext $ neg_neg x }
24+
25+
@[simp] lemma coe_neg_sphere {r : ℝ} (v : sphere (0 : E) r) :
26+
↑(-v) = (-v : E) :=
27+
rfl
28+
29+
instance : has_continuous_neg (sphere (0 : E) r) :=
30+
⟨continuous_subtype_mk _ continuous_subtype_coe.neg⟩
31+
32+
/-- We equip the ball, in a seminormed group, with a formal operation of negation, namely the
33+
antipodal map. -/
34+
instance {r : ℝ} : has_involutive_neg (ball (0 : E) r) :=
35+
{ neg := λ w, ⟨-↑w, by simpa using w.coe_prop⟩,
36+
neg_neg := λ x, subtype.ext $ neg_neg x }
37+
38+
@[simp] lemma coe_neg_ball {r : ℝ} (v : ball (0 : E) r) :
39+
↑(-v) = (-v : E) :=
40+
rfl
41+
42+
instance : has_continuous_neg (ball (0 : E) r) :=
43+
⟨continuous_subtype_mk _ continuous_subtype_coe.neg⟩
44+
45+
/-- We equip the closed ball, in a seminormed group, with a formal operation of negation, namely the
46+
antipodal map. -/
47+
instance {r : ℝ} : has_involutive_neg (closed_ball (0 : E) r) :=
48+
{ neg := λ w, ⟨-↑w, by simpa using w.coe_prop⟩,
49+
neg_neg := λ x, subtype.ext $ neg_neg x }
50+
51+
@[simp] lemma coe_neg_closed_ball {r : ℝ} (v : closed_ball (0 : E) r) :
52+
↑(-v) = (-v : E) :=
53+
rfl
54+
55+
instance : has_continuous_neg (closed_ball (0 : E) r) :=
56+
⟨continuous_subtype_mk _ continuous_subtype_coe.neg⟩

src/analysis/normed/group/basic.lean

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -372,15 +372,6 @@ ne_zero_of_norm_ne_zero $ by rwa norm_eq_of_mem_sphere x
372372
lemma ne_zero_of_mem_unit_sphere (x : sphere (0:E) 1) : (x:E) ≠ 0 :=
373373
ne_zero_of_mem_sphere one_ne_zero _
374374

375-
/-- We equip the sphere, in a seminormed group, with a formal operation of negation, namely the
376-
antipodal map. -/
377-
instance {r : ℝ} : has_neg (sphere (0:E) r) :=
378-
{ neg := λ w, ⟨-↑w, by simp⟩ }
379-
380-
@[simp] lemma coe_neg_sphere {r : ℝ} (v : sphere (0:E) r) :
381-
(((-v) : sphere _ _) : E) = - (v:E) :=
382-
rfl
383-
384375
namespace isometric
385376
-- TODO This material is superseded by similar constructions such as
386377
-- `affine_isometry_equiv.const_vadd`; deduplicate
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/-
2+
Copyright (c) 2022 Yury Kudryashov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yury Kudryashov, Heather Macbeth
5+
-/
6+
import analysis.normed.field.unit_ball
7+
import analysis.normed_space.basic
8+
9+
/-!
10+
# Multiplicative actions of/on balls and spheres
11+
12+
Let `E` be a normed vector space over a normed field `𝕜`. In this file we define the following
13+
multiplicative actions.
14+
15+
- The closed unit ball in `𝕜` acts on open balls and closed balls centered at `0` in `E`.
16+
- The unit sphere in `𝕜` acts on open balls, closed balls, and spheres centered at `0` in `E`.
17+
-/
18+
open metric set
19+
variables {𝕜 E : Type*} [normed_field 𝕜] [semi_normed_group E] [normed_space 𝕜 E] {r : ℝ}
20+
21+
section closed_ball
22+
23+
instance mul_action_closed_ball_ball : mul_action (closed_ball (0 : 𝕜) 1) (ball (0 : E) r) :=
24+
{ smul := λ c x, ⟨(c : 𝕜) • x, mem_ball_zero_iff.2 $
25+
by simpa only [norm_smul, one_mul]
26+
using mul_lt_mul' (mem_closed_ball_zero_iff.1 c.2) (mem_ball_zero_iff.1 x.2)
27+
(norm_nonneg _) one_pos⟩,
28+
one_smul := λ x, subtype.ext $ one_smul 𝕜 _,
29+
mul_smul := λ c₁ c₂ x, subtype.ext $ mul_smul _ _ _ }
30+
31+
instance has_continuous_smul_closed_ball_ball :
32+
has_continuous_smul (closed_ball (0 : 𝕜) 1) (ball (0 : E) r) :=
33+
⟨continuous_subtype_mk _ $ (continuous_subtype_val.comp continuous_fst).smul
34+
(continuous_subtype_val.comp continuous_snd)⟩
35+
36+
instance mul_action_closed_ball_closed_ball :
37+
mul_action (closed_ball (0 : 𝕜) 1) (closed_ball (0 : E) r) :=
38+
{ smul := λ c x, ⟨(c : 𝕜) • x, mem_closed_ball_zero_iff.2 $
39+
by simpa only [norm_smul, one_mul]
40+
using mul_le_mul (mem_closed_ball_zero_iff.1 c.2) (mem_closed_ball_zero_iff.1 x.2)
41+
(norm_nonneg _) zero_le_one⟩,
42+
one_smul := λ x, subtype.ext $ one_smul 𝕜 _,
43+
mul_smul := λ c₁ c₂ x, subtype.ext $ mul_smul _ _ _ }
44+
45+
instance has_continuous_smul_closed_ball_closed_ball :
46+
has_continuous_smul (closed_ball (0 : 𝕜) 1) (closed_ball (0 : E) r) :=
47+
⟨continuous_subtype_mk _ $ (continuous_subtype_val.comp continuous_fst).smul
48+
(continuous_subtype_val.comp continuous_snd)⟩
49+
50+
end closed_ball
51+
52+
section sphere
53+
54+
instance mul_action_sphere_ball : mul_action (sphere (0 : 𝕜) 1) (ball (0 : E) r) :=
55+
{ smul := λ c x, inclusion sphere_subset_closed_ball c • x,
56+
one_smul := λ x, subtype.ext $ one_smul _ _,
57+
mul_smul := λ c₁ c₂ x, subtype.ext $ mul_smul _ _ _ }
58+
59+
instance has_continuous_smul_sphere_ball :
60+
has_continuous_smul (sphere (0 : 𝕜) 1) (ball (0 : E) r) :=
61+
⟨continuous_subtype_mk _ $ (continuous_subtype_val.comp continuous_fst).smul
62+
(continuous_subtype_val.comp continuous_snd)⟩
63+
64+
instance mul_action_sphere_closed_ball : mul_action (sphere (0 : 𝕜) 1) (closed_ball (0 : E) r) :=
65+
{ smul := λ c x, inclusion sphere_subset_closed_ball c • x,
66+
one_smul := λ x, subtype.ext $ one_smul _ _,
67+
mul_smul := λ c₁ c₂ x, subtype.ext $ mul_smul _ _ _ }
68+
69+
instance has_continuous_smul_sphere_closed_ball :
70+
has_continuous_smul (sphere (0 : 𝕜) 1) (closed_ball (0 : E) r) :=
71+
⟨continuous_subtype_mk _ $ (continuous_subtype_val.comp continuous_fst).smul
72+
(continuous_subtype_val.comp continuous_snd)⟩
73+
74+
instance mul_action_sphere_sphere : mul_action (sphere (0 : 𝕜) 1) (sphere (0 : E) r) :=
75+
{ smul := λ c x, ⟨(c : 𝕜) • x, mem_sphere_zero_iff_norm.2 $
76+
by rw [norm_smul, mem_sphere_zero_iff_norm.1 c.coe_prop, mem_sphere_zero_iff_norm.1 x.coe_prop,
77+
one_mul]⟩,
78+
one_smul := λ x, subtype.ext $ one_smul _ _,
79+
mul_smul := λ c₁ c₂ x, subtype.ext $ mul_smul _ _ _ }
80+
81+
instance has_continuous_smul_sphere_sphere :
82+
has_continuous_smul (sphere (0 : 𝕜) 1) (sphere (0 : E) r) :=
83+
⟨continuous_subtype_mk _ $ (continuous_subtype_val.comp continuous_fst).smul
84+
(continuous_subtype_val.comp continuous_snd)⟩
85+
86+
end sphere
87+
88+
variables (𝕜) [char_zero 𝕜]
89+
90+
lemma ne_neg_of_mem_sphere {r : ℝ} (hr : r ≠ 0) (x : sphere (0:E) r) : x ≠ - x :=
91+
λ h, ne_zero_of_mem_sphere hr x ((self_eq_neg 𝕜 _).mp (by { conv_lhs {rw h}, simp }))
92+
93+
lemma ne_neg_of_mem_unit_sphere (x : sphere (0:E) 1) : x ≠ - x :=
94+
ne_neg_of_mem_sphere 𝕜 one_ne_zero x

src/analysis/normed_space/basic.lean

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -187,16 +187,6 @@ def homeomorph_unit_ball {E : Type*} [semi_normed_group E] [normed_space ℝ E]
187187
((continuous_const.sub continuous_subtype_coe.norm).inv₀ $
188188
λ x, (sub_pos.2 $ mem_ball_zero_iff.1 x.2).ne') continuous_subtype_coe }
189189

190-
variables (α)
191-
192-
lemma ne_neg_of_mem_sphere [char_zero α] {r : ℝ} (hr : r ≠ 0) (x : sphere (0:E) r) : x ≠ - x :=
193-
λ h, ne_zero_of_mem_sphere hr x ((self_eq_neg α _).mp (by { conv_lhs {rw h}, simp }))
194-
195-
lemma ne_neg_of_mem_unit_sphere [char_zero α] (x : sphere (0:E) 1) : x ≠ - x :=
196-
ne_neg_of_mem_sphere α one_ne_zero x
197-
198-
variables {α}
199-
200190
open normed_field
201191

202192
instance : normed_space α (ulift E) :=

src/geometry/manifold/instances/sphere.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Heather Macbeth
55
-/
66
import analysis.complex.circle
7+
import analysis.normed_space.ball_action
78
import analysis.inner_product_space.calculus
89
import analysis.inner_product_space.pi_L2
910
import geometry.manifold.algebra.lie_group
@@ -426,6 +427,7 @@ instance : lie_group (𝓡 1) circle :=
426427
end,
427428
smooth_inv := begin
428429
apply cont_mdiff.cod_restrict_sphere,
430+
simp only [← coe_inv_circle, coe_inv_circle_eq_conj],
429431
exact complex.conj_cle.cont_diff.cont_mdiff.comp cont_mdiff_coe_sphere
430432
end }
431433

0 commit comments

Comments
 (0)