gmp 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ 0.2.2:
2
+ * GMP::Z.jacobi and GPM::Z#jacobi work and are tested.
3
+ * GMP::Z.legendre works and is tested.
4
+ * GMP::Z.next_prime is an alias for GMP::Z.nextprime.
5
+ * GMP::Z.next_prime! is an alias for GMP::Z.nextprime!.
6
+ * GMP::Z.remove works as it is supposed to.
7
+ * PDF documentation is extended.
8
+
1
9
  0.2.1:
2
10
  * Got GMP::F(Fixnum) working, (I think it already was).
3
11
  * More and more documentation in PDF.
@@ -47,7 +47,7 @@ paragraph at http://gmplib.org/#WHAT :
47
47
  contributors to sign paperwork where they allow us to distribute their work."
48
48
 
49
49
  Only GMP 4 or newer is supported. The following environments have been tested by me:
50
- gmp gem 0.1.4.2 on:
50
+ gmp gem 0.2.2 on:
51
51
  +-------------------------------------+-------------------+-----------+
52
52
  | Platform | Ruby | GMP |
53
53
  +-------------------------------------+-------------------+-----------+
@@ -77,8 +77,8 @@ Constructors can take following arguments:
77
77
 
78
78
  GMP::Z.new()
79
79
  GMP::Z.new(GMP::Z)
80
- GMP::Z.new(FixNum)
81
- GMP::Z.new(BigNum)
80
+ GMP::Z.new(Fixnum)
81
+ GMP::Z.new(Bignum)
82
82
  GMP::Z.new(String)
83
83
  GMP::Q.new()
84
84
  GMP::Q.new(GMP::Q)
@@ -91,14 +91,14 @@ Constructors can take following arguments:
91
91
  GMP::F.new(GMP::F)
92
92
  GMP::F.new(GMP::F, precision)
93
93
  GMP::F.new(String, precision=0)
94
- GMP::F.new(FixNum, precision=0)
95
- GMP::F.new(BigNum, precision=0)
94
+ GMP::F.new(Fixnum, precision=0)
95
+ GMP::F.new(Bignum, precision=0)
96
96
  GMP::F.new(Float, precision=0)
97
97
 
98
98
  You can also call them as:
99
- GMP.Z(args)
100
- GMP.Q(args)
101
- GMP.F(args)
99
+ GMP.Z(args)
100
+ GMP.Q(args)
101
+ GMP.F(args)
102
102
 
103
103
  =Methods
104
104
 
data/ext/gmpf.c CHANGED
@@ -10,6 +10,17 @@
10
10
  * Instances of this class can store variables of the type mpf_t. This class
11
11
  * also contains many methods that act as the functions for mpf_t variables,
12
12
  * as well as a few methods that attempt to make this library more Ruby-ish.
13
+ *
14
+ * The following list is just a simple checklist for me, really. A better
15
+ * reference should be found in the rdocs.
16
+ *
17
+ * Ruby method C Extension function GMP function
18
+ * to_d r_gmpf_to_d mpf_get_d
19
+ * to_s r_gmpf_to_s mpf_get_s
20
+ * + r_gmpf_add mpf_add
21
+ * - r_gmpf_sub mpf_sub
22
+ * * r_gmpf_mul mpf_mul
23
+ * / r_gmpf_div mpf_div
13
24
  */
14
25
 
15
26
  /**********************************************************************
@@ -379,33 +390,33 @@ VALUE r_gmpf_div(VALUE self, VALUE arg)
379
390
  mpf_get_struct_prec (self, self_val, prec);
380
391
 
381
392
  if (GMPF_P(arg)) {
382
- mpf_get_struct (arg, arg_val_f);
393
+ mpf_get_struct(arg, arg_val_f);
383
394
  prec_max(prec, arg_val_f);
384
395
  mpf_make_struct_init(res, res_val, prec);
385
396
  mpf_div(res_val, self_val, arg_val_f);
386
397
  } else if (GMPQ_P(arg)) {
387
- mpq_get_struct (arg, arg_val_q);
398
+ mpq_get_struct(arg, arg_val_q);
388
399
  mpf_make_struct_init(res, res_val, prec);
389
- mpf_set_q (res_val, arg_val_q);
390
- mpf_div (res_val, self_val, res_val);
400
+ mpf_set_q(res_val, arg_val_q);
401
+ mpf_div(res_val, self_val, res_val);
391
402
  } else if (GMPZ_P(arg)) {
392
- mpz_get_struct (arg, arg_val_z);
403
+ mpz_get_struct(arg, arg_val_z);
393
404
  mpf_make_struct_init(res, res_val, prec);
394
- mpf_set_z (res_val, arg_val_z);
395
- mpf_div (res_val, self_val, res_val);
405
+ mpf_set_z(res_val, arg_val_z);
406
+ mpf_div(res_val, self_val, res_val);
396
407
  } else if (FLOAT_P(arg)) {
397
408
  mpf_make_struct_init(res, res_val, prec);
398
- mpf_set_d (res_val, NUM2DBL(arg));
399
- mpf_div (res_val, self_val, res_val);
409
+ mpf_set_d(res_val, NUM2DBL(arg));
410
+ mpf_div(res_val, self_val, res_val);
400
411
  } else if (FIXNUM_P(arg)) { // _ui with sign control instead ?
401
412
  mpf_make_struct_init(res, res_val, prec);
402
- mpf_set_si (res_val, FIX2INT(arg));
403
- mpf_div (res_val, self_val, res_val);
413
+ mpf_set_si(res_val, FIX2INT(arg));
414
+ mpf_div(res_val, self_val, res_val);
404
415
  } else if (BIGNUM_P(arg)) {
405
416
  mpz_temp_from_bignum(arg_val_z, arg);
406
417
  mpf_make_struct_init(res, res_val, prec);
407
- mpf_set_z (res_val, arg_val_z);
408
- mpf_div (res_val, self_val, res_val);
418
+ mpf_set_z(res_val, arg_val_z);
419
+ mpf_div(res_val, self_val, res_val);
409
420
  mpz_temp_free(arg_val_z);
410
421
  } else {
411
422
  typeerror(ZQFXBD);
data/ext/gmpq.c CHANGED
@@ -21,6 +21,11 @@
21
21
  * sub r_gmpq_sub mpq_sub
22
22
  * mul r_gmpq_mul mpq_mul
23
23
  * div r_gmpq_div mpq_div
24
+ * -@ r_gmpq_neg mpq_neg
25
+ * neg r_gmpq_neg mpq_neg
26
+ * neg! r_gmpq_neg_self mpq_neg
27
+ * abs r_gmpq_abs mpq_abs
28
+ * abs! r_gmpq_abs_self mpq_abs
24
29
  */
