mathlib3 documentation

ring_theory.unique_factorization_domain

Unique factorization #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

Main Definitions #

To do #

@[class]
structure wf_dvd_monoid (α : Type u_2) [comm_monoid_with_zero α] :
Prop

Well-foundedness of the strict version of |, which is equivalent to the descending chain condition on divisibility and to the ascending chain condition on principal ideals in an integral domain.

Instances of this typeclass
@[protected, instance]
theorem wf_dvd_monoid.exists_irreducible_factor {α : Type u_1} [comm_monoid_with_zero α] [wf_dvd_monoid α] {a : α} (ha : ¬is_unit a) (ha0 : a 0) :
(i : α), irreducible i i a
theorem wf_dvd_monoid.induction_on_irreducible {α : Type u_1} [comm_monoid_with_zero α] [wf_dvd_monoid α] {P : α Prop} (a : α) (h0 : P 0) (hu : (u : α), is_unit u P u) (hi : (a i : α), a 0 irreducible i P a P (i * a)) :
P a
theorem wf_dvd_monoid.exists_factors {α : Type u_1} [comm_monoid_with_zero α] [wf_dvd_monoid α] (a : α) :
a 0 ( (f : multiset α), ( (b : α), b f irreducible b) associated f.prod a)
theorem wf_dvd_monoid.not_unit_iff_exists_factors_eq {α : Type u_1} [comm_monoid_with_zero α] [wf_dvd_monoid α] (a : α) (hn0 : a 0) :
¬is_unit a (f : multiset α), ( (b : α), b f irreducible b) f.prod = a f
@[class]

unique factorization monoids.

These are defined as cancel_comm_monoid_with_zeros with well-founded strict divisibility relations, but this is equivalent to more familiar definitions:

Each element (except zero) is uniquely represented as a multiset of irreducible factors. Uniqueness is only up to associated elements.

Each element (except zero) is non-uniquely represented as a multiset of prime factors.

To define a UFD using the definition in terms of multisets of irreducible factors, use the definition of_exists_unique_irreducible_factors

To define a UFD using the definition in terms of multisets of prime factors, use the definition of_exists_prime_factors

Instances of this typeclass
@[reducible]

Can't be an instance because it would cause a loop ufm → wf_dvd_monoid → ufm → ....

theorem unique_factorization_monoid.induction_on_prime {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] {P : α Prop} (a : α) (h₁ : P 0) (h₂ : (x : α), is_unit x P x) (h₃ : (a p : α), a 0 prime p P a P (p * a)) :
P a
theorem prime_factors_unique {α : Type u_1} [cancel_comm_monoid_with_zero α] {f g : multiset α} :
( (x : α), x f prime x) ( (x : α), x g prime x) associated f.prod g.prod multiset.rel associated f g
theorem prime_factors_irreducible {α : Type u_1} [cancel_comm_monoid_with_zero α] {a : α} {f : multiset α} (ha : irreducible a) (pfa : ( (b : α), b f prime b) associated f.prod a) :
(p : α), associated a p f = {p}

If an irreducible has a prime factorization, then it is an associate of one of its prime factors.

theorem wf_dvd_monoid.of_exists_prime_factors {α : Type u_1} [cancel_comm_monoid_with_zero α] (pf : (a : α), a 0 ( (f : multiset α), ( (b : α), b f prime b) associated f.prod a)) :
theorem irreducible_iff_prime_of_exists_prime_factors {α : Type u_1} [cancel_comm_monoid_with_zero α] (pf : (a : α), a 0 ( (f : multiset α), ( (b : α), b f prime b) associated f.prod a)) {p : α} :
theorem irreducible_iff_prime_of_exists_unique_irreducible_factors {α : Type u_1} [cancel_comm_monoid_with_zero α] (eif : (a : α), a 0 ( (f : multiset α), ( (b : α), b f irreducible b) associated f.prod a)) (uif : (f g : multiset α), ( (x : α), x f irreducible x) ( (x : α), x g irreducible x) associated f.prod g.prod multiset.rel associated f g) (p : α) :

Noncomputably determines the multiset of prime factors.

Equations
@[simp]

An arbitrary choice of factors of x : M is exactly the (unique) normalized set of factors, if M has a trivial group of units.

@[protected]

Noncomputably defines a normalization_monoid structure on a unique_factorization_monoid.

Equations

Euclid's lemma: if a ∣ b * c and a and c have no common prime factors, a ∣ b. Compare is_coprime.dvd_of_dvd_mul_left.

