Zulip Chat Archive

Stream: maths

Topic: basic complex number computations


Kevin Buzzard (Jul 11 2018 at 15:19):

@VeraZZ is doing basic computations with complex numbers and I'm still not 100% sure that we're doing it right.

If the goal looks like this:

z₁ z₂ : ℂ
⊢ ↑(z₁.re * z₂.re + z₁.im * z₂.im) + ↑(z₁.re * z₂.re + z₁.im * z₂.im) =
    z₁ * conj z₂ + z₂ * conj z₁

then currently our strategy is the (probably rather inefficient)

   apply complex.ext,
   simp,ring,simp,ring,

After Chris' complex number PR I realised that I am not at all sure how I'm supposed to be working with complex numbers. The strategy above is to check that two complex numbers are equal it suffices to check their real and imag parts are equal, and then use a dangerous non-finishing simp to unravel all the real and imaginary stuff followed by ring. Are there better approaches?

Chris Hughes (Jul 11 2018 at 15:27):

I think a non-finishing simp is not dangerous here, since ring is not sensitive to the precise state of the goal.

Patrick Massot (Jul 11 2018 at 15:28):

you could also define a tactic doing apply complex.ext ; {simp, ring}, and you wouldn't see simp :wink:

Patrick Massot (Jul 11 2018 at 15:29):

By the way, if ext cannot replace apply complex.ext then the extensionality attribute needs to be added somewhere

Patrick Massot (Jul 11 2018 at 15:30):

and, as usual with non finishing simp, you can use suffices : stuff := by simp,, where stuff is what you currently see as after simp

Chris Hughes (Jul 11 2018 at 15:32):

That sounds like a tactic I might be able to write.

Patrick Massot (Jul 11 2018 at 15:33):

sure: meta def cplx_ring : tactic unit := `[apply complex.ext ; {simp, ring}]


Last updated: Dec 20 2023 at 11:08 UTC