Zulip Chat Archive
Stream: new members
Topic: Feedback for a gcd( F_n, F_m) = F_{gcd(n, m)} proof
Hanting Zhang (Dec 31 2020 at 01:18):
Hi, I want some feedback on a proof on the GCD of the Fibonacci numbers. Part of the problem is that I don't really know what kind of feedback I'm supposed to be looking for, so please say whatever comes to mind. I think my tactic writing could be cleaner, and proofs could be shorter. Also, how can I clean up the calc
proof for gcd_fib_add_self'
? Below should be a MWE.
import data.nat.fib
import data.nat.gcd
import tactic
namespace nat
lemma gcd_add_self (m n : ℕ) : gcd m n = gcd m (n + m) :=
by simp [gcd_rec m (n + m), gcd_rec m n]
/-- https://proofwiki.org/wiki/Consecutive_Fibonacci_Numbers_are_Coprime -/
lemma fib_succ_coprime (n : ℕ) : gcd (fib n) (fib(n + 1)) = 1 :=
begin
induction n with n ih,
{ simp },
{ convert ih using 1,
rw [fib_succ_succ, succ_eq_add_one, gcd_rec, add_mod_right, gcd_comm (fib n),
gcd_rec (fib (n + 1))], }
end
/-- https://proofwiki.org/wiki/Fibonacci_Number_in_terms_of_Smaller_Fibonacci_Numbers -/
lemma fib_add_succ (m n : ℕ) :
fib (m + n + 1) = fib m * fib n + fib (m + 1) * fib (n + 1) :=
begin
induction n with n ih generalizing m,
{ simp },
{ intros,
specialize ih (m + 1),
rw [add_right_comm m 1, add_assoc m] at ih,
simp only [fib_succ_succ, ih],
ring, }
end
lemma fib_add (m n : ℕ) (hm2 : 1 ≤ m) :
fib (m + n) = fib (m - 1) * fib n + fib m * fib (n + 1) :=
begin
obtain ⟨m', hm'⟩ : (∃ m', m' + 1 = m) := begin use m - 1, exact nat.sub_add_cancel hm2 end,
rw [←hm', add_assoc, add_comm 1 _, ←add_assoc],
exact fib_add_succ m' n,
end
lemma gcd_fib_add_self' (m n : ℕ) : gcd (fib m) (fib n) = gcd (fib m) (fib(n + m)) :=
begin
cases eq_zero_or_pos n,
{ rw h, simp },
calc m.fib.gcd n.fib
= gcd (fib m) (fib n * fib(m + 1)) :
begin
have hcop := coprime.symm (fib_succ_coprime m),
rw [gcd_comm, gcd_comm (fib m) _, mul_comm _ (fib (m + 1)), coprime.gcd_mul_left_cancel],
exact hcop,
end
... = gcd (fib m) (fib(n - 1) * (fib m) + fib n * fib(m + 1)) :
by rw [←gcd_add_self (fib m) _ (fib(n - 1)), add_comm]
... = m.fib.gcd (n + m).fib :
begin rw fib_add n _ _, assumption end
... = m.fib.gcd (n + m).fib : by ring,
end
lemma gcd_fib_add_self (m n k : ℕ) : gcd (fib m) (fib n) = gcd (fib m) (fib(n + k * m)) :=
begin
induction k with k hk,
{ simp },
{ rw [hk, gcd_fib_add_self' _ _],
ring, }
end
lemma gcd_fib_fib' (m' n' : ℕ) (hmn : m' ≤ n') : gcd (fib m') (fib n') = fib(gcd m' n') :=
begin
apply gcd.induction m' n',
{ simp },
{ intros m n mpos h,
rw ←gcd_rec m n at h,
conv_lhs { rw ←mod_add_div n m },
rw [mul_comm, ←gcd_fib_add_self m (n % m) (n / m), gcd_comm],
exact h, }
end
/-- `fib n` is a strong divisibility sequence
https://proofwiki.org/wiki/GCD_of_Fibonacci_Numbers -/
lemma gcd_fib_fib (m n : ℕ) : gcd (fib m) (fib n) = fib(gcd m n):=
begin
cases le_total m n with m_le_n n_le_m,
{ exact gcd_fib_fib' m n m_le_n },
{ rw [gcd_comm, gcd_comm m n],
exact gcd_fib_fib' n m n_le_m }
end
end nat
Alex J. Best (Dec 31 2020 at 01:24):
You shouldn't need to redefine fib
if you've imported nat.fib
there is already a definition of fib there (its a little different in definition but the functions are equal) so you should be able to use the existing one and its api.
Alex J. Best (Dec 31 2020 at 01:26):
rw gcd_rec m (n + m), simp, rw gcd_rec m n,
contains what we call a "nonterminal simp", that is some use of simp that doesn't close the goal, these can sometimes make code hard to maintain (if simp gets smarter/better in future your proof might break). In this case you can replace the whole proof with
by simp [gcd_rec m (n + m), gcd_rec m n]
so the simp call is the only thing :smile:
Hanting Zhang (Dec 31 2020 at 01:26):
Fixed. I just deleted the top headers.
Bryan Gin-ge Chen (Dec 31 2020 at 01:29):
rw [...]
followed by assumption
or exact h
where h
is the name of a hypothesis in the context can usually be replaced by rwa [...]
.
Alex J. Best (Dec 31 2020 at 01:29):
The buisness with obtain ⟨m', hm'⟩ : (∃ m', m' + 1 = m) := begin use m - 1, exact nat.sub_add_cancel hm2 end,
looks more complicated than it needs to be, there is a lemma docs#nat.succ_pred_eq_of_pos which you should be able to use with hm2 to simplify the proof.
Alex J. Best (Dec 31 2020 at 01:35):
Personally I would try and see if everything can be done only with fib_add_succ
rather than fib_add
, subtracting nats is always annoying and if all the lemmas can be stated without it it might be possible to avoid it.
Alex J. Best (Dec 31 2020 at 01:38):
We tend to always put spaces after functions, like fib (m + 1)
instead of fib(m + 1)
even though it isn't needed when there are brackets
Alex J. Best (Dec 31 2020 at 01:40):
But yeah this mostly looks pretty good to me :grinning:
Mario Carneiro (Dec 31 2020 at 01:41):
also spaces after <-
in rw
Mario Carneiro (Dec 31 2020 at 01:41):
we really need a formatter, but given the state of lean parsing that's certainly not going to happen
Hanting Zhang (Dec 31 2020 at 02:57):
Ok, I'll put in the details.
Hanting Zhang (Dec 31 2020 at 03:11):
I'll try to see if using fib_add_succ
makes things shorter. Can I get push access for mathlib? Err, I'm not too familiar with git, but my user is 'acxxa'.
Bryan Gin-ge Chen (Dec 31 2020 at 03:13):
Yakov Pechersky (Dec 31 2020 at 05:02):
I would flip gcd_add_self to have the simpler expression on the RHS
Hanting Zhang (Dec 31 2020 at 21:59):
I'm in the process of making a PR to mathlib, but it seems I don't have access to push, even though I should. Maybe I need another invite? Here's the error message.
remote: error: You're not authorized to push to this branch. Visit https://docs.github.com/articles/about-protected-branches/ for more information.
To https://github.com/leanprover-community/mathlib
! [remote rejected] master -> master (protected branch hook declined)
error: failed to push some refs to 'https://github.com/leanprover-community/mathlib'```
Bryan Gin-ge Chen (Dec 31 2020 at 22:00):
You cannot push to the master branch. You should create a new branch and push to that.
Johan Commelin (Dec 31 2020 at 22:01):
git checkout -b gcd-fib
Hanting Zhang (Dec 31 2020 at 22:11):
#5549 ? I suspect that I must be doing something wrong. Sorry in advance for any git mistakes.
Bryan Gin-ge Chen (Dec 31 2020 at 22:13):
I don't see any git issues there. Congrats on opening your first PR!
Johan Commelin (Jan 01 2021 at 06:07):
@Hanting Zhang congrats on your first PR
Hanting Zhang (Jan 01 2021 at 06:39):
Thanks! That was simultaneously easier and harder than I expected it to be.
Johan Commelin (Jan 01 2021 at 07:05):
@Hanting Zhang In what sense? If there are any painpoints that we can make easier, we'd be happy to hear about them
Hanting Zhang (Jan 01 2021 at 07:13):
The opposite, actually. The PR itself felt smooth. It was working with Git that tripped me, and I had to get a friend to step me through everything. But that's more of a "just keeping doing it and you'll figure it out" thing.
Johan Commelin (Jan 01 2021 at 07:18):
Yeah, git can take some time to get used to. But there are good tutorials out there.
Johan Commelin (Jan 01 2021 at 07:18):
Did you make use of our video tutorial on how to make a PR?
Hanting Zhang (Jan 01 2021 at 07:28):
Huh, I've just been diving in and picking things up when I need them. I guess I definitely should look through the community resources now, though... maybe even actually read Theorem Proving in Lean. :sweat_smile:
Johan Commelin (Jan 01 2021 at 07:30):
I use the same learning strategy (-;
Last updated: Dec 20 2023 at 11:08 UTC