25
30
 
26
31
  /**********************************************************************
data/ext/gmpz.c CHANGED
@@ -14,42 +14,52 @@
14
14
  * The following list is just a simple checklist for me, really. A better
15
15
  * reference should be found in the rdocs.
16
16
  *
17
- * Ruby method C Extension function GMP function
18
- * to_d r_gmpz_to_d mpz_get_d
19
- * to_i r_gmpz_to_i mpz_get_i
20
- * to_s r_gmpz_to_s mpz_get_s
21
- * + r_gmpz_add mpz_add
22
- * add! r_gmpz_add_self mpz_add
23
- * - r_gmpz_sub mpz_sub
24
- * sub! r_gmpz_sub_self mpz_sub
25
- * * r_gmpz_mul mpz_mul
26
- * / r_gmpz_div ...
27
- * tdiv r_gmpz_tdiv mpz_tdiv_q
28
- * tmod r_gmpz_tmod mpz_tdiv_r
29
- * fdiv r_gmpz_fdiv mpz_fdiv_q
30
- * fmod r_gmpz_fmod mpz_fdiv_r
31
- * cdiv r_gmpz_cdiv mpz_cdiv_q
32
- * cmod r_gmpz_cmod mpz_cdiv_r
33
- * -@ r_gmpz_neg mpz_neg
34
- * neg r_gmpz_neg mpz_neg
35
- * neg! r_gmpz_neg_self mpz_neg
36
- * abs r_gmpz_abs mpz_abs
37
- * abs! r_gmpz_abs_self mpz_abs
38
- * root r_gmpz_root mpz_root
39
- * sqrt r_gmpz_sqrt mpz_sqrt
40
- * sqrt! r_gmpz_sqrt_self mpz_sqrt
41
- * sqrtrem r_gmpz_sqrtrem mpz_sqrtrem
42
- * remove r_gmpz_remove mpz_remove
43
- * fac r_gmpz_fac mpz_fac_ui
44
- * fib r_gmpz_fib mpz_fib_ui
45
- * com r_gmpz_com mpz_com
46
- * com! r_gmpz_com_self mpz_com
47
- * []= r_gmpz_setbit mpz_setbit
48
- * [] r_gmpz_getbit mpz_tstbit
49
- * scan0 r_gmpz_scan0 mpz_scan0
50
- * scan1 r_gmpz_scan1 mpz_scan1
51
- * even? r_gmpz_is_even mpz_even
52
- * odd? r_gmpz_is_odd mpz_odd
17
+ * Ruby method C Extension function GMP function
18
+ * to_d r_gmpz_to_d mpz_get_d
19
+ * to_i r_gmpz_to_i mpz_get_i
20
+ * to_s r_gmpz_to_s mpz_get_s
21
+ * + r_gmpz_add mpz_add
22
+ * add! r_gmpz_add_self mpz_add
23
+ * - r_gmpz_sub mpz_sub
24
+ * sub! r_gmpz_sub_self mpz_sub
25
+ * * r_gmpz_mul mpz_mul
26
+ * / r_gmpz_div ...
27
+ * tdiv r_gmpz_tdiv mpz_tdiv_q
28
+ * tmod r_gmpz_tmod mpz_tdiv_r
29
+ * fdiv r_gmpz_fdiv mpz_fdiv_q
30
+ * fmod r_gmpz_fmod mpz_fdiv_r
31
+ * cdiv r_gmpz_cdiv mpz_cdiv_q
32
+ * cmod r_gmpz_cmod mpz_cdiv_r
33
+ * -@ r_gmpz_neg mpz_neg
34
+ * neg r_gmpz_neg mpz_neg
35
+ * neg! r_gmpz_neg_self mpz_neg
36
+ * abs r_gmpz_abs mpz_abs
37
+ * abs! r_gmpz_abs_self mpz_abs
38
+ * ** r_gmpz_pow mpz_pow_ui
39
+ * powmod r_gmpz_powm mpz_powm
40
+ * root r_gmpz_root mpz_root
41
+ * sqrt r_gmpz_sqrt mpz_sqrt
42
+ * sqrt! r_gmpz_sqrt_self mpz_sqrt
43
+ * sqrtrem r_gmpz_sqrtrem mpz_sqrtrem
44
+ * power? r_gmpz_is_power mpz_perfect_power_p
45
+ * square? r_gmpz_is_square mpz_perfect_square_p
46
+ * probab_prime? r_gmpz_is_probab_prime mpz_probab_prime_p
47
+ * nextprime r_gmpz_nextprime mpz_nextprime
48
+ * nextprime! r_gmpz_nextprime_self mpz_nextprime
49
+ * jacobi r_gmpz_jacobi mpz_jacobi
50
+ * #jacobi r_gmpzsg_jacobi mpz_jacobi
51
+ * legendre r_gmpz_legendre mpz_legendre
52
+ * remove r_gmpz_remove mpz_remove
53
+ * fac r_gmpz_fac mpz_fac_ui
54
+ * fib r_gmpz_fib mpz_fib_ui
55
+ * com r_gmpz_com mpz_com
56
+ * com! r_gmpz_com_self mpz_com
57
+ * []= r_gmpz_setbit mpz_setbit
58
+ * [] r_gmpz_getbit mpz_tstbit
59
+ * scan0 r_gmpz_scan0 mpz_scan0
60
+ * scan1 r_gmpz_scan1 mpz_scan1
61
+ * even? r_gmpz_is_even mpz_even
62
+ * odd? r_gmpz_is_odd mpz_odd
53
63
  * ...
54
64
  */
55
65
 
@@ -78,7 +88,7 @@ static VALUE r_gmpz_##fname##_self(VALUE self) \
78
88
  MP_INT *self_val; \
79
89
  mpz_get_struct(self, self_val); \
80
90
  mpz_fname(self_val, self_val); \
81
- return Qnil; \
91
+ return self; \
82
92
  }
83
93
 
84
94
  #define DEFUN_INT_F_UL(fname,mpz_fname,argname) \
@@ -641,6 +651,19 @@ VALUE r_gmpz_mul(VALUE self, VALUE arg)
641
651
  return res;
642
652
  }
643
653
 
654
+ /*
655
+ * Document-method: <<
656
+ *
657
+ * call-seq:
658
+ * integer << n
659
+ *
660
+ * From the GMP Manual:
661
+ *
662
+ * Returns +integer+ times 2 raised to +n+. This operation can also be defined
663
+ * as a left shift by +n+ bits.
664
+ */
665
+ DEFUN_INT_F_UL(shl,mpz_mul_2exp,"shift size")
666
+
644
667
  /*
645
668
  * Document-method: neg
646
669
  *
@@ -866,6 +889,90 @@ DEFUN_INT_DIV(cmod, mpz_cdiv_r)
866
889
  * Integer Exponentiation *
867
890
  **********************************************************************/
868
891
 
892
+ /*
893
+ * Document-method: **
894
+ *
895
+ * call-seq:
896
+ * integer ** exp
897
+ *
898
+ * From the GMP Manual:
899
+ *
900
+ * Returns +integer+ raised to +exp+. The case 0^0 yields 1.
901
+ */
902
+ DEFUN_INT_F_UL(pow,mpz_pow_ui,"exponent")
903
+
904
+ /*
905
+ * call-seq:
906
+ * integer.powmod(exp, mod)
907
+ *
908
+ * From the GMP Manual:
909
+ *
910
+ * Returns +integer+ raised to +exp+ modulo +mod+.
911
+ *
912
+ * Negative +exp+ is supported if an inverse <tt>integer^-1</tt> mod
913
+ * <tt>mod</tt> exists. If an inverse doesn't exist then a divide by zero is
914
+ * raised.
915
+ */
916
+ VALUE r_gmpz_powm(VALUE self, VALUE exp, VALUE mod)
917
+ {
918
+ MP_INT *self_val, *res_val, *mod_val, *exp_val;
919
+ VALUE res;
920
+ int free_mod_val = 0;
921
+
922
+ if (GMPZ_P(mod)) {
923
+ mpz_get_struct(mod, mod_val);
924
+ if (mpz_sgn(mod_val) <= 0) {
925
+ rb_raise(rb_eRangeError, "modulus must be positive");
926
+ }
927
+ } else if (FIXNUM_P(mod)) {
928
+ if (FIX2INT(mod) <= 0) {
929
+ rb_raise(rb_eRangeError, "modulus must be positive");
930
+ }
931
+ mpz_temp_alloc(mod_val);
932
+ mpz_init_set_ui(mod_val, FIX2INT(mod));
933
+ free_mod_val = 1;
934
+ } else if (BIGNUM_P(mod)) {
935
+ mpz_temp_from_bignum(mod_val, mod);
936
+ if (mpz_sgn(mod_val) <= 0) {
937
+ mpz_temp_free(mod_val);
938
+ rb_raise(rb_eRangeError, "modulus must be positive");
939
+ }
940
+ free_mod_val = 1;
941
+ } else {
942
+ typeerror_as(ZXB, "modulus");
943
+ }
944
+ mpz_make_struct_init(res, res_val);
945
+ mpz_get_struct(self, self_val);
946
+
947
+ if (GMPZ_P(exp)) {
948
+ mpz_get_struct(exp, exp_val);
949
+ if (mpz_sgn(mod_val) < 0) {
950
+ rb_raise(rb_eRangeError, "exponent must be nonnegative");
951
+ }
952
+ mpz_powm(res_val, self_val, exp_val, mod_val);
953
+ } else if (FIXNUM_P(exp)) {
954
+ if (FIX2INT(exp) < 0)
955
+ {
956
+ if (free_mod_val)
957
+ mpz_temp_free(mod_val);
958
+ rb_raise(rb_eRangeError, "exponent must be nonnegative");
959
+ }
960
+ mpz_powm_ui(res_val, self_val, FIX2INT(exp), mod_val);
961
+ } else if (BIGNUM_P(exp)) {
962
+ mpz_temp_from_bignum(exp_val, exp);
963
+ mpz_powm(res_val, self_val, exp_val, mod_val);
964
+ mpz_temp_free(exp_val);
965
+ } else {
966
+ if (free_mod_val)
967
+ mpz_temp_free(mod_val);
968
+ typeerror_as(ZXB, "exponent");
969
+ }
970
+ if (free_mod_val)
971
+ mpz_temp_free(mod_val);
972
+ return res;
973
+ }
974
+
975
+
869
976
  /**********************************************************************
870
977
  * Integer Roots *
871
978
  **********************************************************************/
@@ -928,11 +1035,227 @@ static VALUE r_gmpz_sqrtrem(VALUE self)
928
1035
  return rb_assoc_new(sqrt, rem);
929
1036
  }
930
1037
 
1038
+ /*
1039
+ * Document-method: power?
1040
+ *
1041
+ * call-seq:
1042
+ * integer.power?
1043
+ *
1044
+ * From the GMP Manual:
1045
+ *
1046
+ * Returns true if integer is a perfect power, i.e., if there exist integers a
1047
+ * and b, with b>1, such that integer equals a raised to the power b.
1048
+ *
1049
+ * Under this definition both 0 and 1 are considered to be perfect powers.
1050
+ * Negative values of integers are accepted, but of course can only be odd
1051
+ * perfect powers.
1052
+ */
1053
+ DEFUN_INT_COND_P(is_power,mpz_perfect_power_p)
1054
+ /*
1055
+ * Document-method: square?
1056
+ *
1057
+ * call-seq:
1058
+ * integer.square?
1059
+ *
1060
+ * From the GMP Manual:
1061
+ *
1062
+ * Returns true if integer is a perfect square, i.e., if the square root of
1063
+ * integer is an integer. Under this definition both 0 and 1 are considered to
1064
+ * be perfect squares.
1065
+ */
1066
+ DEFUN_INT_COND_P(is_square,mpz_perfect_square_p)
1067
+
931
1068
 
932
1069
  /**********************************************************************
933
1070
  * Number Theoretic Functions *
934
1071
  **********************************************************************/
935
1072
 
1073
+ /*
1074
+ * call-seq: probab_prime?(reps = 5)
1075
+ *
1076
+ * Determine whether +n+ is prime. Returns 2 if +n+ is definitely prime,
1077
+ * returns 1 if +n+ is probably prime (without being certain), or returns 0 if
1078
+ * +n+ is definitely composite.
1079
+ *
1080
+ * This function does some trial divisions, then some Miller-Rabin
1081
+ * probabilistic primality tests. +reps+ controls how many such tests are done,
1082
+ * 5 to 10 is a reasonable number, more will reduce the chances of a composite
1083
+ * being returned as "probably prime".
1084
+ *
1085
+ * Miller-Rabin and similar tests can be more properly called compositeness
1086
+ * tests. Numbers which fail are known to be composite but those which pass
1087
+ * might be prime or might be composite. Only a few composites pass, hence
1088
+ * those which pass are considered probably prime.
1089
+ */
1090
+ VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self)
1091
+ {
1092
+ MP_INT *self_val;
1093
+ int reps_val;
1094
+ VALUE reps;
1095
+ mpz_get_struct(self, self_val);
1096
+ rb_scan_args(argc, argv, "01", &reps);
1097
+ if(NIL_P(reps)){
1098
+ reps = INT2FIX(5);
1099
+ }
1100
+ if (FIXNUM_P(reps)) {
1101
+ reps_val = FIX2INT (reps);
1102
+ } else {
1103
+ typeerror_as(X, "reps");
1104
+ }
1105
+ return INT2FIX(mpz_probab_prime_p(self_val, reps_val));
1106
+ }
1107
+
1108
+ /*
1109
+ * Document-method: nextprime
1110
+ *
1111
+ * call-seq:
1112
+ * integer.nextprime
1113
+ * integer.next_prime
1114
+ *
1115
+ * From the GMP Manual:
1116
+ *
1117
+ * Returns the next prime greater than +integer+.
1118
+ *
1119
+ * This function uses a probabilistic algorithm to identify primes. For
1120
+ * practical purposes it's adequate, the chance of a composite passing will be
1121
+ * extremely small.
1122
+ */
1123
+ /*
1124
+ * Document-method: nextprime!
1125
+ *
1126
+ * call-seq:
1127
+ * integer.nextprime!
1128
+ * integer.next_prime!
1129
+ *
1130
+ * From the GMP Manual:
1131
+ *
1132
+ * Sets +integer+ to the next prime greater than +integer+.
1133
+ *
1134
+ * This function uses a probabilistic algorithm to identify primes. For
1135
+ * practical purposes it's adequate, the chance of a composite passing will be
1136
+ * extremely small.
1137
+ */
1138
+ DEFUN_INT2INT(nextprime, mpz_nextprime)
1139
+
1140
+ /*
1141
+ * Document-method: jacobi
1142
+ *
1143
+ * call-seq:
1144
+ * a.jacobi(b)
1145
+ *
1146
+ * From the GMP Manual:
1147
+ *
1148
+ * Calculate the Jacobi symbol <tt>(a/b)</tt>. This is defined only for +b+
1149
+ * odd and positive.
1150
+ */
1151
+ VALUE r_gmpz_jacobi(VALUE self, VALUE b)
1152
+ {
1153
+ MP_INT *self_val, *b_val;
1154
+ int res_val;
1155
+ mpz_get_struct(self, self_val);
1156
+ mpz_get_struct( b, b_val);
1157
+ if (mpz_sgn(b_val) != 1)
1158
+ rb_raise(rb_eRangeError, "Cannot take Jacobi symbol (a/b) where b is non-positive.");
1159
+ if (mpz_even_p(b_val))
1160
+ rb_raise(rb_eRangeError, "Cannot take Jacobi symbol (a/b) where b is even.");
1161
+ res_val = mpz_jacobi(self_val, b_val);
1162
+ return INT2FIX(res_val);
1163
+ }
1164
+
1165
+ /*
1166
+ * Document-method: GMP::Z.jacobi
1167
+ *
1168
+ * call-seq:
1169
+ * GMP::Z.jacobi(a, b)
1170
+ *
1171
+ * From the GMP Manual:
1172
+ *
1173
+ * Calculate the Jacobi symbol <tt>(a/b)</tt>. This is defined only for +b+
1174
+ * odd and positive.
1175
+ */
1176
+ VALUE r_gmpzsg_jacobi(VALUE klass, VALUE a, VALUE b)
1177
+ {
1178
+ MP_INT *a_val, *b_val;
1179
+ int res_val;
1180
+ int free_a_val = 0;
1181
+ int free_b_val = 0;
1182
+ (void)klass;
1183
+
1184
+ if (GMPZ_P(a)) {
1185
+ mpz_get_struct(a, a_val);
1186
+ } else if (FIXNUM_P(a)) {
1187
+ mpz_temp_alloc(a_val);
1188
+ mpz_init_set_ui(a_val, FIX2INT(a));
1189
+ free_a_val = 1;
1190
+ } else if (BIGNUM_P(a)) {
1191
+ mpz_temp_from_bignum(a_val, a);
1192
+ free_a_val = 1;
1193
+ } else {
1194
+ typeerror_as(ZXB, "a");
1195
+ }
1196
+
1197
+ if (GMPZ_P(b)) {
1198
+ mpz_get_struct(b, b_val);
1199
+ if (mpz_sgn(b_val) != 1)
1200
+ rb_raise(rb_eRangeError, "Cannot take Jacobi symbol (a/b) where b is non-positive.");
1201
+ if (mpz_even_p(b_val))
1202
+ rb_raise(rb_eRangeError, "Cannot take Jacobi symbol (a/b) where b is even.");
1203
+ } else if (FIXNUM_P(b)) {
1204
+ if (FIX2INT(b) <= 0)
1205
+ rb_raise(rb_eRangeError, "Cannot take Jacobi symbol (a/b) where b is non-positive.");
1206
+ if (FIX2INT(b) % 2 == 0)
1207
+ rb_raise(rb_eRangeError, "Cannot take Jacobi symbol (a/b) where b is even.");
1208
+ mpz_temp_alloc(b_val);
1209
+ mpz_init_set_ui(b_val, FIX2INT(b));
1210
+ free_b_val = 1;
1211
+ } else if (BIGNUM_P(b)) {
1212
+ mpz_temp_from_bignum(b_val, b);
1213
+ if (mpz_sgn(b_val) != 1) {
1214
+ mpz_temp_free(b_val);
1215
+ rb_raise(rb_eRangeError, "Cannot take Jacobi symbol (a/b) where b is non-positive.");
1216
+ }
1217
+ if (mpz_even_p(b_val)) {
1218
+ mpz_temp_free(b_val);
1219
+ rb_raise(rb_eRangeError, "Cannot take Jacobi symbol (a/b) where b is even.");
1220
+ }
1221
+ free_b_val = 1;
1222
+ } else {
1223
+ typeerror_as(ZXB, "b");
1224
+ }
1225
+
1226
+ res_val = mpz_jacobi(a_val, b_val);
1227
+ if (free_a_val) { mpz_temp_free(a_val); }
1228
+ if (free_b_val) { mpz_temp_free(b_val); }
1229
+ return INT2FIX(res_val);
1230
+ }
1231
+
1232
+ /*
1233
+ * Document-method: legendre
1234
+ *
1235
+ * call-seq:
1236
+ * a.legendre(p)
1237
+ *
1238
+ * From the GMP Manual:
1239
+ *
1240
+ * Calculate the Legendre symbol <tt>(a/p)</tt>. This is defined only for +p+
1241
+ * an odd positive prime, and for such +p+ it's identical to the Jacobi symbol.
1242
+ */
1243
+ VALUE r_gmpz_legendre(VALUE self, VALUE p)
1244
+ {
1245
+ MP_INT *self_val, *p_val;
1246
+ int res_val;
1247
+ mpz_get_struct(self, self_val);
1248
+ mpz_get_struct( p, p_val);
1249
+ if (mpz_sgn(p_val) != 1)
1250
+ rb_raise(rb_eRangeError, "Cannot take Legendre symbol (a/p) where p is non-positive.");
1251
+ if (mpz_even_p(p_val))
1252
+ rb_raise(rb_eRangeError, "Cannot take Legendre symbol (a/p) where p is even.");
1253
+ if (mpz_probab_prime_p(p_val, 5) == 0)
1254
+ rb_raise(rb_eRangeError, "Cannot take Legendre symbol (a/p) where p is composite.");
1255
+ res_val = mpz_legendre(self_val, p_val);
1256
+ return INT2FIX(res_val);
1257
+ }
1258
+
936
1259
  /*
937
1260
  * Document-method: remove
938
1261
  *
@@ -948,9 +1271,10 @@ VALUE r_gmpz_remove(VALUE self, VALUE arg)
948
1271
  {
949
1272
  MP_INT *self_val, *arg_val, *res_val;
950
1273
  VALUE res;
1274
+ int removed_val;
951
1275
  int free_arg_val = 0;
952
1276
 
953
- mpz_get_struct(self,self_val);
1277
+ mpz_get_struct(self, self_val);
954
1278
 
955
1279
  if (GMPZ_P(arg)) {
956
1280
  mpz_get_struct(arg,arg_val);
@@ -964,20 +1288,20 @@ VALUE r_gmpz_remove(VALUE self, VALUE arg)
964
1288
  } else if (BIGNUM_P(arg)) {
965
1289
  mpz_temp_from_bignum(arg_val, arg);
966
1290
  if (mpz_sgn(arg_val) != 1) {
967
- mpz_temp_free (arg_val);
1291
+ mpz_temp_free(arg_val);
968
1292
  rb_raise(rb_eRangeError, "argument must be positive");
969
1293
  }
970
1294
  } else {
971
1295
  typeerror(ZXB);
972
1296
  }
973
1297
 
974
- mpz_make_struct_init (res, res_val);
975
- mpz_remove (res_val, self_val, arg_val);
1298
+ mpz_make_struct_init(res, res_val);
1299
+ removed_val = mpz_remove(res_val, self_val, arg_val);
976
1300
 
977
1301
  if (free_arg_val)
978
1302
  mpz_temp_free(arg_val);
979
1303
 
980
- return res;
1304
+ return rb_assoc_new(res, INT2FIX(removed_val));
981
1305
  }
982
1306
 
983
1307
  /*
@@ -1190,110 +1514,6 @@ VALUE r_gmpz_scan1(VALUE self, VALUE bitnr)
1190
1514
  return INT2FIX(mpz_scan1(self_val, bitnr_val));
1191
1515
  }
1192
1516
 
1193
-
1194
- /**********************************************************************
1195
- * Integer Random Numbers *
1196
- **********************************************************************/
1197
-
1198
- /**********************************************************************
1199
- * Miscellaneous Integer Functions *
1200
- **********************************************************************/
1201
-
1202
- /**********************************************************************
1203
- * Integer Special Functions *
1204
- **********************************************************************/
1205
-
1206
-
1207
- /**********************************************************************
1208
- * _unsorted_ *
1209
- **********************************************************************/
1210
-
1211
- /*
1212
- * Document-method: com
1213
- *
1214
- * call-seq:
1215
- * integer.com
1216
- *
1217
- * From the GMP Manual:
1218
- *
1219
- * Returns the one's complement of +integer+.
1220
- */
1221
- /*
1222
- * Document-method: com!
1223
- *
1224
- * call-seq:
1225
- * integer.com!
1226
- *
1227
- * From the GMP Manual:
1228
- *
1229
- * Sets +integer+ to its one's complement.
1230
- */
1231
- DEFUN_INT2INT(com, mpz_com)
1232
- /*
1233
- * Document-method: nextprime
1234
- *
1235
- * call-seq:
1236
- * integer.nextprime
1237
- *
1238
- * From the GMP Manual:
1239
- *
1240
- * Returns the next prime greater than +integer+.
1241
- *
1242
- * This function uses a probabilistic algorithm to identify primes. For
1243
- * practical purposes it's adequate, the chance of a composite passing will be
1244
- * extremely small.
1245
- */
1246
- /*
1247
- * Document-method: nextprime!
1248
- *
1249
- * call-seq:
1250
- * integer.nextprime!
1251
- *
1252
- * From the GMP Manual:
1253
- *
1254
- * Sets +integer+ to the next prime greater than +integer+.
1255
- *
1256
- * This function uses a probabilistic algorithm to identify primes. For
1257
- * practical purposes it's adequate, the chance of a composite passing will be
1258
- * extremely small.
1259
- */
1260
- DEFUN_INT2INT(nextprime, mpz_nextprime)
1261
-
1262
- /*
1263
- * call-seq: probab_prime?([reps])
1264
- *
1265
- * Determine whether +n+ is prime. Returns 2 if +n+ is definitely prime,
1266
- * returns 1 if +n+ is probably prime (without being certain), or return 0 if
1267
- * +n+ is definitely composite.
1268
- *
1269
- * This function does some trial divisions, then some Miller-Rabin
1270
- * probabilistic primality tests. +reps+ controls how many such tests are done,
1271
- * 5 to 10 is a reasonable number, more will reduce the chances of a composite
1272
- * being returned as �probably prime�.
1273
- *
1274
- * Miller-Rabin and similar tests can be more properly called compositeness
1275
- * tests. Numbers which fail are known to be composite but those which pass
1276
- * might be prime or might be composite. Only a few composites pass, hence
1277
- * those which pass are considered probably prime.
1278
- */
1279
- VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self)
1280
- {
1281
- MP_INT *self_val;
1282
- int reps_val;
1283
- VALUE reps;
1284
- mpz_get_struct(self, self_val);
1285
- rb_scan_args(argc, argv, "01", &reps);
1286
- if(NIL_P(reps)){
1287
- reps = INT2FIX(5);
1288
- }
1289
- if (FIXNUM_P(reps)) {
1290
- reps_val = FIX2INT (reps);
1291
- } else {
1292
- typeerror_as(X, "reps");
1293
- }
1294
- return INT2FIX(mpz_probab_prime_p(self_val, reps_val));
1295
- }
1296
-
1297
1517
  /*
1298
1518
  * Document-method: popcount
1299
1519
  *
@@ -1314,60 +1534,6 @@ VALUE r_gmpz_popcount(VALUE self)
1314
1534
  return INT2FIX(mpz_popcount(self_val));
1315
1535
  }
1316
1536
 
1317
- /*
1318
- * Document-method: jacobi
1319
- *
1320
- * call-seq:
1321
- * a.jacobi
1322
- *
1323
- * <b>90% sure this is incorrectly implemented. Todo.</b>
1324
- *
1325
- * From the GMP Manual:
1326
- *
1327
- * Calculate the Jacobi symbol <tt>(a/b)</tt>. This is defined only for +b+
1328
- * odd.
1329
- */
1330
- VALUE r_gmpz_jacobi(VALUE self)
1331
- {
1332
- MP_INT *self_val, *res_val;
1333
- VALUE res;
1334
- mpz_get_struct(self, self_val);
1335
- if (mpz_sgn(self_val) != 1)
1336
- rb_raise(rb_eRangeError, "you can take jacobi symbol only of positive value");
1337
- if (mpz_even_p(self_val))
1338
- rb_raise(rb_eRangeError, "you can't take jacobi symbol of even value");
1339
- mpz_make_struct_init(res, res_val);
1340
- mpz_jacobi(res_val, self_val);
1341
- return res;
1342
- }
1343
-
1344
- /*
1345
- * Document-method: legendre
1346
- *
1347
- * call-seq:
1348
- * a.legendre
1349
- *
1350
- * <b>90% sure this is incorrectly implemented. Todo.</b>
1351
- *
1352
- * From the GMP Manual:
1353
- *
1354
- * Calculate the Legendre symbol <tt>(a/p)</tt>. This is defined only for +p+
1355
- * an odd positive prime, and for such +p+ it's identical to the Jacobi symbol.
1356
- */
1357
- VALUE r_gmpz_legendre(VALUE self)
1358
- {
1359
- MP_INT *self_val, *res_val;
1360
- VALUE res;
1361
- mpz_get_struct(self, self_val);
1362
- if (mpz_sgn(self_val) != 1)
1363
- rb_raise(rb_eRangeError, "you can take legendre symbol only of positive value");
1364
- if (mpz_even_p(self_val))
1365
- rb_raise(rb_eRangeError, "you can't take legendre symbol of even value");
1366
- mpz_make_struct_init(res, res_val);
1367
- mpz_legendre(res_val, self_val);
1368
- return res;
1369
- }
1370
-
1371
1537
  /*
1372
1538
  * call-seq:
1373
1539
  * integer[index] = x &rarr; nil
@@ -1413,57 +1579,68 @@ VALUE r_gmpz_getbit(VALUE self, VALUE bitnr)
1413
1579
  return mpz_tstbit(self_val, bitnr_val)?Qtrue:Qfalse;
1414
1580
  }
1415
1581
 
1582
+
1583
+ /**********************************************************************
1584
+ * Integer Random Numbers *
1585
+ **********************************************************************/
1586
+
1587
+ /**********************************************************************
1588
+ * Miscellaneous Integer Functions *
1589
+ **********************************************************************/
1590
+
1591
+ /**********************************************************************
1592
+ * Integer Special Functions *
1593
+ **********************************************************************/
1594
+
1595
+
1596
+ /**********************************************************************
1597
+ * _unsorted_ *
1598
+ **********************************************************************/
1599
+
1416
1600
  /*
1417
- * Document-method: even?
1601
+ * Document-method: com
1418
1602
  *
1419
1603
  * call-seq:
1420
- * integer.even?
1604
+ * integer.com
1421
1605
  *
1422
1606
  * From the GMP Manual:
1423
1607
  *
1424
- * Determines whether integer is even. Returns true or false.
1608
+ * Returns the one's complement of +integer+.
1425
1609
  */
