簡體   English   中英

證明Coq中nat的高斯定理

[英]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因為系數uv可能為負,因此不適用於nat

還有另一種證明不使用整數嗎?

編輯:

正如馬克·迪金森(Mark Dickinson)在評論中指出的那樣,定理和引理已經存在於Coq的庫中。 它們位於NPeano ,分別命名為Nat.gcd_bezoutNat.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM