Theorem: WeierstrassCurve.Affine.map_slope
File: Mathlib/AlgebraicGeometry/EllipticCurve/Affine.lean

tactic: by_cases hx : x₁ = x₂
state_before: R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)
state_after: case pos
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)

case neg
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : ¬x₁ = x₂
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)

tactic: by_cases hy : y₁ = W.negY x₂ y₂
state_before: case pos
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)
state_after: case pos
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
hy : y₁ = W.negY x₂ y₂
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)

case neg
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
hy : ¬y₁ = W.negY x₂ y₂
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)

tactic: rw [slope_of_Y_eq (congr_arg f hx) <| by rw [hy, map_negY], slope_of_Y_eq hx hy, map_zero]
state_before: case pos
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
hy : y₁ = W.negY x₂ y₂
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)
state_after: no goals

tactic: rw [hy, map_negY]
state_before: R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
hy : y₁ = W.negY x₂ y₂
⊢ f y₁ = (map W f).toAffine.negY (f x₂) (f y₂)
state_after: no goals

tactic: rw [slope_of_Y_ne (congr_arg f hx) <| W.map_negY f x₂ y₂ ▸ fun h => hy <| f.injective h,
  map_negY, slope_of_Y_ne hx hy]
state_before: case neg
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
hy : ¬y₁ = W.negY x₂ y₂
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)
state_after: case neg
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
hy : ¬y₁ = W.negY x₂ y₂
⊢ (3 * f x₁ ^ 2 + 2 * (map W f).toAffine.a₂ * f x₁ + (map W f).toAffine.a₄ - (map W f).toAffine.a₁ * f y₁) /
      (f y₁ - f (W.negY x₁ y₁)) =
    f ((3 * x₁ ^ 2 + 2 * W.a₂ * x₁ + W.a₄ - W.a₁ * y₁) / (y₁ - W.negY x₁ y₁))

tactic: map_simp
state_before: case neg
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : x₁ = x₂
hy : ¬y₁ = W.negY x₂ y₂
⊢ (3 * f x₁ ^ 2 + 2 * (map W f).toAffine.a₂ * f x₁ + (map W f).toAffine.a₄ - (map W f).toAffine.a₁ * f y₁) /
      (f y₁ - f (W.negY x₁ y₁)) =
    f ((3 * x₁ ^ 2 + 2 * W.a₂ * x₁ + W.a₄ - W.a₁ * y₁) / (y₁ - W.negY x₁ y₁))
state_after: no goals

tactic: rw [slope_of_X_ne fun h => hx <| f.injective h, slope_of_X_ne hx]
state_before: case neg
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : ¬x₁ = x₂
⊢ (map W f).toAffine.slope (f x₁) (f x₂) (f y₁) (f y₂) = f (W.slope x₁ x₂ y₁ y₂)
state_after: case neg
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : ¬x₁ = x₂
⊢ (f y₁ - f y₂) / (f x₁ - f x₂) = f ((y₁ - y₂) / (x₁ - x₂))

tactic: map_simp
state_before: case neg
R : Type u
inst✝³ : CommRing R
W✝ : Affine R
S : Type v
inst✝² : CommRing S
f✝ : R →+* S
F : Type u
inst✝¹ : Field F
W : Affine F
K : Type v
inst✝ : Field K
f : F →+* K
x₁ x₂ y₁ y₂ : F
hx : ¬x₁ = x₂
⊢ (f y₁ - f y₂) / (f x₁ - f x₂) = f ((y₁ - y₂) / (x₁ - x₂))
state_after: no goals