1426
- DEFUN_INT_COND_P(is_even,mpz_even_p)
1427
1610
  /*
1428
- * Document-method: odd?
1611
+ * Document-method: com!
1429
1612
  *
1430
1613
  * call-seq:
1431
- * integer.odd?
1614
+ * integer.com!
1432
1615
  *
1433
1616
  * From the GMP Manual:
1434
1617
  *
1435
- * Determines whether integer is odd. Returns true or false.
1618
+ * Sets +integer+ to its one's complement.
1436
1619
  */
1437
- DEFUN_INT_COND_P(is_odd,mpz_odd_p)
1620
+ DEFUN_INT2INT(com, mpz_com)
1621
+
1438
1622
  /*
1439
- * Document-method: square?
1623
+ * Document-method: even?
1440
1624
  *
1441
1625
  * call-seq:
1442
- * integer.square?
1626
+ * integer.even?
1443
1627
  *
1444
1628
  * From the GMP Manual:
1445
1629
  *
1446
- * Returns true if integer is a perfect square, i.e., if the square root of
1447
- * integer is an integer. Under this definition both 0 and 1 are considered to
1448
- * be perfect squares.
1630
+ * Determines whether integer is even. Returns true or false.
1449
1631
  */
1450
- DEFUN_INT_COND_P(is_square,mpz_perfect_square_p)
1632
+ DEFUN_INT_COND_P(is_even,mpz_even_p)
1451
1633
  /*
1452
- * Document-method: power?
1634
+ * Document-method: odd?
1453
1635
  *
1454
1636
  * call-seq:
1455
- * integer.square?
1637
+ * integer.odd?
1456
1638
  *
1457
1639
  * From the GMP Manual:
1458
1640
  *
1459
- * Returns true if integer is a perfect power, i.e., if there exist integers a
1460
- * and b, with b>1, such that integer equals a raised to the power b.
1461
- *
1462
- * Under this definition both 0 and 1 are considered to be perfect powers.
1463
- * Negative values of integers are accepted, but of course can only be odd
1464
- * perfect powers.
1641
+ * Determines whether integer is odd. Returns true or false.
1465
1642
  */
