/- Copyright (c) 2022 Bhavik Mehta. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Bhavik Mehta ! This file was ported from Lean 3 source module algebra.is_prime_pow ! leanprover-community/mathlib commit f7fc89d5d5ff1db2d1242c7bb0e9062ce47ef47c ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Algebra.Associated import Mathlib.NumberTheory.Divisors /-! # Prime powers This file deals with prime powers: numbers which are positive integer powers of a single prime. -/ variable {R :R: Type ?u.14Type _} [CommMonoidWithZeroType _: Type (?u.83807+1)R] (R: Type ?u.14nn: Rp :p: RR) (R: Type ?u.2k :k: ββ) /-- `n` is a prime power if there is a prime `p` and a positive natural `k` such that `n` can be written as `p^k`. -/ defβ: TypeIsPrimePow :IsPrimePow: {R : Type u_1} β [inst : CommMonoidWithZero R] β R β PropProp := β (Prop: Typep :p: RR)(R: Type ?u.14k :k: ββ),β: TypePrimePrime: {Ξ± : Type ?u.35} β [inst : CommMonoidWithZero Ξ±] β Ξ± β Propp β§p: R0 <0: ?m.47k β§k: βp ^p: Rk =k: βn #align is_prime_pown: RIsPrimePow theorem isPrimePow_def :IsPrimePow: {R : Type u_1} β [inst : CommMonoidWithZero R] β R β PropIsPrimePowIsPrimePow: {R : Type ?u.18636} β [inst : CommMonoidWithZero R] β R β Propn β β (n: Rp :p: RR)(R: Type ?u.18624k :k: ββ),β: TypePrimePrime: {Ξ± : Type ?u.18654} β [inst : CommMonoidWithZero Ξ±] β Ξ± β Propp β§p: R0 <0: ?m.18659k β§k: βp ^p: Rk =k: βn := Iff.rfl #align is_prime_pow_defn: RisPrimePow_def /-- An equivalent definition for prime powers: `n` is a prime power iff there is a prime `p` and a natural `k` such that `n` can be written as `p^(k+1)`. -/ theoremisPrimePow_def: β {R : Type u_1} [inst : CommMonoidWithZero R] (n : R), IsPrimePow n β β p k, Prime p β§ 0 < k β§ p ^ k = nisPrimePow_iff_pow_succ :isPrimePow_iff_pow_succ: β {R : Type u_1} [inst : CommMonoidWithZero R] (n : R), IsPrimePow n β β p k, Prime p β§ p ^ (k + 1) = nIsPrimePowIsPrimePow: {R : Type ?u.37245} β [inst : CommMonoidWithZero R] β R β Propn β β (n: Rp :p: RR)(R: Type ?u.37233k :k: ββ),β: TypePrimePrime: {Ξ± : Type ?u.37263} β [inst : CommMonoidWithZero Ξ±] β Ξ± β Propp β§p: Rp ^ (p: Rk +k: β1) =1: ?m.37274n := (n: RisPrimePow_defisPrimePow_def: β {R : Type ?u.56002} [inst : CommMonoidWithZero R] (n : R), IsPrimePow n β β p k, Prime p β§ 0 < k β§ p ^ k = n_).trans β¨fun β¨_: ?m.56003p,p: Rk,k: βhp,hp: Prime phk, hnβ© => β¨hk: 0 < k_,_: ?m.56133_,_: ?m.56142hp,hp: Prime pβ©, fun β¨Goals accomplished! πp,p: Rk,k: βhp, hnβ© => β¨hp: Prime p_,_: ?m.56409_,_: ?m.56418hp, Nat.succ_pos', hnβ©β© #align is_prime_pow_iff_pow_succhp: Prime pisPrimePow_iff_pow_succ theoremisPrimePow_iff_pow_succ: β {R : Type u_1} [inst : CommMonoidWithZero R] (n : R), IsPrimePow n β β p k, Prime p β§ p ^ (k + 1) = nnot_isPrimePow_zero [NoZeroDivisorsnot_isPrimePow_zero: β {R : Type u_1} [inst : CommMonoidWithZero R] [inst_1 : NoZeroDivisors R], Β¬IsPrimePow 0R] : Β¬R: Type ?u.56638IsPrimePow (IsPrimePow: {R : Type ?u.57010} β [inst : CommMonoidWithZero R] β R β Prop0 :0: ?m.57015R) :=R: Type ?u.56638Goals accomplished! πR: Type u_1
instβΒΉ: CommMonoidWithZero R
nβ, p: R
k: β
instβ: NoZeroDivisors R
x: R
n: β
_hn: 0 < n
hx: x ^ n = 0R: Type u_1
instβΒΉ: CommMonoidWithZero R
nβ, p: R
k: β
instβ: NoZeroDivisors R
x: R
n: β
_hn: 0 < n
hx: x ^ n = 0R: Type u_1
instβΒΉ: CommMonoidWithZero R
nβ, p: R
k: β
instβ: NoZeroDivisors R
x: R
n: β
_hn: 0 < n
hx: x ^ n = 0R: Type u_1
instβΒΉ: CommMonoidWithZero R
nβ, p: R
k: β
instβ: NoZeroDivisors R
x: R
n: β
_hn: 0 < n
hx: x ^ n = 0#align not_is_prime_pow_zeroGoals accomplished! πnot_isPrimePow_zero theoremnot_isPrimePow_zero: β {R : Type u_1} [inst : CommMonoidWithZero R] [inst_1 : NoZeroDivisors R], Β¬IsPrimePow 0IsPrimePow.not_unit {IsPrimePow.not_unit: β {R : Type u_1} [inst : CommMonoidWithZero R] {n : R}, IsPrimePow n β Β¬IsUnit nn :n: RR} (R: Type ?u.57729h :h: IsPrimePow nIsPrimePowIsPrimePow: {R : Type ?u.57743} β [inst : CommMonoidWithZero R] β R β Propn) : Β¬IsUnitn: Rn := let β¨n: R_p,_p: R_k,_k: βhp,hp: Prime _phk, hnβ© :=hk: 0 < _kh hn βΈ (isUnit_pow_iffh: IsPrimePow nhk.ne').not.mprhk: 0 < _khp.hp: Prime _pnot_unit #align is_prime_pow.not_unitnot_unit: β {Ξ± : Type ?u.58242} [inst : CommMonoidWithZero Ξ±] {p : Ξ±}, Prime p β Β¬IsUnit pIsPrimePow.not_unit theoremIsPrimePow.not_unit: β {R : Type u_1} [inst : CommMonoidWithZero R] {n : R}, IsPrimePow n β Β¬IsUnit nIsUnit.not_isPrimePow {IsUnit.not_isPrimePow: β {R : Type u_1} [inst : CommMonoidWithZero R] {n : R}, IsUnit n β Β¬IsPrimePow nn :n: RR} (R: Type ?u.58668h : IsUnith: IsUnit nn) : Β¬n: RIsPrimePowIsPrimePow: {R : Type ?u.58939} β [inst : CommMonoidWithZero R] β R β Propn := funn: Rh' =>h': ?m.58953h'.h': ?m.58953not_unitnot_unit: β {R : Type ?u.58955} [inst : CommMonoidWithZero R] {n : R}, IsPrimePow n β Β¬IsUnit nh #align is_unit.not_is_prime_powh: IsUnit nIsUnit.not_isPrimePow theoremIsUnit.not_isPrimePow: β {R : Type u_1} [inst : CommMonoidWithZero R] {n : R}, IsUnit n β Β¬IsPrimePow nnot_isPrimePow_one : Β¬not_isPrimePow_one: Β¬IsPrimePow 1IsPrimePow (IsPrimePow: {R : Type ?u.58996} β [inst : CommMonoidWithZero R] β R β Prop1 :1: ?m.59001R) := isUnit_one.R: Type ?u.58984not_isPrimePow #align not_is_prime_pow_onenot_isPrimePow: β {R : Type ?u.59437} [inst : CommMonoidWithZero R] {n : R}, IsUnit n β Β¬IsPrimePow nnot_isPrimePow_one theoremnot_isPrimePow_one: β {R : Type u_1} [inst : CommMonoidWithZero R], Β¬IsPrimePow 1Prime.isPrimePow {Prime.isPrimePow: β {p : R}, Prime p β IsPrimePow pp :p: RR} (R: Type ?u.59707hp :hp: Prime pPrimePrime: {Ξ± : Type ?u.59721} β [inst : CommMonoidWithZero Ξ±] β Ξ± β Propp) :p: RIsPrimePowIsPrimePow: {R : Type ?u.59747} β [inst : CommMonoidWithZero R] β R β Propp := β¨p: Rp,p: R1,1: ?m.59794hp,hp: Prime pzero_lt_one,zero_lt_one: β {Ξ± : Type ?u.59818} [inst : Zero Ξ±] [inst_1 : One Ξ±] [inst_2 : PartialOrder Ξ±] [inst_3 : ZeroLEOneClass Ξ±] [inst_4 : NeZero 1], 0 < 1Goals accomplished! πβ© #align prime.is_prime_powGoals accomplished! πPrime.isPrimePow theoremPrime.isPrimePow: β {R : Type u_1} [inst : CommMonoidWithZero R] {p : R}, Prime p β IsPrimePow pIsPrimePow.pow {IsPrimePow.pow: β {n : R}, IsPrimePow n β β {k : β}, k β 0 β IsPrimePow (n ^ k)n :n: RR} (R: Type ?u.60643hn :hn: IsPrimePow nIsPrimePowIsPrimePow: {R : Type ?u.60657} β [inst : CommMonoidWithZero R] β R β Propn) {n: Rk :k: ββ} (β: Typehk :hk: k β 0k βk: β0) :0: ?m.60688IsPrimePow (IsPrimePow: {R : Type ?u.60700} β [inst : CommMonoidWithZero R] β R β Propn ^n: Rk) := let β¨k: βp,p: Rk',k': βhp,hp: Prime phk', hnβ© :=hk': 0 < k'hn β¨hn: IsPrimePow np,p: Rk *k: βk',k': βhp,hp: Prime pmul_posmul_pos: β {Ξ± : Type ?u.79410} {a b : Ξ±} [inst : MulZeroClass Ξ±] [inst_1 : Preorder Ξ±] [inst_2 : PosMulStrictMono Ξ±], 0 < a β 0 < b β 0 < a * bhk.bot_lthk: k β 0hk',hk': 0 < k'Goals accomplished! πβ© #align is_prime_pow.powGoals accomplished! πIsPrimePow.pow theoremIsPrimePow.pow: β {R : Type u_1} [inst : CommMonoidWithZero R] {n : R}, IsPrimePow n β β {k : β}, k β 0 β IsPrimePow (n ^ k)IsPrimePow.ne_zero [NoZeroDivisorsIsPrimePow.ne_zero: β [inst : NoZeroDivisors R] {n : R}, IsPrimePow n β n β 0R] {R: Type ?u.80366n :n: RR} (R: Type ?u.80366h :h: IsPrimePow nIsPrimePowIsPrimePow: {R : Type ?u.80740} β [inst : CommMonoidWithZero R] β R β Propn) :n: Rn βn: R0 := fun0: ?m.80767t =>t: ?m.80809not_isPrimePow_zero (not_isPrimePow_zero: β {R : Type ?u.80811} [inst : CommMonoidWithZero R] [inst_1 : NoZeroDivisors R], Β¬IsPrimePow 0t βΈt: ?m.80809h) #align is_prime_pow.ne_zeroh: IsPrimePow nIsPrimePow.ne_zero theoremIsPrimePow.ne_zero: β {R : Type u_1} [inst : CommMonoidWithZero R] [inst_1 : NoZeroDivisors R] {n : R}, IsPrimePow n β n β 0IsPrimePow.ne_one {IsPrimePow.ne_one: β {R : Type u_1} [inst : CommMonoidWithZero R] {n : R}, IsPrimePow n β n β 1n :n: RR} (R: Type ?u.81038h :h: IsPrimePow nIsPrimePowIsPrimePow: {R : Type ?u.81052} β [inst : CommMonoidWithZero R] β R β Propn) :n: Rn βn: R1 := fun1: ?m.81081t =>t: ?m.81491not_isPrimePow_one (not_isPrimePow_one: β {R : Type ?u.81493} [inst : CommMonoidWithZero R], Β¬IsPrimePow 1t βΈt: ?m.81491h) #align is_prime_pow.ne_oneh: IsPrimePow nIsPrimePow.ne_one section Nat theorem isPrimePow_nat_iff (IsPrimePow.ne_one: β {R : Type u_1} [inst : CommMonoidWithZero R] {n : R}, IsPrimePow n β n β 1n :n: ββ) :β: TypeIsPrimePowIsPrimePow: {R : Type ?u.81652} β [inst : CommMonoidWithZero R] β R β Propn β βn: βpp: βk :k: ββ, Nat.Primeβ: Typep β§p: β0 <0: ?m.81677k β§k: βp ^p: βk =k: βn :=n: βGoals accomplished! π#align is_prime_pow_nat_iff isPrimePow_nat_iff theoremGoals accomplished! πNat.Prime.isPrimePow {Nat.Prime.isPrimePow: β {p : β}, Prime p β IsPrimePow pp :p: ββ} (β: Typehp :hp: Prime pp.Prime) :p: βIsPrimePowIsPrimePow: {R : Type ?u.82161} β [inst : CommMonoidWithZero R] β R β Propp :=p: β_root_.Prime.isPrimePow (_root_.Prime.isPrimePow: β {R : Type ?u.82195} [inst : CommMonoidWithZero R] {p : R}, _root_.Prime p β IsPrimePow pprime_iff.mpprime_iff: β {p : β}, Prime p β _root_.Prime php) #align nat.prime.is_prime_powhp: Prime pNat.Prime.isPrimePow theoremNat.Prime.isPrimePow: β {p : β}, Nat.Prime p β IsPrimePow pisPrimePow_nat_iff_bounded (n :n: ββ) :β: TypeIsPrimePowIsPrimePow: {R : Type ?u.82241} β [inst : CommMonoidWithZero R] β R β Propn β βn: βp :p: ββ,β: Typep β€p: βn β§ βn: βk :k: ββ,β: Typek β€k: βn β§n: βp.Prime β§p: β0 <0: ?m.82276k β§k: βp ^p: βk =k: βn :=n: βGoals accomplished! πGoals accomplished! πpppGoals accomplished! π#align is_prime_pow_nat_iff_bounded isPrimePow_nat_iff_boundedGoals accomplished! πinstance {instance: {n : β} β Decidable (IsPrimePow n)n :n: ββ} : Decidable (β: TypeIsPrimePowIsPrimePow: {R : Type ?u.83287} β [inst : CommMonoidWithZero R] β R β Propn) := decidable_of_iff'n: β_ (isPrimePow_nat_iff_bounded_: Propn) theoremn: βIsPrimePow.dvd {IsPrimePow.dvd: β {n m : β}, IsPrimePow n β m β£ n β m β 1 β IsPrimePow mnn: βm :m: ββ} (β: Typehn :hn: IsPrimePow nIsPrimePowIsPrimePow: {R : Type ?u.83823} β [inst : CommMonoidWithZero R] β R β Propn) (n: βhm :hm: m β£ nm β£m: βn) (n: βhmβ :hmβ: m β 1m βm: β1) :1: ?m.83868IsPrimePowIsPrimePow: {R : Type ?u.83880} β [inst : CommMonoidWithZero R] β R β Propm :=m: βGoals accomplished! πR: Type ?u.83807
instβ: CommMonoidWithZero R
nβ, p: R
k, n, m: β
hn: IsPrimePow n
hm: m β£ n
hmβ: m β 1R: Type ?u.83807
instβ: CommMonoidWithZero R
nβ, p: R
k, n, m: β
hn: IsPrimePow n
hm: m β£ n
hmβ: m β 1R: Type ?u.83807
instβ: CommMonoidWithZero R
nβ, p: R
k, n, m: β
hn: IsPrimePow n
hm: m β£ n
hmβ: m β 1R: Type ?u.83807
instβ: CommMonoidWithZero R
nβ, p: R
k, n, m: β
hn: IsPrimePow n
hm: m β£ n
hmβ: m β 1R: Type ?u.83807
instβ: CommMonoidWithZero R
nβ, p: R
k, n, m: β
hn: IsPrimePow n
hm: m β£ n
hmβ: m β 1R: Type ?u.83807
instβ: CommMonoidWithZero R
nβ, p: R
k, n, m: β
hn: IsPrimePow n
hm: m β£ n
hmβ: m β 1R: Type ?u.83807
instβ: CommMonoidWithZero R
nβ, p: R
k, n, m: β
hn: IsPrimePow n
hm: m β£ n
hmβ: m β 1R: Type ?u.83807
instβ: CommMonoidWithZero R
nβ, p: R
k, n, m: β
hn: IsPrimePow n
hm: m β£ n
hmβ: m β 1#align is_prime_pow.dvdGoals accomplished! πIsPrimePow.dvd theoremIsPrimePow.dvd: β {n m : β}, IsPrimePow n β m β£ n β m β 1 β IsPrimePow mNat.disjoint_divisors_filter_isPrimePow {Nat.disjoint_divisors_filter_isPrimePow: β {a b : β}, coprime a b β Disjoint (Finset.filter IsPrimePow (divisors a)) (Finset.filter IsPrimePow (divisors b))aa: βb :b: ββ} (β: Typehab :hab: coprime a ba.coprimea: βb) :b: βDisjoint (Disjoint: {Ξ± : Type ?u.84436} β [inst : PartialOrder Ξ±] β [inst : OrderBot Ξ±] β Ξ± β Ξ± β Propa.divisors.a: βfilterfilter: {Ξ± : Type ?u.84518} β (p : Ξ± β Prop) β [inst : DecidablePred p] β Finset Ξ± β Finset Ξ±IsPrimePow) (IsPrimePow: {R : Type ?u.84525} β [inst : CommMonoidWithZero R] β R β Propb.divisors.b: βfilterfilter: {Ξ± : Type ?u.84591} β (p : Ξ± β Prop) β [inst : DecidablePred p] β Finset Ξ± β Finset Ξ±IsPrimePow) :=IsPrimePow: {R : Type ?u.84598} β [inst : CommMonoidWithZero R] β R β PropGoals accomplished! πDisjoint (Finset.filter IsPrimePow (divisors a)) (Finset.filter IsPrimePow (divisors b))β β¦a_1 : ββ¦, a_1 β£ a β a β 0 β IsPrimePow a_1 β a_1 β£ b β b β 0 β Β¬IsPrimePow a_1Disjoint (Finset.filter IsPrimePow (divisors a)) (Finset.filter IsPrimePow (divisors b))Disjoint (Finset.filter IsPrimePow (divisors a)) (Finset.filter IsPrimePow (divisors b))#align nat.disjoint_divisors_filter_prime_powGoals accomplished! πNat.disjoint_divisors_filter_isPrimePow theoremNat.disjoint_divisors_filter_isPrimePow: β {a b : β}, Nat.coprime a b β Disjoint (Finset.filter IsPrimePow (Nat.divisors a)) (Finset.filter IsPrimePow (Nat.divisors b))IsPrimePow.two_le : β {IsPrimePow.two_le: β {n : β}, IsPrimePow n β 2 β€ nn :n: ββ},β: TypeIsPrimePowIsPrimePow: {R : Type ?u.85203} β [inst : CommMonoidWithZero R] β R β Propn βn: β2 β€2: ?m.85235n |n: β0,0: βh => (h: IsPrimePow 0not_isPrimePow_zeronot_isPrimePow_zero: β {R : Type ?u.85296} [inst : CommMonoidWithZero R] [inst_1 : NoZeroDivisors R], Β¬IsPrimePow 0h).elim |h: IsPrimePow 01,1: βh => (h: IsPrimePow 1not_isPrimePow_onenot_isPrimePow_one: β {R : Type ?u.85344} [inst : CommMonoidWithZero R], Β¬IsPrimePow 1h).elim |h: IsPrimePow 1_n + 2, _ =>_n: βle_add_self #align is_prime_pow.two_lele_add_self: β {Ξ± : Type ?u.85443} [inst : CanonicallyOrderedAddMonoid Ξ±] {a b : Ξ±}, a β€ b + aIsPrimePow.two_le theoremIsPrimePow.two_le: β {n : β}, IsPrimePow n β 2 β€ nIsPrimePow.pos {IsPrimePow.pos: β {n : β}, IsPrimePow n β 0 < nn :n: ββ} (β: Typehn :hn: IsPrimePow nIsPrimePowIsPrimePow: {R : Type ?u.85646} β [inst : CommMonoidWithZero R] β R β Propn) :n: β0 <0: ?m.85679n :=n: βpos_of_gtpos_of_gt: β {M : Type ?u.85717} [inst : CanonicallyOrderedAddMonoid M] {n m : M}, n < m β 0 < mhn.hn: IsPrimePow ntwo_le #align is_prime_pow.postwo_le: β {n : β}, IsPrimePow n β 2 β€ nIsPrimePow.pos theoremIsPrimePow.pos: β {n : β}, IsPrimePow n β 0 < nIsPrimePow.one_lt {IsPrimePow.one_lt: β {n : β}, IsPrimePow n β 1 < nn :n: ββ} (β: Typeh :h: IsPrimePow nIsPrimePowIsPrimePow: {R : Type ?u.85785} β [inst : CommMonoidWithZero R] β R β Propn) :n: β1 <1: ?m.85818n :=n: βh.h: IsPrimePow ntwo_le #align is_prime_pow.one_lttwo_le: β {n : β}, IsPrimePow n β 2 β€ nIsPrimePow.one_lt end NatIsPrimePow.one_lt: β {n : β}, IsPrimePow n β 1 < n