Definition logGI p x :=
if primeGI p then logGI_rec p x ('N x) else 0%N.

(* Specifications: *)
Lemma logGI_recE p x m1 m2 :
primeGI p -> ('N x <= m1)%N -> ('N x <= m2)%N -> x != 0 ->
logGI_rec p x m1 = logGI_rec p x m2.
Lemma logGIE p x :
logGI p x = if [&& primeGI p, x != 0 & p %| x] then (logGI p (x %/ p)).+1 else 0%N.
Lemma logGI_gt0 p x : (0 < logGI p x)%N = (p \in primesGI x).
Lemma logGI0 p : logGI p 0 = 0%N.
Lemma pfactor_dvdGI p (n : nat) (x : GI) : primeGI p -> x != 0 -> (p ^+ n %| x) = (n <= logGI p x)%N.
Definition coprimeGI (x y : GI) := 'N(gcdGI x y) == 1%N.
Lemma coprimeGI1 x : coprimeGI x 1.
Lemma coprimeGIE x y : coprimeGI x y = (gcdGI x y %= 1).
Lemma Gauss_dvdGI (x y z : GI) : coprimeGI x y -> (x * y %| z) = (x %| z) && (y %| z).
Lemma coprimeGI_nat m n :
coprime m n -> coprimeGI (m%:R) (n%:R).
Lemma Gauss_dvdGIr (x y z : GI) :
coprimeGI x y -> (x %| y * z) = (x %| z).
Lemma Gauss_dvdGIl (x y z : GI) :
coprimeGI x y -> (x %| z * y) = (x %| z).
Lemma coprimeGI_dvdr x y z : x %| y ->  coprimeGI z y -> coprimeGI z x.
Lemma Gauss_gcdGIr (x y z : GI) :
coprimeGI z x -> gcdGI z (x * y) %= gcdGI z y.
Lemma Gauss_gcdGIl x y z :
coprimeGI z y -> gcdGI z (x * y) %= gcdGI z x.
Lemma coprimeGI_mull (x y z : GI) :
coprimeGI (y * z) x = coprimeGI y x && coprimeGI z x.
Lemma coprimeGI_pexpr k (x y : GI) :
(0 < k)%N -> coprimeGI x (y ^+ k) = coprimeGI x y.
Lemma coprimeGI_expr k x y : coprimeGI x y -> coprimeGI x (y ^+ k).
Lemma primeGI_coprime p x : primeGI p -> coprimeGI p x = ~~ (p %| x).
Lemma pfactor_coprimeGI (p x : GI) :
primeGI p -> x != 0 -> {y | coprimeGI p y & x = y * p ^+ logGI p x}.
Lemma dvdGI_leq_log (x y z : GI) :
z != 0 -> y %| z -> (logGI x y <= logGI x z)%N.
Lemma pfactorGIK p n : primeGI p -> logGI p (p ^+ n) = n.
Lemma pdivGI_pfactor p k : primeGI p -> pdivGI (p ^+ k.+1) %= p.
Lemma logGI_Gauss x y z :
coprimeGI x y -> logGI x (y * z) = logGI x z.
Lemma logGIM x y z :
y != 0 -> z != 0 -> logGI x (y * z) = (logGI x y + logGI x z)%N.
Lemma logGIX p x n : logGI p (x ^+ n) = (n * logGI p x)%N.
Lemma gcdGI_mull_equiv (m n p q : GI) :
coprimeGI m n -> m * n  = p * q -> m %= gcdGI m p * gcdGI m q.