1466
- DEFUN_INT_COND_P(is_power,mpz_perfect_power_p)
1643
+ DEFUN_INT_COND_P(is_odd,mpz_odd_p)
1467
1644
 
1468
1645
  /*
1469
1646
  * call-seq:
@@ -1480,100 +1657,6 @@ VALUE r_gmpz_sgn(VALUE self)
1480
1657
  return INT2FIX(mpz_sgn(self_val));
1481
1658
  }
1482
1659
 
1483
- /*
1484
- * call-seq:
1485
- * integer.powmod(exp, mod)
1486
- *
1487
- * From the GMP Manual:
1488
- *
1489
- * Returns +integer+ raised to +exp+ modulo +mod+.
1490
- *
1491
- * Negative +exp+ is supported if an inverse <tt>integer^-1</tt> mod
1492
- * <tt>mod</tt> exists. If an inverse doesn't exist then a divide by zero is
1493
- * raised.
1494
- */
1495
- VALUE r_gmpz_powm(VALUE self, VALUE exp, VALUE mod)
1496
- {
1497
- MP_INT *self_val, *res_val, *mod_val, *exp_val;
1498
- VALUE res;
1499
- int free_mod_val = 0;
1500
-
1501
- if (GMPZ_P(mod)) {
1502
- mpz_get_struct(mod, mod_val);
1503
- if (mpz_sgn(mod_val) <= 0) {
1504
- rb_raise (rb_eRangeError, "modulus must be positive");
1505
- }
1506
- } else if (FIXNUM_P(mod)) {
1507
- if (FIX2INT(mod) <= 0) {
1508
- rb_raise (rb_eRangeError, "modulus must be positive");
1509
- }
1510
- mpz_temp_alloc (mod_val);
1511
- mpz_init_set_ui(mod_val, FIX2INT(mod));
1512
- free_mod_val = 1;
1513
- } else if (BIGNUM_P(mod)) {
1514
- mpz_temp_from_bignum (mod_val, mod);
1515
- if (mpz_sgn(mod_val) <= 0) {
1516
- mpz_temp_free(mod_val);
1517
- rb_raise (rb_eRangeError, "modulus must be positive");
1518
- }
1519
- free_mod_val = 1;
1520
- } else {
1521
- typeerror_as (ZXB, "modulus");
1522
- }
1523
- mpz_make_struct_init(res, res_val);
1524
- mpz_get_struct(self, self_val);
1525
-
1526
- if (GMPZ_P(exp)) {
1527
- mpz_get_struct(exp, exp_val);
1528
- if (mpz_sgn(mod_val) < 0) {
1529
- rb_raise (rb_eRangeError, "exponent must be nonnegative");
1530
- }
1531
- mpz_powm (res_val, self_val, exp_val, mod_val);
1532
- } else if (FIXNUM_P(exp)) {
1533
- if (FIX2INT(exp) < 0)
1534
- {
1535
- if (free_mod_val)
1536
- mpz_temp_free(mod_val);
1537
- rb_raise (rb_eRangeError, "exponent must be nonnegative");
1538
- }
1539
- mpz_powm_ui (res_val, self_val, FIX2INT(exp), mod_val);
1540
- } else if (BIGNUM_P(exp)) {
1541
- mpz_temp_from_bignum (exp_val, exp);
1542
- mpz_powm (res_val, self_val, exp_val, mod_val);
1543
- mpz_temp_free (exp_val);
1544
- } else {
1545
- if (free_mod_val)
1546
- mpz_temp_free(mod_val);
1547
- typeerror_as (ZXB, "exponent");
1548
- }
1549
- if (free_mod_val)
1550
- mpz_temp_free(mod_val);
1551
- return res;
1552
- }
1553
-
1554
- /*
1555
- * Document-method: **
1556
- *
1557
- * call-seq:
1558
- * integer ** exp
1559
- *
1560
- * From the GMP Manual:
1561
- *
1562
- * Returns +integer+ raised to +exp+. The case 0^0 yields 1.
1563
- */
1564
- DEFUN_INT_F_UL(pow,mpz_pow_ui,"exponent")
1565
- /*
1566
- * Document-method: <<
1567
- *
1568
- * call-seq:
1569
- * integer << n
1570
- *
1571
- * From the GMP Manual:
1572
- *
1573
- * Returns +integer+ times 2 raised to +n+. This operation can also be defined
1574
- * as a left shift by +n+ bits.
1575
- */
1576
- DEFUN_INT_F_UL(shl,mpz_mul_2exp,"shift size")
1577
1660
  DEFUN_INT_F_UL(fshr,mpz_fdiv_q_2exp,"shift size")