theorem unique_factorization_monoid.dvd_of_dvd_mul_right_of_no_prime_factors {R : Type u_2} [cancel_comm_monoid_with_zero R] [unique_factorization_monoid R] {a b c : R} (ha : a 0) (no_factors : {d : R}, d a d b ¬prime d) :
a b * c a c

Euclid's lemma: if a ∣ b * c and a and b have no common prime factors, a ∣ c. Compare is_coprime.dvd_of_dvd_mul_right.

theorem unique_factorization_monoid.exists_reduced_factors {R : Type u_2} [cancel_comm_monoid_with_zero R] [unique_factorization_monoid R] (a : R) (H : a 0) (b : R) :
(a' b' c' : R), ( {d : R}, d a' d b' is_unit d) c' * a' = a c' * b' = b

If a ≠ 0, b are elements of a unique factorization domain, then dividing out their common factor c' gives a' and b' with no factors in common.

theorem unique_factorization_monoid.exists_reduced_factors' {R : Type u_2} [cancel_comm_monoid_with_zero R] [unique_factorization_monoid R] (a b : R) (hb : b 0) :
(a' b' c' : R), ( {d : R}, d a' d b' is_unit d) c' * a' = a c' * b' = b
theorem unique_factorization_monoid.pow_eq_pow_iff {R : Type u_2} [cancel_comm_monoid_with_zero R] [unique_factorization_monoid R] {a : R} (ha0 : a 0) (ha1 : ¬is_unit a) {i j : } :
a ^ i = a ^ j i = j

The multiplicity of an irreducible factor of a nonzero element is exactly the number of times the normalized factor occurs in the normalized_factors.

See also count_normalized_factors_eq which expands the definition of multiplicity to produce a specification for count (normalized_factors _) _..

The number of times an irreducible factor p appears in normalized_factors x is defined by the number of times it divides x.

See also multiplicity_eq_count_normalized_factors if n is given by multiplicity p x.

The number of times an irreducible factor p appears in normalized_factors x is defined by the number of times it divides x. This is a slightly more general version of unique_factorization_monoid.count_normalized_factors_eq that allows p = 0.

See also multiplicity_eq_count_normalized_factors if n is given by multiplicity p x.

theorem unique_factorization_monoid.max_power_factor {R : Type u_2} [cancel_comm_monoid_with_zero R] [unique_factorization_monoid R] [nontrivial R] [normalization_monoid R] {a₀ x : R} (h : a₀ 0) (hx : irreducible x) :
(n : ) (a : R), ¬x a a₀ = x ^ n * a
theorem unique_factorization_monoid.prime_pow_coprime_prod_of_coprime_insert {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] [decidable_eq α] {s : finset α} (i : α ) (p : α) (hps : p s) (is_prime : (q : α), q has_insert.insert p s prime q) (is_coprime : (q : α), q has_insert.insert p s (q' : α), q' has_insert.insert p s q q' q = q') (q : α) :
q p ^ i p q s.prod (λ (p' : α), p' ^ i p') is_unit q
theorem unique_factorization_monoid.induction_on_prime_power {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] {P : α Prop} (s : finset α) (i : α ) (is_prime : (p : α), p s prime p) (is_coprime : (p : α), p s (q : α), q s p q p = q) (h1 : {x : α}, is_unit x P x) (hpr : {p : α} (i : ), prime p P (p ^ i)) (hcp : {x y : α}, ( (p : α), p x p y is_unit p) P x P y P (x * y)) :
P (s.prod (λ (p : α), p ^ i p))

If P holds for units and powers of primes, and P x ∧ P y for coprime x, y implies P (x * y), then P holds on a product of powers of distinct primes.

theorem unique_factorization_monoid.induction_on_coprime {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] {P : α Prop} (a : α) (h0 : P 0) (h1 : {x : α}, is_unit x P x) (hpr : {p : α} (i : ), prime p P (p ^ i)) (hcp : {x y : α}, ( (p : α), p x p y is_unit p) P x P y P (x * y)) :
P a

If P holds for 0, units and powers of primes, and P x ∧ P y for coprime x, y implies P (x * y), then P holds on all a : α.

theorem unique_factorization_monoid.multiplicative_prime_power {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] {β : Type u_3} [cancel_comm_monoid_with_zero β] {f : α β} (s : finset α) (i j : α ) (is_prime : (p : α), p s prime p) (is_coprime : (p : α), p s (q : α), q s p q p = q) (h1 : {x y : α}, is_unit y f (x * y) = f x * f y) (hpr : {p : α} (i : ), prime p f (p ^ i) = f p ^ i) (hcp : {x y : α}, ( (p : α), p x p y is_unit p) f (x * y) = f x * f y) :
f (s.prod (λ (p : α), p ^ (i p + j p))) = f (s.prod (λ (p : α), p ^ i p)) * f (s.prod (λ (p : α), p ^ j p))

If f maps p ^ i to (f p) ^ i for primes p, and f is multiplicative on coprime elements, then f is multiplicative on all products of primes.

theorem unique_factorization_monoid.multiplicative_of_coprime {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] {β : Type u_3} [cancel_comm_monoid_with_zero β] (f : α β) (a b : α) (h0 : f 0 = 0) (h1 : {x y : α}, is_unit y f (x * y) = f x * f y) (hpr : {p : α} (i : ), prime p f (p ^ i) = f p ^ i) (hcp : {x y : α}, ( (p : α), p x p y is_unit p) f (x * y) = f x * f y) :
f (a * b) = f a * f b

If f maps p ^ i to (f p) ^ i for primes p, and f is multiplicative on coprime elements, then f is multiplicative everywhere.

@[reducible]

factor_set α representation elements of unique factorization domain as multisets. multiset α produced by normalized_factors are only unique up to associated elements, while the multisets in factor_set α are unique by equality and restricted to irreducible elements. This gives us a representation of each element as a unique multisets (or the added ⊤ for 0), which has a complete lattice struture. Infimum is the greatest common divisor and supremum is the least common multiple.

Equations

Evaluates the product of a factor_set to be the product of the corresponding multiset, or 0 if there is none.

Equations
@[simp]
@[simp]
theorem associates.prod_add {α : Type u_1} [cancel_comm_monoid_with_zero α] (a b : associates.factor_set α) :
(a + b).prod = a.prod * b.prod

bcount p s is the multiplicity of p in the factor_set s (with bundled p)

Equations

count p s is the multiplicity of the irreducible p in the factor_set s.

If p is not irreducible, count p s is defined to be 0.

Equations
@[simp]
theorem associates.count_some {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [decidable_eq (associates α)] {p : associates α} (hp : irreducible p) (s : multiset {a // irreducible a}) :
@[simp]
theorem associates.count_zero {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [decidable_eq (associates α)] {p : associates α} (hp : irreducible p) :
p.count 0 = 0

membership in a factor_set (bundled version)

Equations
def associates.factor_set_mem {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] (p : associates α) (s : associates.factor_set α) :
Prop

factor_set_mem p s is the predicate that the irreducible p is a member of s : factor_set α.

If p is not irreducible, p is not a member of any factor_set.

Equations
@[protected, instance]
Equations
@[simp]
theorem associates.mem_factor_set_top {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] {p : associates α} {hp : irreducible p} :
theorem associates.mem_factor_set_some {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] {p : associates α} {hp : irreducible p} {l : multiset {a // irreducible a}} :
p l p, hp⟩ l
noncomputable def associates.factors' {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] [dec : decidable_eq α] (a : α) :

This returns the multiset of irreducible factors as a factor_set, a multiset of irreducible associates with_top.

Equations

This returns the multiset of irreducible factors of an associate as a factor_set, a multiset of irreducible associates with_top.

Equations
theorem associates.eq_factors_of_eq_counts {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a b : associates α} (ha : a 0) (hb : b 0) (h : (p : associates α), irreducible p p.count a.factors = p.count b.factors) :
theorem associates.eq_of_eq_counts {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a b : associates α} (ha : a 0) (hb : b 0) (h : (p : associates α), irreducible p p.count a.factors = p.count b.factors) :
a = b
theorem associates.count_le_count_of_le {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a b p : associates α} (hb : b 0) (hp : irreducible p) (h : a b) :
@[protected, instance]
Equations
@[protected, instance]
Equations
theorem associates.sup_mul_inf {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] (a b : associates α) :
(a b) * (a b) = a * b
theorem associates.dvd_of_mem_factors {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a p : associates α} {hp : irreducible p} (hm : p a.factors) :
p a
theorem associates.dvd_of_mem_factors' {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] {a : α} {p : associates α} {hp : irreducible p} {hz : a 0} (h_mem : p, hp⟩ associates.factors' a) :
theorem associates.mem_factors'_of_dvd {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] [dec : decidable_eq α] {a p : α} (ha0 : a 0) (hp : irreducible p) (hd : p a) :
theorem associates.mem_factors'_iff_dvd {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] {a p : α} (ha0 : a 0) (hp : irreducible p) :
theorem associates.mem_factors_of_dvd {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a p : α} (ha0 : a 0) (hp : irreducible p) (hd : p a) :
theorem associates.mem_factors_iff_dvd {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a p : α} (ha0 : a 0) (hp : irreducible p) :
theorem associates.exists_prime_dvd_of_not_inf_one {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a b : α} (ha : a 0) (hb : b 0) (h : associates.mk a associates.mk b 1) :
(p : α), prime p p a p b
theorem associates.coprime_iff_inf_one {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a b : α} (ha0 : a 0) (hb0 : b 0) :
theorem associates.prime_pow_dvd_iff_le {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] [nontrivial α] {m p : associates α} (h₁ : m 0) (h₂ : irreducible p) {k : } :
p ^ k m k p.count m.factors
theorem associates.le_of_count_ne_zero {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {m p : associates α} (h0 : m 0) (hp : irreducible p) :
p.count m.factors 0 p m
theorem associates.count_ne_zero_iff_dvd {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a p : α} (ha0 : a 0) (hp : irreducible p) :
theorem associates.count_self {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] [nontrivial α] {p : associates α} (hp : irreducible p) :
theorem associates.count_eq_zero_of_ne {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {p q : associates α} (hp : irreducible p) (hq : irreducible q) (h : p q) :
theorem associates.count_mul {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a : associates α} (ha : a 0) {b : associates α} (hb : b 0) {p : associates α} (hp : irreducible p) :
theorem associates.count_of_coprime {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a : associates α} (ha : a 0) {b : associates α} (hb : b 0) (hab : (d : associates α), d a d b ¬prime d) {p : associates α} (hp : irreducible p) :
theorem associates.count_mul_of_coprime {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a b : associates α} (hb : b 0) {p : associates α} (hp : irreducible p) (hab : (d : associates α), d a d b ¬prime d) :
theorem associates.count_mul_of_coprime' {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a b p : associates α} (hp : irreducible p) (hab : (d : associates α), d a d b ¬prime d) :
theorem associates.dvd_count_of_dvd_count_mul {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a b : associates α} (hb : b 0) {p : associates α} (hp : irreducible p) (hab : (d : associates α), d a d b ¬prime d) {k : } (habk : k p.count (a * b).factors) :
@[simp]
theorem associates.count_pow {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] [nontrivial α] {a : associates α} (ha : a 0) {p : associates α} (hp : irreducible p) (k : ) :
p.count (a ^ k).factors = k * p.count a.factors
theorem associates.dvd_count_pow {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] [nontrivial α] {a : associates α} (ha : a 0) {p : associates α} (hp : irreducible p) (k : ) :
k p.count (a ^ k).factors
theorem associates.is_pow_of_dvd_count {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] [nontrivial α] {a : associates α} (ha : a 0) {k : } (hk : (p : associates α), irreducible p k p.count a.factors) :
(b : associates α), a = b ^ k
theorem associates.eq_pow_count_factors_of_dvd_pow {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {p a : associates α} (hp : irreducible p) {n : } (h : a p ^ n) :
a = p ^ p.count a.factors

The only divisors of prime powers are prime powers. See eq_pow_find_of_dvd_irreducible_pow for an explicit expression as a p-power (without using count).

theorem associates.count_factors_eq_find_of_dvd_pow {α : Type u_1} [cancel_comm_monoid_with_zero α] [dec_irr : Π (p : associates α), decidable (irreducible p)] [unique_factorization_monoid α] [dec : decidable_eq α] [dec' : decidable_eq (associates α)] {a p : associates α} (hp : irreducible p) [Π (n : ), decidable (a p ^ n)] {n : } (h : a p ^ n) :
theorem associates.eq_pow_of_mul_eq_pow {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] [nontrivial α] {a b c : associates α} (ha : a 0) (hb : b 0) (hab : (d : associates α), d a d b ¬prime d) {k : } (h : a * b = c ^ k) :
(d : associates α), a = d ^ k
theorem associates.eq_pow_find_of_dvd_irreducible_pow {α : Type u_1} [cancel_comm_monoid_with_zero α] [unique_factorization_monoid α] {a p : associates α} (hp : irreducible p) [Π (n : ), decidable (a p ^ n)] {n : } (h : a p ^ n) :
a = p ^ nat.find _

The only divisors of prime powers are prime powers.

theorem associates.quot_out {α : Type u_1} [comm_monoid α] (a : associates α) :

to_gcd_monoid constructs a GCD monoid out of a unique factorization domain.

Equations

If y is a nonzero element of a unique factorization monoid with finitely many units (e.g. , ideal (ring_of_integers K)), it has finitely many divisors.

Equations

This returns the multiset of irreducible factors as a finsupp

Equations
@[simp]

The support of factorization n is exactly the finset of normalized factors

@[simp]

For nonzero a and b, the power of p in a * b is the sum of the powers in a and b

For any p, the power of p in x^n is n times the power in x