aboutsummaryrefslogtreecommitdiff
path: root/theories/Ints
diff options
context:
space:
mode:
authoraspiwack2007-05-21 16:38:45 +0000
committeraspiwack2007-05-21 16:38:45 +0000
commited5578ecabad14a772c64f53265d168a51777045 (patch)
treeadea9da5a3e692ea51d898671173db6692e7cfed /theories/Ints
parent2c1c506d23118fb56fc07b4e334e0e1c7995e36b (diff)
Added Z and Q implementations with int31.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@9846 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'theories/Ints')
-rw-r--r--theories/Ints/BigN.v4
-rw-r--r--theories/Ints/BigZ.v19
-rw-r--r--theories/Ints/num/QMake.v768
3 files changed, 406 insertions, 385 deletions
diff --git a/theories/Ints/BigN.v b/theories/Ints/BigN.v
index 98e24c63fd..1d2b177dfb 100644
--- a/theories/Ints/BigN.v
+++ b/theories/Ints/BigN.v
@@ -66,8 +66,8 @@ Definition int31_op : znz_op int31.
exact gcd31. (*gcd*)
(* shift operations *)
- exact addmuldiv31. (*add_mul_div with positive ? *)
-(*modulo 2^p (p positive) *)
+ exact addmuldiv31. (*add_mul_div *)
+(*modulo 2^p *)
exact (fun p i =>
match compare31 p 32 with
| Lt => addmuldiv31 p 0 (addmuldiv31 (31-p) i 0)
diff --git a/theories/Ints/BigZ.v b/theories/Ints/BigZ.v
new file mode 100644
index 0000000000..78fe2bced1
--- /dev/null
+++ b/theories/Ints/BigZ.v
@@ -0,0 +1,19 @@
+Require Export BigN.
+Require Import ZMake.
+
+
+Module BigZ := Make BigN.
+
+
+Definition bigZ := BigZ.t.
+
+Delimit Scope bigZ_scope with bigZ.
+Bind Scope bigZ_scope with bigZ.
+Bind Scope bigZ_scope with BigZ.t.
+Bind Scope bigZ_scope with BigZ.t_.
+
+Notation " i + j " := (BigZ.add i j) : bigZ_scope.
+Notation " i - j " := (BigZ.sub i j) : bigZ_scope.
+Notation " i * j " := (BigZ.mul i j) : bigZ_scope.
+Notation " i / j " := (BigZ.div i j) : bigZ_scope.
+Notation " i ?= j " := (BigZ.compare i j) : bigZ_scope.
diff --git a/theories/Ints/num/QMake.v b/theories/Ints/num/QMake.v
index 28f4bd991b..0fd20a1eb1 100644
--- a/theories/Ints/num/QMake.v
+++ b/theories/Ints/num/QMake.v
@@ -1,10 +1,12 @@
Require Import Bool.
Require Import ZArith.
Require Import Arith.
+Require Export BigN.
+Require Export BigZ.
Inductive q_type : Set :=
- | Qz : Z.t -> q_type
- | Qq : Z.t -> N.t -> q_type.
+ | Qz : BigZ.t -> q_type
+ | Qq : BigZ.t -> BigN.t -> q_type.
Definition print_type x :=
match x with
@@ -14,76 +16,76 @@ Definition print_type x :=
Definition print x :=
match x return print_type x with
- | Qz zx => Z.to_Z zx
- | Qq nx dx => (Z.to_Z nx, N.to_Z dx)
+ | Qz zx => BigZ.to_Z zx
+ | Qq nx dx => (BigZ.to_Z nx, BigN.to_Z dx)
end.
Module Qp.
Definition t := q_type.
- Definition zero := Qz Z.zero.
- Definition one := Qz Z.one.
- Definition minus_one := Qz Z.minus_one.
+ Definition zero := Qz BigZ.zero.
+ Definition one := Qz BigZ.one.
+ Definition minus_one := Qz BigZ.minus_one.
- Definition of_Z x := Qz (Z.of_Z x).
+ Definition of_Z x := Qz (BigZ.of_Z x).
- Definition d_to_Z d := Z.Pos (N.succ d).
+ Definition d_to_Z d := BigZ.Pos (BigN.succ d).
Definition compare x y :=
match x, y with
- | Qz zx, Qz zy => Z.compare zx zy
- | Qz zx, Qq ny dy => Z.compare (Z.mul zx (d_to_Z dy)) ny
- | Qq nx dy, Qz zy => Z.compare nx (Z.mul zy (d_to_Z dy))
+ | Qz zx, Qz zy => BigZ.compare zx zy
+ | Qz zx, Qq ny dy => BigZ.compare (BigZ.mul zx (d_to_Z dy)) ny
+ | Qq nx dy, Qz zy => BigZ.compare nx (BigZ.mul zy (d_to_Z dy))
| Qq nx dx, Qq ny dy =>
- Z.compare (Z.mul nx (d_to_Z dy)) (Z.mul ny (d_to_Z dx))
+ BigZ.compare (BigZ.mul nx (d_to_Z dy)) (BigZ.mul ny (d_to_Z dx))
end.
Definition opp x :=
match x with
- | Qz zx => Qz (Z.opp zx)
- | Qq nx dx => Qq (Z.opp nx) dx
+ | Qz zx => Qz (BigZ.opp zx)
+ | Qq nx dx => Qq (BigZ.opp nx) dx
end.
(* Inv d > 0, Pour la forme normal unique on veut d > 1 *)
Definition norm n d :=
- if Z.eq_bool n Z.zero then zero
+ if BigZ.eq_bool n BigZ.zero then zero
else
- let gcd := N.gcd (Z.to_N n) d in
- if N.eq_bool gcd N.one then Qq n (N.pred d)
+ let gcd := BigN.gcd (BigZ.to_N n) d in
+ if BigN.eq_bool gcd BigN.one then Qq n (BigN.pred d)
else
- let n := Z.div n (Z.Pos gcd) in
- let d := N.div d gcd in
- if N.eq_bool d N.one then Qz n
- else Qq n (N.pred d).
+ let n := BigZ.div n (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ if BigN.eq_bool d BigN.one then Qz n
+ else Qq n (BigN.pred d).
Definition add x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.add zx zy)
- | Qz zx, Qq ny dy => Qq (Z.add (Z.mul zx (d_to_Z dy)) ny) dy
- | Qq nx dx, Qz zy => Qq (Z.add nx (Z.mul zy (d_to_Z dx))) dx
+ | Qz zx, Qz zy => Qz (BigZ.add zx zy)
+ | Qz zx, Qq ny dy => Qq (BigZ.add (BigZ.mul zx (d_to_Z dy)) ny) dy
+ | Qq nx dx, Qz zy => Qq (BigZ.add nx (BigZ.mul zy (d_to_Z dx))) dx
| Qq nx dx, Qq ny dy =>
- let dx' := N.succ dx in
- let dy' := N.succ dy in
- let n := Z.add (Z.mul nx (Z.Pos dy')) (Z.mul ny (Z.Pos dx')) in
- let d := N.pred (N.mul dx' dy') in
+ let dx' := BigN.succ dx in
+ let dy' := BigN.succ dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy')) (BigZ.mul ny (BigZ.Pos dx')) in
+ let d := BigN.pred (BigN.mul dx' dy') in
Qq n d
end.
Definition add_norm x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.add zx zy)
+ | Qz zx, Qz zy => Qz (BigZ.add zx zy)
| Qz zx, Qq ny dy =>
- let d := N.succ dy in
- norm (Z.add (Z.mul zx (Z.Pos d)) ny) d
+ let d := BigN.succ dy in
+ norm (BigZ.add (BigZ.mul zx (BigZ.Pos d)) ny) d
| Qq nx dx, Qz zy =>
- let d := N.succ dx in
- norm (Z.add (Z.mul zy (Z.Pos d)) nx) d
+ let d := BigN.succ dx in
+ norm (BigZ.add (BigZ.mul zy (BigZ.Pos d)) nx) d
| Qq nx dx, Qq ny dy =>
- let dx' := N.succ dx in
- let dy' := N.succ dy in
- let n := Z.add (Z.mul nx (Z.Pos dy')) (Z.mul ny (Z.Pos dx')) in
- let d := N.mul dx' dy' in
+ let dx' := BigN.succ dx in
+ let dy' := BigN.succ dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy')) (BigZ.mul ny (BigZ.Pos dx')) in
+ let d := BigN.mul dx' dy' in
norm n d
end.
@@ -93,81 +95,81 @@ Module Qp.
Definition mul x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
- | Qz zx, Qq ny dy => Qq (Z.mul zx ny) dy
- | Qq nx dx, Qz zy => Qq (Z.mul nx zy) dx
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
+ | Qz zx, Qq ny dy => Qq (BigZ.mul zx ny) dy
+ | Qq nx dx, Qz zy => Qq (BigZ.mul nx zy) dx
| Qq nx dx, Qq ny dy =>
- Qq (Z.mul nx ny) (N.pred (N.mul (N.succ dx) (N.succ dy)))
+ Qq (BigZ.mul nx ny) (BigN.pred (BigN.mul (BigN.succ dx) (BigN.succ dy)))
end.
Definition mul_norm x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
| Qz zx, Qq ny dy =>
- if Z.eq_bool zx Z.zero then zero
+ if BigZ.eq_bool zx BigZ.zero then zero
else
- let d := N.succ dy in
- let gcd := N.gcd (Z.to_N zx) d in
- if N.eq_bool gcd N.one then Qq (Z.mul zx ny) dy
+ let d := BigN.succ dy in
+ let gcd := BigN.gcd (BigZ.to_N zx) d in
+ if BigN.eq_bool gcd BigN.one then Qq (BigZ.mul zx ny) dy
else
- let zx := Z.div zx (Z.Pos gcd) in
- let d := N.div d gcd in
- if N.eq_bool d N.one then Qz (Z.mul zx ny)
- else Qq (Z.mul zx ny) (N.pred d)
+ let zx := BigZ.div zx (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ if BigN.eq_bool d BigN.one then Qz (BigZ.mul zx ny)
+ else Qq (BigZ.mul zx ny) (BigN.pred d)
| Qq nx dx, Qz zy =>
- if Z.eq_bool zy Z.zero then zero
+ if BigZ.eq_bool zy BigZ.zero then zero
else
- let d := N.succ dx in
- let gcd := N.gcd (Z.to_N zy) d in
- if N.eq_bool gcd N.one then Qq (Z.mul zy nx) dx
+ let d := BigN.succ dx in
+ let gcd := BigN.gcd (BigZ.to_N zy) d in
+ if BigN.eq_bool gcd BigN.one then Qq (BigZ.mul zy nx) dx
else
- let zy := Z.div zy (Z.Pos gcd) in
- let d := N.div d gcd in
- if N.eq_bool d N.one then Qz (Z.mul zy nx)
- else Qq (Z.mul zy nx) (N.pred d)
+ let zy := BigZ.div zy (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ if BigN.eq_bool d BigN.one then Qz (BigZ.mul zy nx)
+ else Qq (BigZ.mul zy nx) (BigN.pred d)
| Qq nx dx, Qq ny dy =>
- norm (Z.mul nx ny) (N.mul (N.succ dx) (N.succ dy))
+ norm (BigZ.mul nx ny) (BigN.mul (BigN.succ dx) (BigN.succ dy))
end.
Definition inv x :=
match x with
- | Qz (Z.Pos n) =>
- if N.eq_bool n N.zero then zero else Qq Z.one (N.pred n)
- | Qz (Z.Neg n) =>
- if N.eq_bool n N.zero then zero else Qq Z.minus_one (N.pred n)
- | Qq (Z.Pos n) d =>
- if N.eq_bool n N.zero then zero else Qq (Z.Pos (N.succ d)) (N.pred n)
- | Qq (Z.Neg n) d =>
- if N.eq_bool n N.zero then zero else Qq (Z.Neg (N.succ d)) (N.pred n)
+ | Qz (BigZ.Pos n) =>
+ if BigN.eq_bool n BigN.zero then zero else Qq BigZ.one (BigN.pred n)
+ | Qz (BigZ.Neg n) =>
+ if BigN.eq_bool n BigN.zero then zero else Qq BigZ.minus_one (BigN.pred n)
+ | Qq (BigZ.Pos n) d =>
+ if BigN.eq_bool n BigN.zero then zero else Qq (BigZ.Pos (BigN.succ d)) (BigN.pred n)
+ | Qq (BigZ.Neg n) d =>
+ if BigN.eq_bool n BigN.zero then zero else Qq (BigZ.Neg (BigN.succ d)) (BigN.pred n)
end.
Definition inv_norm x :=
match x with
- | Qz (Z.Pos n) =>
- if N.eq_bool n N.zero then zero else
- if N.eq_bool n N.one then x else Qq Z.one (N.pred n)
- | Qz (Z.Neg n) =>
- if N.eq_bool n N.zero then zero else
- if N.eq_bool n N.one then x else Qq Z.minus_one n
- | Qq (Z.Pos n) d => let d := N.succ d in
- if N.eq_bool n N.one then Qz (Z.Pos d)
- else Qq (Z.Pos d) (N.pred n)
- | Qq (Z.Neg n) d => let d := N.succ d in
- if N.eq_bool n N.one then Qz (Z.Neg d)
- else Qq (Z.Pos d) (N.pred n)
+ | Qz (BigZ.Pos n) =>
+ if BigN.eq_bool n BigN.zero then zero else
+ if BigN.eq_bool n BigN.one then x else Qq BigZ.one (BigN.pred n)
+ | Qz (BigZ.Neg n) =>
+ if BigN.eq_bool n BigN.zero then zero else
+ if BigN.eq_bool n BigN.one then x else Qq BigZ.minus_one n
+ | Qq (BigZ.Pos n) d => let d := BigN.succ d in
+ if BigN.eq_bool n BigN.one then Qz (BigZ.Pos d)
+ else Qq (BigZ.Pos d) (BigN.pred n)
+ | Qq (BigZ.Neg n) d => let d := BigN.succ d in
+ if BigN.eq_bool n BigN.one then Qz (BigZ.Neg d)
+ else Qq (BigZ.Pos d) (BigN.pred n)
end.
Definition square x :=
match x with
- | Qz zx => Qz (Z.square zx)
- | Qq nx dx => Qq (Z.square nx) (N.pred (N.square (N.succ dx)))
+ | Qz zx => Qz (BigZ.square zx)
+ | Qq nx dx => Qq (BigZ.square nx) (BigN.pred (BigN.square (BigN.succ dx)))
end.
Definition power_pos x p :=
match x with
- | Qz zx => Qz (Z.power_pos zx p)
- | Qq nx dx => Qq (Z.power_pos nx p) (N.pred (N.power_pos (N.succ dx) p))
+ | Qz zx => Qz (BigZ.power_pos zx p)
+ | Qq nx dx => Qq (BigZ.power_pos nx p) (BigN.pred (BigN.power_pos (BigN.succ dx) p))
end.
End Qp.
@@ -180,16 +182,16 @@ Module Qv.
Definition t := q_type.
- Definition zero := Qz Z.zero.
- Definition one := Qz Z.one.
- Definition minus_one := Qz Z.minus_one.
+ Definition zero := Qz BigZ.zero.
+ Definition one := Qz BigZ.one.
+ Definition minus_one := Qz BigZ.minus_one.
- Definition of_Z x := Qz (Z.of_Z x).
+ Definition of_Z x := Qz (BigZ.of_Z x).
Definition is_valid x :=
match x with
| Qz _ => True
- | Qq n d => if N.eq_bool d N.zero then False else True
+ | Qq n d => if BigN.eq_bool d BigN.zero then False else True
end.
(* Les fonctions doivent assurer que si leur arguments sont valides alors
le resultat est correct et valide (si c'est un Q)
@@ -197,50 +199,50 @@ Module Qv.
Definition compare x y :=
match x, y with
- | Qz zx, Qz zy => Z.compare zx zy
- | Qz zx, Qq ny dy => Z.compare (Z.mul zx (Z.Pos dy)) ny
- | Qq nx dx, Qz zy => Z.compare Z.zero zy
- | Qq nx dx, Qq ny dy => Z.compare (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx))
+ | Qz zx, Qz zy => BigZ.compare zx zy
+ | Qz zx, Qq ny dy => BigZ.compare (BigZ.mul zx (BigZ.Pos dy)) ny
+ | Qq nx dx, Qz zy => BigZ.compare BigZ.zero zy
+ | Qq nx dx, Qq ny dy => BigZ.compare (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx))
end.
Definition opp x :=
match x with
- | Qz zx => Qz (Z.opp zx)
- | Qq nx dx => Qq (Z.opp nx) dx
+ | Qz zx => Qz (BigZ.opp zx)
+ | Qq nx dx => Qq (BigZ.opp nx) dx
end.
Definition norm n d :=
- if Z.eq_bool n Z.zero then zero
+ if BigZ.eq_bool n BigZ.zero then zero
else
- let gcd := N.gcd (Z.to_N n) d in
- if N.eq_bool gcd N.one then Qq n d
+ let gcd := BigN.gcd (BigZ.to_N n) d in
+ if BigN.eq_bool gcd BigN.one then Qq n d
else
- let n := Z.div n (Z.Pos gcd) in
- let d := N.div d gcd in
- if N.eq_bool d N.one then Qz n
+ let n := BigZ.div n (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ if BigN.eq_bool d BigN.one then Qz n
else Qq n d.
Definition add x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.add zx zy)
- | Qz zx, Qq ny dy => Qq (Z.add (Z.mul zx (Z.Pos dy)) ny) dy
- | Qq nx dx, Qz zy => Qq (Z.add nx (Z.mul zy (Z.Pos dx))) dx
+ | Qz zx, Qz zy => Qz (BigZ.add zx zy)
+ | Qz zx, Qq ny dy => Qq (BigZ.add (BigZ.mul zx (BigZ.Pos dy)) ny) dy
+ | Qq nx dx, Qz zy => Qq (BigZ.add nx (BigZ.mul zy (BigZ.Pos dx))) dx
| Qq nx dx, Qq ny dy =>
- let n := Z.add (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx)) in
- let d := N.mul dx dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx)) in
+ let d := BigN.mul dx dy in
Qq n d
end.
Definition add_norm x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.add zx zy)
+ | Qz zx, Qz zy => Qz (BigZ.add zx zy)
| Qz zx, Qq ny dy =>
- norm (Z.add (Z.mul zx (Z.Pos dy)) ny) dy
+ norm (BigZ.add (BigZ.mul zx (BigZ.Pos dy)) ny) dy
| Qq nx dx, Qz zy =>
- norm (Z.add (Z.mul zy (Z.Pos dx)) nx) dx
+ norm (BigZ.add (BigZ.mul zy (BigZ.Pos dx)) nx) dx
| Qq nx dx, Qq ny dy =>
- let n := Z.add (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx)) in
- let d := N.mul dx dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx)) in
+ let d := BigN.mul dx dy in
norm n d
end.
@@ -250,61 +252,61 @@ Module Qv.
Definition mul x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
- | Qz zx, Qq ny dy => Qq (Z.mul zx ny) dy
- | Qq nx dx, Qz zy => Qq (Z.mul nx zy) dx
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
+ | Qz zx, Qq ny dy => Qq (BigZ.mul zx ny) dy
+ | Qq nx dx, Qz zy => Qq (BigZ.mul nx zy) dx
| Qq nx dx, Qq ny dy =>
- Qq (Z.mul nx ny) (N.mul dx dy)
+ Qq (BigZ.mul nx ny) (BigN.mul dx dy)
end.
Definition mul_norm x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
| Qz zx, Qq ny dy =>
- if Z.eq_bool zx Z.zero then zero
+ if BigZ.eq_bool zx BigZ.zero then zero
else
- let gcd := N.gcd (Z.to_N zx) dy in
- if N.eq_bool gcd N.one then Qq (Z.mul zx ny) dy
+ let gcd := BigN.gcd (BigZ.to_N zx) dy in
+ if BigN.eq_bool gcd BigN.one then Qq (BigZ.mul zx ny) dy
else
- let zx := Z.div zx (Z.Pos gcd) in
- let d := N.div dy gcd in
- if N.eq_bool d N.one then Qz (Z.mul zx ny)
- else Qq (Z.mul zx ny) d
+ let zx := BigZ.div zx (BigZ.Pos gcd) in
+ let d := BigN.div dy gcd in
+ if BigN.eq_bool d BigN.one then Qz (BigZ.mul zx ny)
+ else Qq (BigZ.mul zx ny) d
| Qq nx dx, Qz zy =>
- if Z.eq_bool zy Z.zero then zero
+ if BigZ.eq_bool zy BigZ.zero then zero
else
- let gcd := N.gcd (Z.to_N zy) dx in
- if N.eq_bool gcd N.one then Qq (Z.mul zy nx) dx
+ let gcd := BigN.gcd (BigZ.to_N zy) dx in
+ if BigN.eq_bool gcd BigN.one then Qq (BigZ.mul zy nx) dx
else
- let zy := Z.div zy (Z.Pos gcd) in
- let d := N.div dx gcd in
- if N.eq_bool d N.one then Qz (Z.mul zy nx)
- else Qq (Z.mul zy nx) d
- | Qq nx dx, Qq ny dy => norm (Z.mul nx ny) (N.mul dx dy)
+ let zy := BigZ.div zy (BigZ.Pos gcd) in
+ let d := BigN.div dx gcd in
+ if BigN.eq_bool d BigN.one then Qz (BigZ.mul zy nx)
+ else Qq (BigZ.mul zy nx) d
+ | Qq nx dx, Qq ny dy => norm (BigZ.mul nx ny) (BigN.mul dx dy)
end.
Definition inv x :=
match x with
- | Qz (Z.Pos n) =>
- if N.eq_bool n N.zero then zero else Qq Z.one n
- | Qz (Z.Neg n) =>
- if N.eq_bool n N.zero then zero else Qq Z.minus_one n
- | Qq (Z.Pos n) d =>
- if N.eq_bool n N.zero then zero else Qq (Z.Pos d) n
- | Qq (Z.Neg n) d =>
- if N.eq_bool n N.zero then zero else Qq (Z.Neg d) n
+ | Qz (BigZ.Pos n) =>
+ if BigN.eq_bool n BigN.zero then zero else Qq BigZ.one n
+ | Qz (BigZ.Neg n) =>
+ if BigN.eq_bool n BigN.zero then zero else Qq BigZ.minus_one n
+ | Qq (BigZ.Pos n) d =>
+ if BigN.eq_bool n BigN.zero then zero else Qq (BigZ.Pos d) n
+ | Qq (BigZ.Neg n) d =>
+ if BigN.eq_bool n BigN.zero then zero else Qq (BigZ.Neg d) n
end.
Definition square x :=
match x with
- | Qz zx => Qz (Z.square zx)
- | Qq nx dx => Qq (Z.square nx) (N.square dx)
+ | Qz zx => Qz (BigZ.square zx)
+ | Qq nx dx => Qq (BigZ.square nx) (BigN.square dx)
end.
Definition power_pos x p :=
match x with
- | Qz zx => Qz (Z.power_pos zx p)
- | Qq nx dx => Qq (Z.power_pos nx p) (N.power_pos dx p)
+ | Qz zx => Qz (BigZ.power_pos zx p)
+ | Qq nx dx => Qq (BigZ.power_pos nx p) (BigN.power_pos dx p)
end.
End Qv.
@@ -319,44 +321,44 @@ Module Q.
Definition t := q_type.
- Definition zero := Qz Z.zero.
- Definition one := Qz Z.one.
- Definition minus_one := Qz Z.minus_one.
+ Definition zero := Qz BigZ.zero.
+ Definition one := Qz BigZ.one.
+ Definition minus_one := Qz BigZ.minus_one.
- Definition of_Z x := Qz (Z.of_Z x).
+ Definition of_Z x := Qz (BigZ.of_Z x).
Definition compare x y :=
match x, y with
- | Qz zx, Qz zy => Z.compare zx zy
+ | Qz zx, Qz zy => BigZ.compare zx zy
| Qz zx, Qq ny dy =>
- if N.eq_bool dy N.zero then Z.compare zx Z.zero
- else Z.compare (Z.mul zx (Z.Pos dy)) ny
+ if BigN.eq_bool dy BigN.zero then BigZ.compare zx BigZ.zero
+ else BigZ.compare (BigZ.mul zx (BigZ.Pos dy)) ny
| Qq nx dx, Qz zy =>
- if N.eq_bool dx N.zero then Z.compare Z.zero zy
- else Z.compare nx (Z.mul zy (Z.Pos dx))
+ if BigN.eq_bool dx BigN.zero then BigZ.compare BigZ.zero zy
+ else BigZ.compare nx (BigZ.mul zy (BigZ.Pos dx))
| Qq nx dx, Qq ny dy =>
- match N.eq_bool dx N.zero, N.eq_bool dy N.zero with
+ match BigN.eq_bool dx BigN.zero, BigN.eq_bool dy BigN.zero with
| true, true => Eq
- | true, false => Z.compare Z.zero ny
- | false, true => Z.compare nx Z.zero
- | false, false => Z.compare (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx))
+ | true, false => BigZ.compare BigZ.zero ny
+ | false, true => BigZ.compare nx BigZ.zero
+ | false, false => BigZ.compare (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx))
end
end.
Definition opp x :=
match x with
- | Qz zx => Qz (Z.opp zx)
- | Qq nx dx => Qq (Z.opp nx) dx
+ | Qz zx => Qz (BigZ.opp zx)
+ | Qq nx dx => Qq (BigZ.opp nx) dx
end.
(* Je pense que cette fonction normalise bien ... *)
Definition norm n d :=
- let gcd := N.gcd (Z.to_N n) d in
- match N.compare N.one gcd with
+ let gcd := BigN.gcd (BigZ.to_N n) d in
+ match BigN.compare BigN.one gcd with
| Lt =>
- let n := Z.div n (Z.Pos gcd) in
- let d := N.div d gcd in
- match N.compare d N.one with
+ let n := BigZ.div n (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ match BigN.compare d BigN.one with
| Gt => Qq n d
| Eq => Qz n
| Lt => zero
@@ -369,20 +371,20 @@ Module Q.
match x with
| Qz zx =>
match y with
- | Qz zy => Qz (Z.add zx zy)
+ | Qz zy => Qz (BigZ.add zx zy)
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
- else Qq (Z.add (Z.mul zx (Z.Pos dy)) ny) dy
+ if BigN.eq_bool dy BigN.zero then x
+ else Qq (BigZ.add (BigZ.mul zx (BigZ.Pos dy)) ny) dy
end
| Qq nx dx =>
- if N.eq_bool dx N.zero then y
+ if BigN.eq_bool dx BigN.zero then y
else match y with
- | Qz zy => Qq (Z.add nx (Z.mul zy (Z.Pos dx))) dx
+ | Qz zy => Qq (BigZ.add nx (BigZ.mul zy (BigZ.Pos dx))) dx
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
+ if BigN.eq_bool dy BigN.zero then x
else
- let n := Z.add (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx)) in
- let d := N.mul dx dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx)) in
+ let d := BigN.mul dx dy in
Qq n d
end
end.
@@ -391,20 +393,20 @@ Module Q.
match x with
| Qz zx =>
match y with
- | Qz zy => Qz (Z.add zx zy)
+ | Qz zy => Qz (BigZ.add zx zy)
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
- else norm (Z.add (Z.mul zx (Z.Pos dy)) ny) dy
+ if BigN.eq_bool dy BigN.zero then x
+ else norm (BigZ.add (BigZ.mul zx (BigZ.Pos dy)) ny) dy
end
| Qq nx dx =>
- if N.eq_bool dx N.zero then y
+ if BigN.eq_bool dx BigN.zero then y
else match y with
- | Qz zy => norm (Z.add nx (Z.mul zy (Z.Pos dx))) dx
+ | Qz zy => norm (BigZ.add nx (BigZ.mul zy (BigZ.Pos dx))) dx
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
+ if BigN.eq_bool dy BigN.zero then x
else
- let n := Z.add (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx)) in
- let d := N.mul dx dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx)) in
+ let d := BigN.mul dx dy in
norm n d
end
end.
@@ -415,85 +417,85 @@ Module Q.
Definition mul x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
- | Qz zx, Qq ny dy => Qq (Z.mul zx ny) dy
- | Qq nx dx, Qz zy => Qq (Z.mul nx zy) dx
- | Qq nx dx, Qq ny dy => Qq (Z.mul nx ny) (N.mul dx dy)
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
+ | Qz zx, Qq ny dy => Qq (BigZ.mul zx ny) dy
+ | Qq nx dx, Qz zy => Qq (BigZ.mul nx zy) dx
+ | Qq nx dx, Qq ny dy => Qq (BigZ.mul nx ny) (BigN.mul dx dy)
end.
Definition mul_norm x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
| Qz zx, Qq ny dy =>
- if Z.eq_bool zx Z.zero then zero
+ if BigZ.eq_bool zx BigZ.zero then zero
else
- let d := N.succ dy in
- let gcd := N.gcd (Z.to_N zx) d in
- if N.eq_bool gcd N.one then Qq (Z.mul zx ny) dy
+ let d := BigN.succ dy in
+ let gcd := BigN.gcd (BigZ.to_N zx) d in
+ if BigN.eq_bool gcd BigN.one then Qq (BigZ.mul zx ny) dy
else
- let zx := Z.div zx (Z.Pos gcd) in
- let d := N.div d gcd in
- if N.eq_bool d N.one then Qz (Z.mul zx ny)
- else Qq (Z.mul zx ny) (N.pred d)
+ let zx := BigZ.div zx (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ if BigN.eq_bool d BigN.one then Qz (BigZ.mul zx ny)
+ else Qq (BigZ.mul zx ny) (BigN.pred d)
| Qq nx dx, Qz zy =>
- if Z.eq_bool zy Z.zero then zero
+ if BigZ.eq_bool zy BigZ.zero then zero
else
- let d := N.succ dx in
- let gcd := N.gcd (Z.to_N zy) d in
- if N.eq_bool gcd N.one then Qq (Z.mul zy nx) dx
+ let d := BigN.succ dx in
+ let gcd := BigN.gcd (BigZ.to_N zy) d in
+ if BigN.eq_bool gcd BigN.one then Qq (BigZ.mul zy nx) dx
else
- let zy := Z.div zy (Z.Pos gcd) in
- let d := N.div d gcd in
- if N.eq_bool d N.one then Qz (Z.mul zy nx)
- else Qq (Z.mul zy nx) (N.pred d)
+ let zy := BigZ.div zy (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ if BigN.eq_bool d BigN.one then Qz (BigZ.mul zy nx)
+ else Qq (BigZ.mul zy nx) (BigN.pred d)
| Qq nx dx, Qq ny dy =>
- let dx := N.succ dx in
- let dy := N.succ dy in
+ let dx := BigN.succ dx in
+ let dy := BigN.succ dy in
let (nx, dy) :=
- let gcd := N.gcd (Z.to_N nx) dy in
- if N.eq_bool gcd N.one then (nx, dy)
- else (Z.div nx (Z.Pos gcd), N.div dy gcd) in
+ let gcd := BigN.gcd (BigZ.to_N nx) dy in
+ if BigN.eq_bool gcd BigN.one then (nx, dy)
+ else (BigZ.div nx (BigZ.Pos gcd), BigN.div dy gcd) in
let (ny, dx) :=
- let gcd := N.gcd (Z.to_N ny) dx in
- if N.eq_bool gcd N.one then (ny, dx)
- else (Z.div ny (Z.Pos gcd), N.div dx gcd) in
- let d := (N.mul dx dy) in
- if N.eq_bool d N.one then Qz (Z.mul ny nx)
- else Qq (Z.mul ny nx) (N.pred d)
+ let gcd := BigN.gcd (BigZ.to_N ny) dx in
+ if BigN.eq_bool gcd BigN.one then (ny, dx)
+ else (BigZ.div ny (BigZ.Pos gcd), BigN.div dx gcd) in
+ let d := (BigN.mul dx dy) in
+ if BigN.eq_bool d BigN.one then Qz (BigZ.mul ny nx)
+ else Qq (BigZ.mul ny nx) (BigN.pred d)
end.
Definition inv x :=
match x with
- | Qz (Z.Pos n) => Qq Z.one (N.pred n)
- | Qz (Z.Neg n) => Qq Z.minus_one (N.pred n)
- | Qq (Z.Pos n) d => Qq (Z.Pos (N.succ d)) (N.pred n)
- | Qq (Z.Neg n) d => Qq (Z.Neg (N.succ d)) (N.pred n)
+ | Qz (BigZ.Pos n) => Qq BigZ.one (BigN.pred n)
+ | Qz (BigZ.Neg n) => Qq BigZ.minus_one (BigN.pred n)
+ | Qq (BigZ.Pos n) d => Qq (BigZ.Pos (BigN.succ d)) (BigN.pred n)
+ | Qq (BigZ.Neg n) d => Qq (BigZ.Neg (BigN.succ d)) (BigN.pred n)
end.
Definition inv_norm x :=
match x with
- | Qz (Z.Pos n) => if N.eq_bool n N.one then x else Qq Z.one (N.pred n)
- | Qz (Z.Neg n) => if N.eq_bool n N.one then x else Qq Z.minus_one n
- | Qq (Z.Pos n) d => let d := N.succ d in
- if N.eq_bool n N.one then Qz (Z.Pos d)
- else Qq (Z.Pos d) (N.pred n)
- | Qq (Z.Neg n) d => let d := N.succ d in
- if N.eq_bool n N.one then Qz (Z.Neg d)
- else Qq (Z.Pos d) (N.pred n)
+ | Qz (BigZ.Pos n) => if BigN.eq_bool n BigN.one then x else Qq BigZ.one (BigN.pred n)
+ | Qz (BigZ.Neg n) => if BigN.eq_bool n BigN.one then x else Qq BigZ.minus_one n
+ | Qq (BigZ.Pos n) d => let d := BigN.succ d in
+ if BigN.eq_bool n BigN.one then Qz (BigZ.Pos d)
+ else Qq (BigZ.Pos d) (BigN.pred n)
+ | Qq (BigZ.Neg n) d => let d := BigN.succ d in
+ if BigN.eq_bool n BigN.one then Qz (BigZ.Neg d)
+ else Qq (BigZ.Pos d) (BigN.pred n)
end.
Definition square x :=
match x with
- | Qz zx => Qz (Z.square zx)
- | Qq nx dx => Qq (Z.square nx) (N.square dx)
+ | Qz zx => Qz (BigZ.square zx)
+ | Qq nx dx => Qq (BigZ.square nx) (BigN.square dx)
end.
Definition power_pos x p :=
match x with
- | Qz zx => Qz (Z.power_pos zx p)
- | Qq nx dx => Qq (Z.power_pos nx p) (N.power_pos dx p)
+ | Qz zx => Qz (BigZ.power_pos zx p)
+ | Qq nx dx => Qq (BigZ.power_pos nx p) (BigN.power_pos dx p)
end.
End Q.
@@ -511,71 +513,71 @@ Module Qif.
Definition t := q_type.
- Definition zero := Qz Z.zero.
- Definition one := Qz Z.one.
- Definition minus_one := Qz Z.minus_one.
+ Definition zero := Qz BigZ.zero.
+ Definition one := Qz BigZ.one.
+ Definition minus_one := Qz BigZ.minus_one.
- Definition of_Z x := Qz (Z.of_Z x).
+ Definition of_Z x := Qz (BigZ.of_Z x).
Definition compare x y :=
match x, y with
- | Qz zx, Qz zy => Z.compare zx zy
+ | Qz zx, Qz zy => BigZ.compare zx zy
| Qz zx, Qq ny dy =>
- if N.eq_bool dy N.zero then Z.compare zx Z.zero
- else Z.compare (Z.mul zx (Z.Pos dy)) ny
+ if BigN.eq_bool dy BigN.zero then BigZ.compare zx BigZ.zero
+ else BigZ.compare (BigZ.mul zx (BigZ.Pos dy)) ny
| Qq nx dx, Qz zy =>
- if N.eq_bool dx N.zero then Z.compare Z.zero zy
- else Z.compare nx (Z.mul zy (Z.Pos dx))
+ if BigN.eq_bool dx BigN.zero then BigZ.compare BigZ.zero zy
+ else BigZ.compare nx (BigZ.mul zy (BigZ.Pos dx))
| Qq nx dx, Qq ny dy =>
- match N.eq_bool dx N.zero, N.eq_bool dy N.zero with
+ match BigN.eq_bool dx BigN.zero, BigN.eq_bool dy BigN.zero with
| true, true => Eq
- | true, false => Z.compare Z.zero ny
- | false, true => Z.compare nx Z.zero
- | false, false => Z.compare (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx))
+ | true, false => BigZ.compare BigZ.zero ny
+ | false, true => BigZ.compare nx BigZ.zero
+ | false, false => BigZ.compare (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx))
end
end.
Definition opp x :=
match x with
- | Qz zx => Qz (Z.opp zx)
- | Qq nx dx => Qq (Z.opp nx) dx
+ | Qz zx => Qz (BigZ.opp zx)
+ | Qq nx dx => Qq (BigZ.opp nx) dx
end.
Definition do_norm_n n :=
match n with
- | N.N0 _ => false
- | N.N1 _ => false
- | N.N2 _ => false
- | N.N3 _ => false
- | N.N4 _ => false
- | N.N5 _ => false
- | N.N6 _ => false
- | N.N7 _ => false
- | N.N8 _ => false
- | N.N9 _ => true
- | N.N10 _ => true
- | N.N11 _ => true
- | N.N12 _ => true
- | N.Nn n _ => true
+ | BigN.N0 _ => false
+ | BigN.N1 _ => false
+ | BigN.N2 _ => false
+ | BigN.N3 _ => false
+ | BigN.N4 _ => false
+ | BigN.N5 _ => false
+ | BigN.N6 _ => false
+ | BigN.N7 _ => false
+ | BigN.N8 _ => false
+ | BigN.N9 _ => true
+ | BigN.N10 _ => true
+ | BigN.N11 _ => true
+ | BigN.N12 _ => true
+ | BigN.Nn n _ => true
end.
Definition do_norm_z z :=
match z with
- | Z.Pos n => do_norm_n n
- | Z.Neg n => do_norm_n n
+ | BigZ.Pos n => do_norm_n n
+ | BigZ.Neg n => do_norm_n n
end.
Require Import Bool.
(* Je pense que cette fonction normalise bien ... *)
Definition norm n d :=
if andb (do_norm_z n) (do_norm_n d) then
- let gcd := N.gcd (Z.to_N n) d in
- match N.compare N.one gcd with
+ let gcd := BigN.gcd (BigZ.to_N n) d in
+ match BigN.compare BigN.one gcd with
| Lt =>
- let n := Z.div n (Z.Pos gcd) in
- let d := N.div d gcd in
- match N.compare d N.one with
+ let n := BigZ.div n (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ match BigN.compare d BigN.one with
| Gt => Qq n d
| Eq => Qz n
| Lt => zero
@@ -591,20 +593,20 @@ Require Import Bool.
match x with
| Qz zx =>
match y with
- | Qz zy => Qz (Z.add zx zy)
+ | Qz zy => Qz (BigZ.add zx zy)
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
- else Qq (Z.add (Z.mul zx (Z.Pos dy)) ny) dy
+ if BigN.eq_bool dy BigN.zero then x
+ else Qq (BigZ.add (BigZ.mul zx (BigZ.Pos dy)) ny) dy
end
| Qq nx dx =>
- if N.eq_bool dx N.zero then y
+ if BigN.eq_bool dx BigN.zero then y
else match y with
- | Qz zy => Qq (Z.add nx (Z.mul zy (Z.Pos dx))) dx
+ | Qz zy => Qq (BigZ.add nx (BigZ.mul zy (BigZ.Pos dx))) dx
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
+ if BigN.eq_bool dy BigN.zero then x
else
- let n := Z.add (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx)) in
- let d := N.mul dx dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx)) in
+ let d := BigN.mul dx dy in
Qq n d
end
end.
@@ -613,20 +615,20 @@ Require Import Bool.
match x with
| Qz zx =>
match y with
- | Qz zy => Qz (Z.add zx zy)
+ | Qz zy => Qz (BigZ.add zx zy)
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
- else norm (Z.add (Z.mul zx (Z.Pos dy)) ny) dy
+ if BigN.eq_bool dy BigN.zero then x
+ else norm (BigZ.add (BigZ.mul zx (BigZ.Pos dy)) ny) dy
end
| Qq nx dx =>
- if N.eq_bool dx N.zero then y
+ if BigN.eq_bool dx BigN.zero then y
else match y with
- | Qz zy => norm (Z.add nx (Z.mul zy (Z.Pos dx))) dx
+ | Qz zy => norm (BigZ.add nx (BigZ.mul zy (BigZ.Pos dx))) dx
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
+ if BigN.eq_bool dy BigN.zero then x
else
- let n := Z.add (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx)) in
- let d := N.mul dx dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx)) in
+ let d := BigN.mul dx dy in
norm n d
end
end.
@@ -637,50 +639,50 @@ Require Import Bool.
Definition mul x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
- | Qz zx, Qq ny dy => Qq (Z.mul zx ny) dy
- | Qq nx dx, Qz zy => Qq (Z.mul nx zy) dx
- | Qq nx dx, Qq ny dy => Qq (Z.mul nx ny) (N.mul dx dy)
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
+ | Qz zx, Qq ny dy => Qq (BigZ.mul zx ny) dy
+ | Qq nx dx, Qz zy => Qq (BigZ.mul nx zy) dx
+ | Qq nx dx, Qq ny dy => Qq (BigZ.mul nx ny) (BigN.mul dx dy)
end.
Definition mul_norm x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
- | Qz zx, Qq ny dy => norm (Z.mul zx ny) dy
- | Qq nx dx, Qz zy => norm (Z.mul nx zy) dx
- | Qq nx dx, Qq ny dy => norm (Z.mul nx ny) (N.mul dx dy)
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
+ | Qz zx, Qq ny dy => norm (BigZ.mul zx ny) dy
+ | Qq nx dx, Qz zy => norm (BigZ.mul nx zy) dx
+ | Qq nx dx, Qq ny dy => norm (BigZ.mul nx ny) (BigN.mul dx dy)
end.
Definition inv x :=
match x with
- | Qz (Z.Pos n) => Qq Z.one n
- | Qz (Z.Neg n) => Qq Z.minus_one n
- | Qq (Z.Pos n) d => Qq (Z.Pos d) n
- | Qq (Z.Neg n) d => Qq (Z.Neg d) n
+ | Qz (BigZ.Pos n) => Qq BigZ.one n
+ | Qz (BigZ.Neg n) => Qq BigZ.minus_one n
+ | Qq (BigZ.Pos n) d => Qq (BigZ.Pos d) n
+ | Qq (BigZ.Neg n) d => Qq (BigZ.Neg d) n
end.
Definition inv_norm x :=
match x with
- | Qz (Z.Pos n) =>
- if N.eq_bool n N.zero then zero else Qq Z.one n
- | Qz (Z.Neg n) =>
- if N.eq_bool n N.zero then zero else Qq Z.minus_one n
- | Qq (Z.Pos n) d =>
- if N.eq_bool n N.zero then zero else Qq (Z.Pos d) n
- | Qq (Z.Neg n) d =>
- if N.eq_bool n N.zero then zero else Qq (Z.Neg d) n
+ | Qz (BigZ.Pos n) =>
+ if BigN.eq_bool n BigN.zero then zero else Qq BigZ.one n
+ | Qz (BigZ.Neg n) =>
+ if BigN.eq_bool n BigN.zero then zero else Qq BigZ.minus_one n
+ | Qq (BigZ.Pos n) d =>
+ if BigN.eq_bool n BigN.zero then zero else Qq (BigZ.Pos d) n
+ | Qq (BigZ.Neg n) d =>
+ if BigN.eq_bool n BigN.zero then zero else Qq (BigZ.Neg d) n
end.
Definition square x :=
match x with
- | Qz zx => Qz (Z.square zx)
- | Qq nx dx => Qq (Z.square nx) (N.square dx)
+ | Qz zx => Qz (BigZ.square zx)
+ | Qq nx dx => Qq (BigZ.square nx) (BigN.square dx)
end.
Definition power_pos x p :=
match x with
- | Qz zx => Qz (Z.power_pos zx p)
- | Qq nx dx => Qq (Z.power_pos nx p) (N.power_pos dx p)
+ | Qz zx => Qz (BigZ.power_pos zx p)
+ | Qq nx dx => Qq (BigZ.power_pos nx p) (BigN.power_pos dx p)
end.
End Qif.
@@ -698,85 +700,85 @@ Module Qbi.
Definition t := q_type.
- Definition zero := Qz Z.zero.
- Definition one := Qz Z.one.
- Definition minus_one := Qz Z.minus_one.
+ Definition zero := Qz BigZ.zero.
+ Definition one := Qz BigZ.one.
+ Definition minus_one := Qz BigZ.minus_one.
- Definition of_Z x := Qz (Z.of_Z x).
+ Definition of_Z x := Qz (BigZ.of_Z x).
Definition compare x y :=
match x, y with
- | Qz zx, Qz zy => Z.compare zx zy
+ | Qz zx, Qz zy => BigZ.compare zx zy
| Qz zx, Qq ny dy =>
- if N.eq_bool dy N.zero then Z.compare zx Z.zero
+ if BigN.eq_bool dy BigN.zero then BigZ.compare zx BigZ.zero
else
- match Z.cmp_sign zx ny with
+ match BigZ.cmp_sign zx ny with
| Lt => Lt
| Gt => Gt
- | Eq => Z.compare (Z.mul zx (Z.Pos dy)) ny
+ | Eq => BigZ.compare (BigZ.mul zx (BigZ.Pos dy)) ny
end
| Qq nx dx, Qz zy =>
- if N.eq_bool dx N.zero then Z.compare Z.zero zy
+ if BigN.eq_bool dx BigN.zero then BigZ.compare BigZ.zero zy
else
- match Z.cmp_sign nx zy with
+ match BigZ.cmp_sign nx zy with
| Lt => Lt
| Gt => Gt
- | Eq => Z.compare nx (Z.mul zy (Z.Pos dx))
+ | Eq => BigZ.compare nx (BigZ.mul zy (BigZ.Pos dx))
end
| Qq nx dx, Qq ny dy =>
- match N.eq_bool dx N.zero, N.eq_bool dy N.zero with
+ match BigN.eq_bool dx BigN.zero, BigN.eq_bool dy BigN.zero with
| true, true => Eq
- | true, false => Z.compare Z.zero ny
- | false, true => Z.compare nx Z.zero
+ | true, false => BigZ.compare BigZ.zero ny
+ | false, true => BigZ.compare nx BigZ.zero
| false, false =>
- match Z.cmp_sign nx ny with
+ match BigZ.cmp_sign nx ny with
| Lt => Lt
| Gt => Gt
- | Eq => Z.compare (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx))
+ | Eq => BigZ.compare (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx))
end
end
end.
Definition opp x :=
match x with
- | Qz zx => Qz (Z.opp zx)
- | Qq nx dx => Qq (Z.opp nx) dx
+ | Qz zx => Qz (BigZ.opp zx)
+ | Qq nx dx => Qq (BigZ.opp nx) dx
end.
Definition do_norm_n n :=
match n with
- | N.N0 _ => false
- | N.N1 _ => false
- | N.N2 _ => false
- | N.N3 _ => false
- | N.N4 _ => false
- | N.N5 _ => false
- | N.N6 _ => false
- | N.N7 _ => false
- | N.N8 _ => false
- | N.N9 _ => true
- | N.N10 _ => true
- | N.N11 _ => true
- | N.N12 _ => true
- | N.Nn n _ => true
+ | BigN.N0 _ => false
+ | BigN.N1 _ => false
+ | BigN.N2 _ => false
+ | BigN.N3 _ => false
+ | BigN.N4 _ => false
+ | BigN.N5 _ => false
+ | BigN.N6 _ => false
+ | BigN.N7 _ => false
+ | BigN.N8 _ => false
+ | BigN.N9 _ => true
+ | BigN.N10 _ => true
+ | BigN.N11 _ => true
+ | BigN.N12 _ => true
+ | BigN.Nn n _ => true
end.
Definition do_norm_z z :=
match z with
- | Z.Pos n => do_norm_n n
- | Z.Neg n => do_norm_n n
+ | BigZ.Pos n => do_norm_n n
+ | BigZ.Neg n => do_norm_n n
end.
(* Je pense que cette fonction normalise bien ... *)
Definition norm n d :=
if andb (do_norm_z n) (do_norm_n d) then
- let gcd := N.gcd (Z.to_N n) d in
- match N.compare N.one gcd with
+ let gcd := BigN.gcd (BigZ.to_N n) d in
+ match BigN.compare BigN.one gcd with
| Lt =>
- let n := Z.div n (Z.Pos gcd) in
- let d := N.div d gcd in
- match N.compare d N.one with
+ let n := BigZ.div n (BigZ.Pos gcd) in
+ let d := BigN.div d gcd in
+ match BigN.compare d BigN.one with
| Gt => Qq n d
| Eq => Qz n
| Lt => zero
@@ -791,24 +793,24 @@ Module Qbi.
match x with
| Qz zx =>
match y with
- | Qz zy => Qz (Z.add zx zy)
+ | Qz zy => Qz (BigZ.add zx zy)
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
- else Qq (Z.add (Z.mul zx (Z.Pos dy)) ny) dy
+ if BigN.eq_bool dy BigN.zero then x
+ else Qq (BigZ.add (BigZ.mul zx (BigZ.Pos dy)) ny) dy
end
| Qq nx dx =>
- if N.eq_bool dx N.zero then y
+ if BigN.eq_bool dx BigN.zero then y
else match y with
- | Qz zy => Qq (Z.add nx (Z.mul zy (Z.Pos dx))) dx
+ | Qz zy => Qq (BigZ.add nx (BigZ.mul zy (BigZ.Pos dx))) dx
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
+ if BigN.eq_bool dy BigN.zero then x
else
- if N.eq_bool dx dy then
- let n := Z.add nx ny in
+ if BigN.eq_bool dx dy then
+ let n := BigZ.add nx ny in
Qq n dx
else
- let n := Z.add (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx)) in
- let d := N.mul dx dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx)) in
+ let d := BigN.mul dx dy in
Qq n d
end
end.
@@ -817,25 +819,25 @@ Module Qbi.
match x with
| Qz zx =>
match y with
- | Qz zy => Qz (Z.add zx zy)
+ | Qz zy => Qz (BigZ.add zx zy)
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
+ if BigN.eq_bool dy BigN.zero then x
else
- norm (Z.add (Z.mul zx (Z.Pos dy)) ny) dy
+ norm (BigZ.add (BigZ.mul zx (BigZ.Pos dy)) ny) dy
end
| Qq nx dx =>
- if N.eq_bool dx N.zero then y
+ if BigN.eq_bool dx BigN.zero then y
else match y with
- | Qz zy => norm (Z.add nx (Z.mul zy (Z.Pos dx))) dx
+ | Qz zy => norm (BigZ.add nx (BigZ.mul zy (BigZ.Pos dx))) dx
| Qq ny dy =>
- if N.eq_bool dy N.zero then x
+ if BigN.eq_bool dy BigN.zero then x
else
- if N.eq_bool dx dy then
- let n := Z.add nx ny in
+ if BigN.eq_bool dx dy then
+ let n := BigZ.add nx ny in
norm n dx
else
- let n := Z.add (Z.mul nx (Z.Pos dy)) (Z.mul ny (Z.Pos dx)) in
- let d := N.mul dx dy in
+ let n := BigZ.add (BigZ.mul nx (BigZ.Pos dy)) (BigZ.mul ny (BigZ.Pos dx)) in
+ let d := BigN.mul dx dy in
norm n d
end
end.
@@ -846,15 +848,15 @@ Module Qbi.
Definition mul x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
- | Qz zx, Qq ny dy => Qq (Z.mul zx ny) dy
- | Qq nx dx, Qz zy => Qq (Z.mul nx zy) dx
- | Qq nx dx, Qq ny dy => Qq (Z.mul nx ny) (N.mul dx dy)
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
+ | Qz zx, Qq ny dy => Qq (BigZ.mul zx ny) dy
+ | Qq nx dx, Qz zy => Qq (BigZ.mul nx zy) dx
+ | Qq nx dx, Qq ny dy => Qq (BigZ.mul nx ny) (BigN.mul dx dy)
end.
Definition mul_norm x y :=
match x, y with
- | Qz zx, Qz zy => Qz (Z.mul zx zy)
+ | Qz zx, Qz zy => Qz (BigZ.mul zx zy)
| Qz zx, Qq ny dy => mul (Qz ny) (norm zx dy)
| Qq nx dx, Qz zy => mul (Qz nx) (norm zy dx)
| Qq nx dx, Qq ny dy => mul (norm nx dy) (norm ny dx)
@@ -862,34 +864,34 @@ Module Qbi.
Definition inv x :=
match x with
- | Qz (Z.Pos n) => Qq Z.one n
- | Qz (Z.Neg n) => Qq Z.minus_one n
- | Qq (Z.Pos n) d => Qq (Z.Pos d) n
- | Qq (Z.Neg n) d => Qq (Z.Neg d) n
+ | Qz (BigZ.Pos n) => Qq BigZ.one n
+ | Qz (BigZ.Neg n) => Qq BigZ.minus_one n
+ | Qq (BigZ.Pos n) d => Qq (BigZ.Pos d) n
+ | Qq (BigZ.Neg n) d => Qq (BigZ.Neg d) n
end.
Definition inv_norm x :=
match x with
- | Qz (Z.Pos n) =>
- if N.eq_bool n N.zero then zero else Qq Z.one n
- | Qz (Z.Neg n) =>
- if N.eq_bool n N.zero then zero else Qq Z.minus_one n
- | Qq (Z.Pos n) d =>
- if N.eq_bool n N.zero then zero else Qq (Z.Pos d) n
- | Qq (Z.Neg n) d =>
- if N.eq_bool n N.zero then zero else Qq (Z.Neg d) n
+ | Qz (BigZ.Pos n) =>
+ if BigN.eq_bool n BigN.zero then zero else Qq BigZ.one n
+ | Qz (BigZ.Neg n) =>
+ if BigN.eq_bool n BigN.zero then zero else Qq BigZ.minus_one n
+ | Qq (BigZ.Pos n) d =>
+ if BigN.eq_bool n BigN.zero then zero else Qq (BigZ.Pos d) n
+ | Qq (BigZ.Neg n) d =>
+ if BigN.eq_bool n BigN.zero then zero else Qq (BigZ.Neg d) n
end.
Definition square x :=
match x with
- | Qz zx => Qz (Z.square zx)
- | Qq nx dx => Qq (Z.square nx) (N.square dx)
+ | Qz zx => Qz (BigZ.square zx)
+ | Qq nx dx => Qq (BigZ.square nx) (BigN.square dx)
end.
Definition power_pos x p :=
match x with
- | Qz zx => Qz (Z.power_pos zx p)
- | Qq nx dx => Qq (Z.power_pos nx p) (N.power_pos dx p)
+ | Qz zx => Qz (BigZ.power_pos zx p)
+ | Qq nx dx => Qq (BigZ.power_pos nx p) (BigN.power_pos dx p)
end.
End Qbi.