1578
1661
  DEFUN_INT_F_UL(tshr,mpz_tdiv_q_2exp,"shift size")
1579
1662
  DEFUN_INT_F_UL(fshrm,mpz_fdiv_r_2exp,"mark size")
@@ -1697,16 +1780,20 @@ void init_gmpz()
1697
1780
  rb_define_method(cGMP_Z, "to_s", r_gmpz_to_s, -1);
1698
1781
 
1699
1782
  // Integer Arithmetic
1700
- rb_define_method(cGMP_Z, "+", r_gmpz_add, 1);
1783
+ rb_define_method(cGMP_Z, "+", r_gmpz_add, 1);
1701
1784
  rb_define_method(cGMP_Z, "add!", r_gmpz_add_self, 1);
1702
- rb_define_method(cGMP_Z, "-", r_gmpz_sub, 1);
1785
+ rb_define_method(cGMP_Z, "-", r_gmpz_sub, 1);
1703
1786
  rb_define_method(cGMP_Z, "sub!", r_gmpz_sub_self, 1);
1704
- rb_define_method(cGMP_Z, "*", r_gmpz_mul, 1);
1705
- rb_define_method(cGMP_Z, "neg", r_gmpz_neg, 0);
1787
+ rb_define_method(cGMP_Z, "*", r_gmpz_mul, 1);
1788
+ rb_define_method(cGMP_Z, "<<", r_gmpz_shl, 1);
1789
+ rb_define_method(cGMP_Z, "neg", r_gmpz_neg, 0);
1706
1790
  rb_define_method(cGMP_Z, "neg!", r_gmpz_neg_self, 0);
1791
+ rb_define_method(cGMP_Z, "-@", r_gmpz_neg, 0);
1792
+ rb_define_method(cGMP_Z, "abs", r_gmpz_abs, 0);
1793
+ rb_define_method(cGMP_Z, "abs!", r_gmpz_abs_self, 0);
1707
1794
 
1708
1795
  // Integer Division
1709
- rb_define_method(cGMP_Z, "/", r_gmpz_div, 1);
1796
+ rb_define_method(cGMP_Z, "/", r_gmpz_div, 1);
1710
1797
  rb_define_method(cGMP_Z, "tdiv", r_gmpz_tdiv, 1);
