File: essai.ml

package info (click to toggle)
mlgmp 20021123-20
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, sid
  • size: 512 kB
  • sloc: ansic: 3,257; ml: 3,126; makefile: 167
file content (148 lines) | stat: -rw-r--r-- 4,287 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
open Gmp;;

for a = -10 to 10
do
  for b = -10 to 10
  do
    (if (compare
	  (Z.neg (Z.add (Z.from_int a) (Z.from_int b)))
	  (Z.from_int (- (a + b)))) <> 0
    then Printf.fprintf stderr "A: %d + %d\n" a b)

  done
done;;

for a = -10 to 10
do
  for b = 0 to 10
  do
    (if (compare
	  (Z.neg (Z.add_ui (Z.from_int a) b))
	  (Z.from_int (- (a + b)))) <> 0
    then Printf.fprintf stderr "B: %d + %d\n" a b)
  done
done;;

for a = -100 to 100
do
  for b = -100 to 100
  do
    if (b <> 0) then
    (let (q, r) = Z.cdiv_qr (Z.from_int a) (Z.from_int b) in
    (if (compare
	  (Z.add (Z.mul q (Z.from_int b)) r)
	  (Z.from_int a)) <> 0
    then Printf.fprintf stderr "C: cdiv_qr %d %d\n" a b);
    (let q' = Z.cdiv_q (Z.from_int a) (Z.from_int b) in
    if (Z.compare q q') <> 0
    then Printf.fprintf stderr "C: cdiv_q %d %d\n" a b);
    (let r' = Z.cdiv_r (Z.from_int a) (Z.from_int b) in
    if (Z.compare r r') <> 0
    then Printf.fprintf stderr "C: cdiv_r %d %d\n" a b))
  done
done;;

(if not (Z.equal (Z.mul_2exp (Z.from_int 5) 3) (Z.from_string "40"))
 then Printf.fprintf stderr "E: mul_2exp\n");;

(if not (Z.equal_int (Z.fdiv_q_2exp (Z.from_string "-41") 3) ( -6))
 then Printf.fprintf stderr "F: fdiv_q_2exp\n");;

(if (Z.sqrtrem (Z.pow_ui (Z.from_string_base ~base: 8 "23") 2)) <>
    ((Z.from_int 19), (Z.from_int 0))
 then Printf.fprintf stderr "G: pow_ui, sqrtrem\n");;

(if (Z.root (Z.pow_ui (Z.from_float 17.) 3) 3) <>
    (Z.from_int 17)
 then Printf.fprintf stderr "H: pow_ui, root\n");;

(if (Z.perfect_power_p (Z.from_int 179199))
|| not (Z.perfect_square_p (Z.from_int 4225))
then Printf.fprintf stderr "I: perfect powers\n");;

(let a = (Z.from_int 4935) and b = (Z.from_int 2563) in
let (g, s, t) = (Z.gcdext a b)
in if g <> (Z.add (Z.mul a s) (Z.mul b t))
   then Printf.fprintf stderr "J: gcdext\n");;

(let modulus = Z.from_string "4098969870980986751"
 and x = Z.from_string "1657867867854181" in
 let (Some y) = Z.inverse x modulus in
 if (Z.modulo (Z.mul x y) modulus) <> Z.one
 then Printf.fprintf stderr "K: inverse\n");;

(let prime = Z.nextprime (Z.from_string "109897328754895897328732816617973")
 in if not (Z.is_prime prime)
    then Printf.fprintf stderr "L: primes\n");;

(if (Z.remove (Z.from_int 16132319) (Z.from_int 7))
 <> ((Z.from_int 6719), 4)
 then Printf.fprintf stderr "M: remove factor\n");;

let fibo =
  let rec fib a b n =
    if n <= 1
    then a
    else fib b (a + b) (pred n)
  in fib 1 1;;

(let n=14 in
 if (Z.to_int (Z.fib_ui n)) <> (fibo n)
 then Printf.fprintf stderr "N: Fibonacci\n");;

let fact =
  let rec fac x n =
    if n <= 1
    then x
    else fac (x * n) (pred n)
  in fac 1;;

(let n=8 in
 if (Z.to_int (Z.fac_ui n)) <> (fact n)
 then Printf.fprintf stderr "N: Factorial\n");;

(let n=13 and k=4 in
 if (Z.to_float (Z.bin_ui ~n: (Z.from_int n) ~k: k)) <> 715.0
 then Printf.fprintf stderr "N: Binomial\n");;

 (if (Z.sgn (Z.sub (Z.from_int 10) (Z.from_int 13))) >= 0
 then Printf.fprintf stderr "O: Sign\n");;

(if (Z.bior (Z.from_int 17) (Z.from_int 5)) <> (Z.from_int 21)
 then Printf.fprintf stderr "P: Binary ops\n");;

(if (Z.scan0 (Z.from_int 87) 0) <> 3 ||
    (Z.scan1 (Z.from_int 0x1562) 9) <> 10
then Printf.fprintf stderr "Q: Scan\n");;

(let max = Z.from_int 5000000
 and rand_state = RNG.randinit (RNG.GMP_RAND_ALG_LC 100)
 and n = 100000
 and sum = ref Z.zero
 in for i=1 to n
    do
      sum := Z.add !sum (Z.urandomm rand_state max)
    done;
    let ecart = Z.abs (Z.sub (Z.fdiv_q_ui !sum n)
			 (Z.fdiv_q_2exp max 1)) in
    if (Z.cmp ecart (Z.from_int 100000)) > 0
    then Printf.fprintf stderr "R: Zrandom %a\n" Z.output ecart);;

(let q1 = Q.from_si 1 2
 and q2 = Q.from_si 1 3
 and q3 = Q.div (Q.from_z (Z.from_int 1)) (Q.from_z (Z.from_int 6))
 in if (not (Q.equal (Q.sub q1 q2) q3))
    || (Q.mul q1 q2) <> q3
    || (Q.to_string (Q.div q1 q2)) <> "3/2"
    then Printf.fprintf stderr "S: rationals\n");;

let marshal_identity (x : 'a) =
  ((Marshal.from_string (Marshal.to_string x []) 0) : 'a);;

let test_marshal equal x =
  not (equal (marshal_identity x) x);;

(if (test_marshal Z.equal (Z.from_string "190709907897091"))
|| (test_marshal Q.equal (Q.from_ints 1688781 173))
|| (test_marshal F.equal (F.from_string "580967.1347"))
then Printf.fprintf stderr "T: marshalling\n");;