[英]Proving Gauss' theorem for nat in Coq
我想證明高斯定理nat
。
用簡單的(非精確的)語言說:如果a
除以b*c
,而a
的因子都不在b
那么它們必須全部在c
。
Require Import NPeano.
Theorem Gauss_nat: forall (a b c:nat), gcd a b = 1 -> (a | (b*c)) -> (a | c).
該定理已經為整數Z
定義,請參見Coq手冊中的此處 。 但我需要它nat
。 到目前為止,我得到的建議是使用Bezout引理,即
Lemma Bezout: forall (a b c:Z), Z.gcd a b = c -> exists u v, u*a+v*b=c.
但是,我不能直接將其用於nat
因為系數u
和v
可能為負,因此不適用於nat
。
還有另一種證明不使用整數嗎?
編輯:
正如馬克·迪金森(Mark Dickinson)在評論中指出的那樣,定理和引理已經存在於Coq的庫中。 它們位於NPeano
,分別命名為Nat.gcd_bezout
和Nat.gauss
。
如果您只是想獲取nat
的結果,而不是真正避免使用Z
,則可以在標准庫中重用證明。 這是依靠兩個輔助引理來進行操作的示意圖:
Require Import NPeano.
Require Import ZArith.
Require Import ZArith.Znumtheory.
Require Import Omega.
Close Scope Z_scope.
Lemma Zdiv_Ndiv a b : (a | b) <-> (Z.of_nat a | Z.of_nat b)%Z.
Proof. Admitted.
Lemma Zgcd_Ngcd a b : Z.of_nat (gcd a b) = Z.gcd (Z.of_nat a) (Z.of_nat b).
Proof. Admitted.
Theorem Gauss_nat a b c : gcd a b = 1 -> (a | (b*c)) -> (a | c).
Proof.
rewrite Zdiv_Ndiv, Zdiv_Ndiv, Nat2Z.inj_mul.
intros H1 H2.
assert (H3 : Z.of_nat (gcd a b) = 1%Z) by (rewrite H1; reflexivity).
rewrite Zgcd_Ngcd in H3.
apply (Gauss _ _ _ H2).
now rewrite <- Zgcd_1_rel_prime.
Qed.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.