1711
1798
  rb_define_method(cGMP_Z, "tmod", r_gmpz_tmod, 1);
1712
1799
  rb_define_method(cGMP_Z, "fdiv", r_gmpz_fdiv, 1);
@@ -1715,15 +1802,30 @@ void init_gmpz()
1715
1802
  rb_define_method(cGMP_Z, "cmod", r_gmpz_cmod, 1);
1716
1803
 
1717
1804
  // Integer Exponentiation
1718
- rb_define_singleton_method(cGMP_Z, "pow", r_gmpzsg_pow, 2);
1805
+ rb_define_singleton_method(cGMP_Z, "pow", r_gmpzsg_pow, 2);
1806
+ rb_define_method(cGMP_Z, "**", r_gmpz_pow, 1);
1807
+ rb_define_method(cGMP_Z, "powmod", r_gmpz_powm, 2);
1719
1808
 
1720
1809
  // Integer Roots
1721
- rb_define_method(cGMP_Z, "root", r_gmpz_root, 1);
1810
+ rb_define_method(cGMP_Z, "root", r_gmpz_root, 1);
1811
+ rb_define_method(cGMP_Z, "sqrt", r_gmpz_sqrt, 0);
1812
+ rb_define_method(cGMP_Z, "sqrt!", r_gmpz_sqrt_self, 0);
1813
+ rb_define_method(cGMP_Z, "sqrtrem", r_gmpz_sqrtrem, 0);
1814
+ rb_define_method(cGMP_Z, "square?", r_gmpz_is_square, 0);
1815
+ rb_define_method(cGMP_Z, "power?", r_gmpz_is_power, 0);
1722
1816
 
1723
1817
  // Number Theoretic Functions
1724
- rb_define_method(cGMP_Z, "remove", r_gmpz_remove, 1);
1725
- rb_define_singleton_method(cGMP_Z, "fac", r_gmpzsg_fac, 1);
1726
- rb_define_singleton_method(cGMP_Z, "fib", r_gmpzsg_fib, 1);
1818
+ rb_define_method( cGMP_Z, "probab_prime?", r_gmpz_is_probab_prime, -1);
1819
+ rb_define_method( cGMP_Z, "nextprime", r_gmpz_nextprime, 0);
1820
+ rb_define_method( cGMP_Z, "nextprime!", r_gmpz_nextprime_self, 0);
1821
+ rb_define_alias( cGMP_Z, "next_prime", "nextprime");
1822
+ rb_define_alias( cGMP_Z, "next_prime!", "nextprime!");
1823
+ rb_define_method( cGMP_Z, "jacobi", r_gmpz_jacobi, 1);
1824
+ rb_define_singleton_method(cGMP_Z, "jacobi", r_gmpzsg_jacobi, 2);
1825
+ rb_define_method( cGMP_Z, "legendre", r_gmpz_legendre, 1);
1826
+ rb_define_method( cGMP_Z, "remove", r_gmpz_remove, 1);
1827
+ rb_define_singleton_method(cGMP_Z, "fac", r_gmpzsg_fac, 1);
1828
+ rb_define_singleton_method(cGMP_Z, "fib", r_gmpzsg_fib, 1);
1727
1829
 
1728
1830
  // Integer Comparisons
1729
1831
  rb_define_method(cGMP_Z, "<=>", r_gmpz_cmp, 1);
@@ -1734,9 +1836,6 @@ void init_gmpz()
1734
1836
  rb_define_method(cGMP_Z, "cmpabs", r_gmpz_cmpabs, 1);
1735
1837
 
1736
1838
  // _unsorted_
1737
- rb_define_method(cGMP_Z, "-@", r_gmpz_neg, 0);
1738
- rb_define_method(cGMP_Z, "abs", r_gmpz_abs, 0);
1739
- rb_define_method(cGMP_Z, "abs!", r_gmpz_abs_self, 0);
1740
1839
  rb_define_method(cGMP_Z, "com", r_gmpz_com, 0);
1741
1840
  rb_define_method(cGMP_Z, "com!", r_gmpz_com_self, 0);
1742
1841
  rb_define_method(cGMP_Z, "&", r_gmpz_and, 1);
@@ -1750,25 +1849,11 @@ void init_gmpz()
1750
1849
  rb_define_method(cGMP_Z, "odd?", r_gmpz_is_odd, 0);
1751
1850
  rb_define_method(cGMP_Z, "sgn", r_gmpz_sgn, 0);
1752
1851
 
1753
- rb_define_method(cGMP_Z, "**", r_gmpz_pow, 1);
1754
- rb_define_method(cGMP_Z, "powmod", r_gmpz_powm, 2);
1755
-
1756
1852
  rb_define_method(cGMP_Z, "==", r_gmpz_eq, 1);
1757
1853
  rb_define_method(cGMP_Z, ">>", r_gmpz_fshr, 1);
1758
- rb_define_method(cGMP_Z, "<<", r_gmpz_shl, 1);
1759
1854
  rb_define_method(cGMP_Z, "tshr", r_gmpz_tshr, 1);
1760
1855
  rb_define_method(cGMP_Z, "lastbits_sgn", r_gmpz_tshrm, 1);
1761
1856
  rb_define_method(cGMP_Z, "lastbits_pos", r_gmpz_fshrm, 1);
1762
- rb_define_method(cGMP_Z, "square?", r_gmpz_is_square, 0);
1763
- rb_define_method(cGMP_Z, "power?", r_gmpz_is_power, 0);
1764
- rb_define_method(cGMP_Z, "sqrt", r_gmpz_sqrt, 0);
1765
- rb_define_method(cGMP_Z, "sqrt!", r_gmpz_sqrt_self, 0);
1766
- rb_define_method(cGMP_Z, "sqrtrem", r_gmpz_sqrtrem, 0);
1767
- rb_define_method(cGMP_Z, "jacobi", r_gmpz_jacobi, 0);
1768
- rb_define_method(cGMP_Z, "legendre", r_gmpz_legendre, 0);
1769
- rb_define_method(cGMP_Z, "probab_prime?", r_gmpz_is_probab_prime, -1);
1770
- rb_define_method(cGMP_Z, "nextprime", r_gmpz_nextprime, 0);
1771
- rb_define_method(cGMP_Z, "nextprime!", r_gmpz_nextprime_self, 0);
1772
1857
  rb_define_method(cGMP_Z, "popcount", r_gmpz_popcount, 0);
1773
1858
 
1774
1859
  }