diff options
| author | aspiwack | 2007-05-21 16:38:45 +0000 |
|---|---|---|
| committer | aspiwack | 2007-05-21 16:38:45 +0000 |
| commit | ed5578ecabad14a772c64f53265d168a51777045 (patch) | |
| tree | adea9da5a3e692ea51d898671173db6692e7cfed /theories/Ints | |
| parent | 2c1c506d23118fb56fc07b4e334e0e1c7995e36b (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.v | 4 | ||||
| -rw-r--r-- | theories/Ints/BigZ.v | 19 | ||||
| -rw-r--r-- | theories/Ints/num/QMake.v | 768 |
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. |
