gmp 0.2.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +33 -0
- data/README.rdoc +117 -17
- data/benchmark/COPYING +674 -0
- data/benchmark/README +75 -0
- data/benchmark/divide +34 -0
- data/benchmark/gcd +38 -0
- data/benchmark/gexpr +0 -0
- data/benchmark/gexpr.c +359 -0
- data/benchmark/multiply +44 -0
- data/benchmark/rsa +93 -0
- data/benchmark/runbench +147 -0
- data/benchmark/version +1 -0
- data/ext/gmp.c +10 -8
- data/ext/gmpbench_timing.c +80 -0
- data/ext/gmprandstate.c +224 -0
- data/ext/gmpz.c +170 -61
- data/ext/ruby_gmp.h +43 -1
- data/manual.pdf +0 -0
- data/manual.tex +214 -20
- data/test/README +4 -11
- data/test/tc_division.rb +109 -0
- data/test/tc_random.rb +54 -0
- data/test/tc_z_gcd_lcm_invert.rb +57 -0
- data/test/test-12.rb +14 -0
- data/test/test-19.rb +13 -0
- data/test/test-20.rb +29 -0
- data/test/test-21.rb +37 -0
- data/test/test-22.rb +12 -0
- data/test/test-23.rb +11 -0
- data/test/test_helper.rb +6 -0
- data/test/unit_tests.rb +9 -94
- metadata +31 -10
data/ext/gmpz.c
CHANGED
@@ -30,6 +30,8 @@
|
|
30
30
|
* fmod r_gmpz_fmod mpz_fdiv_r
|
31
31
|
* cdiv r_gmpz_cdiv mpz_cdiv_q
|
32
32
|
* cmod r_gmpz_cmod mpz_cdiv_r
|
33
|
+
* % r_gmpz_mod mpz_mod
|
34
|
+
* \------------------------ mpz_mod_ui
|
33
35
|
* -@ r_gmpz_neg mpz_neg
|
34
36
|
* neg r_gmpz_neg mpz_neg
|
35
37
|
* neg! r_gmpz_neg_self mpz_neg
|
@@ -46,6 +48,9 @@
|
|
46
48
|
* probab_prime? r_gmpz_is_probab_prime mpz_probab_prime_p
|
47
49
|
* nextprime r_gmpz_nextprime mpz_nextprime
|
48
50
|
* nextprime! r_gmpz_nextprime_self mpz_nextprime
|
51
|
+
* gcd r_gmpz_gcd mpz_gcd
|
52
|
+
* \------------------------ mpz_gcd_ui
|
53
|
+
* invert r_gmpz_invert mpz_invert
|
49
54
|
* jacobi r_gmpz_jacobi mpz_jacobi
|
50
55
|
* #jacobi r_gmpzsg_jacobi mpz_jacobi
|
51
56
|
* legendre r_gmpz_legendre mpz_legendre
|
@@ -60,14 +65,11 @@
|
|
60
65
|
* scan1 r_gmpz_scan1 mpz_scan1
|
61
66
|
* even? r_gmpz_is_even mpz_even
|
62
67
|
* odd? r_gmpz_is_odd mpz_odd
|
68
|
+
* sizeinbase r_gmpz_sizeinbase mpz_sizeinbase
|
69
|
+
* size_in_bin r_gmpz_size_in_bin mpz_sizeinbits
|
63
70
|
* ...
|
64
71
|
*/
|
65
72
|
|
66
|
-
/*
|
67
|
-
* The goal is to organize this file in the same order that the GMP Manual
|
68
|
-
* is organized.
|
69
|
-
*/
|
70
|
-
|
71
73
|
/**********************************************************************
|
72
74
|
* Macros *
|
73
75
|
**********************************************************************/
|
@@ -222,9 +224,9 @@ static VALUE r_gmpzsg_##fname(VALUE klass, VALUE arg) \
|
|
222
224
|
|
223
225
|
/*
|
224
226
|
* call-seq:
|
225
|
-
* GMP::Z.new(arg)
|
227
|
+
* GMP::Z.new(arg = 0)
|
226
228
|
*
|
227
|
-
* Creates a new GMP::Z integer, with arg as its value, converting where
|
229
|
+
* Creates a new GMP::Z integer, with +arg+ as its value, converting where
|
228
230
|
* necessary.
|
229
231
|
*/
|
230
232
|
VALUE r_gmpzsg_new(int argc, VALUE *argv, VALUE klass)
|
@@ -239,7 +241,6 @@ VALUE r_gmpzsg_new(int argc, VALUE *argv, VALUE klass)
|
|
239
241
|
|
240
242
|
mpz_make_struct(res, res_val);
|
241
243
|
mpz_init(res_val);
|
242
|
-
|
243
244
|
rb_obj_call_init(res, argc, argv);
|
244
245
|
|
245
246
|
return res;
|
@@ -715,9 +716,12 @@ DEFUN_INT2INT(abs, mpz_abs)
|
|
715
716
|
|
716
717
|
/*
|
717
718
|
* call-seq:
|
718
|
-
* /
|
719
|
+
* a / b
|
719
720
|
*
|
720
|
-
* Divides
|
721
|
+
* Divides _a_ by _b_. Combines the different GMP division functions to
|
722
|
+
* provide what one is hopefully looking for. The result will either be
|
723
|
+
* an instance of GMP::Q or GMP::F, depending on _b_. _b_ can be an
|
724
|
+
* instance of any of the following:
|
721
725
|
* * GMP::Z
|
722
726
|
* * Fixnum
|
723
727
|
* * GMP::Q
|
@@ -732,48 +736,48 @@ VALUE r_gmpz_div(VALUE self, VALUE arg)
|
|
732
736
|
VALUE res;
|
733
737
|
unsigned int prec;
|
734
738
|
|
735
|
-
mpz_get_struct(self,self_val);
|
739
|
+
mpz_get_struct (self,self_val);
|
736
740
|
|
737
|
-
if (GMPZ_P(arg)) {
|
738
|
-
mpz_get_struct(arg, arg_val_z);
|
739
|
-
if (mpz_cmp_ui(arg_val_z, 0) == 0)
|
740
|
-
rb_raise(rb_eZeroDivError, "divided by 0");
|
741
|
-
mpq_make_struct_init(res, res_val_q);
|
742
|
-
mpq_set_num(res_val_q, self_val);
|
743
|
-
mpq_set_den(res_val_q, arg_val_z);
|
741
|
+
if (GMPZ_P (arg)) {
|
742
|
+
mpz_get_struct (arg, arg_val_z);
|
743
|
+
if (mpz_cmp_ui (arg_val_z, 0) == 0)
|
744
|
+
rb_raise (rb_eZeroDivError, "divided by 0");
|
745
|
+
mpq_make_struct_init (res, res_val_q);
|
746
|
+
mpq_set_num (res_val_q, self_val);
|
747
|
+
mpq_set_den (res_val_q, arg_val_z);
|
744
748
|
mpq_canonicalize (res_val_q);
|
745
|
-
} else if (FIXNUM_P(arg)) {
|
746
|
-
if (FIX2INT(arg) == 0)
|
747
|
-
rb_raise(rb_eZeroDivError, "divided by 0");
|
748
|
-
mpq_make_struct_init(res, res_val_q);
|
749
|
-
mpq_set_num(res_val_q, self_val);
|
750
|
-
mpz_set_ui(mpq_denref(res_val_q), FIX2INT(arg));
|
749
|
+
} else if (FIXNUM_P (arg)) {
|
750
|
+
if (FIX2INT (arg) == 0)
|
751
|
+
rb_raise (rb_eZeroDivError, "divided by 0");
|
752
|
+
mpq_make_struct_init (res, res_val_q);
|
753
|
+
mpq_set_num (res_val_q, self_val);
|
754
|
+
mpz_set_ui (mpq_denref (res_val_q), FIX2INT (arg));
|
751
755
|
mpq_canonicalize (res_val_q);
|
752
|
-
} else if (GMPQ_P(arg)) {
|
753
|
-
mpq_get_struct(arg, arg_val_q);
|
754
|
-
if (mpz_cmp_ui(mpq_numref(arg_val_q), 0) == 0)
|
755
|
-
rb_raise(rb_eZeroDivError, "divided by 0");
|
756
|
-
mpz_temp_init(tmp_z);
|
757
|
-
mpq_make_struct_init(res, res_val_q);
|
758
|
-
mpz_gcd(tmp_z, mpq_numref(arg_val_q), self_val);
|
759
|
-
mpz_divexact(mpq_numref(res_val_q), self_val, tmp_z);
|
760
|
-
mpz_divexact(mpq_denref(res_val_q), mpq_numref(arg_val_q), tmp_z);
|
761
|
-
mpz_mul(mpq_numref(res_val_q), mpq_numref(res_val_q), mpq_denref(arg_val_q));
|
762
|
-
mpz_temp_free(tmp_z);
|
756
|
+
} else if (GMPQ_P (arg)) {
|
757
|
+
mpq_get_struct (arg, arg_val_q);
|
758
|
+
if (mpz_cmp_ui (mpq_numref (arg_val_q), 0) == 0)
|
759
|
+
rb_raise (rb_eZeroDivError, "divided by 0");
|
760
|
+
mpz_temp_init (tmp_z);
|
761
|
+
mpq_make_struct_init (res, res_val_q);
|
762
|
+
mpz_gcd (tmp_z, mpq_numref (arg_val_q), self_val);
|
763
|
+
mpz_divexact (mpq_numref (res_val_q), self_val, tmp_z);
|
764
|
+
mpz_divexact (mpq_denref (res_val_q), mpq_numref (arg_val_q), tmp_z);
|
765
|
+
mpz_mul (mpq_numref (res_val_q), mpq_numref (res_val_q), mpq_denref (arg_val_q));
|
766
|
+
mpz_temp_free (tmp_z);
|
763
767
|
} else if (GMPF_P(arg)) {
|
764
|
-
mpf_get_struct_prec(arg, arg_val_f, prec);
|
765
|
-
mpf_make_struct_init(res, res_val_f, prec);
|
766
|
-
mpf_set_z(res_val_f, self_val);
|
767
|
-
mpf_div(res_val_f, res_val_f, arg_val_f);
|
768
|
-
} else if (BIGNUM_P(arg)) {
|
769
|
-
mpq_make_struct_init(res, res_val_q);
|
770
|
-
mpz_set_bignum(mpq_denref(res_val_q), arg);
|
771
|
-
if (mpz_cmp_ui(mpq_denref(res_val_q), 0) == 0)
|
772
|
-
rb_raise(rb_eZeroDivError, "divided by 0");
|
773
|
-
mpq_set_num(res_val_q, self_val);
|
774
|
-
mpq_canonicalize(res_val_q);
|
768
|
+
mpf_get_struct_prec (arg, arg_val_f, prec);
|
769
|
+
mpf_make_struct_init (res, res_val_f, prec);
|
770
|
+
mpf_set_z (res_val_f, self_val);
|
771
|
+
mpf_div (res_val_f, res_val_f, arg_val_f);
|
772
|
+
} else if (BIGNUM_P (arg)) {
|
773
|
+
mpq_make_struct_init (res, res_val_q);
|
774
|
+
mpz_set_bignum (mpq_denref (res_val_q), arg);
|
775
|
+
if (mpz_cmp_ui (mpq_denref (res_val_q), 0) == 0)
|
776
|
+
rb_raise (rb_eZeroDivError, "divided by 0");
|
777
|
+
mpq_set_num (res_val_q, self_val);
|
778
|
+
mpq_canonicalize (res_val_q);
|
775
779
|
} else {
|
776
|
-
typeerror(ZQFXB);
|
780
|
+
typeerror (ZQFXB);
|
777
781
|
}
|
778
782
|
return res;
|
779
783
|
}
|
@@ -884,6 +888,39 @@ DEFUN_INT_DIV(cdiv, mpz_cdiv_q)
|
|
884
888
|
*/
|
885
889
|
DEFUN_INT_DIV(cmod, mpz_cdiv_r)
|
886
890
|
|
891
|
+
/*
|
892
|
+
* call-seq:
|
893
|
+
* a % b
|
894
|
+
*
|
895
|
+
* Returns _a_ mod _b_. _b_ can be an instance any of the following:
|
896
|
+
* * GMP::Z
|
897
|
+
* * Fixnum
|
898
|
+
* * Bignum
|
899
|
+
*/
|
900
|
+
VALUE r_gmpz_mod(VALUE self, VALUE arg)
|
901
|
+
{
|
902
|
+
MP_INT *self_val, *arg_val, *res_val;
|
903
|
+
VALUE res;
|
904
|
+
|
905
|
+
mpz_get_struct(self,self_val);
|
906
|
+
|
907
|
+
if (GMPZ_P(arg)) {
|
908
|
+
mpz_make_struct_init(res, res_val);
|
909
|
+
mpz_get_struct(arg, arg_val);
|
910
|
+
mpz_mod(res_val, self_val, arg_val);
|
911
|
+
} else if (FIXNUM_P(arg)) {
|
912
|
+
mpz_make_struct_init(res, res_val);
|
913
|
+
mpz_mod_ui(res_val, self_val, FIX2INT(arg));
|
914
|
+
} else if (BIGNUM_P(arg)) {
|
915
|
+
mpz_make_struct_init(res, res_val);
|
916
|
+
mpz_set_bignum(res_val, arg);
|
917
|
+
mpz_mod(res_val, res_val, self_val);
|
918
|
+
} else {
|
919
|
+
typeerror(ZXB);
|
920
|
+
}
|
921
|
+
return res;
|
922
|
+
}
|
923
|
+
|
887
924
|
|
888
925
|
/**********************************************************************
|
889
926
|
* Integer Exponentiation *
|
@@ -1137,6 +1174,56 @@ VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self)
|
|
1137
1174
|
*/
|
1138
1175
|
DEFUN_INT2INT(nextprime, mpz_nextprime)
|
1139
1176
|
|
1177
|
+
VALUE r_gmpz_gcd(VALUE self, VALUE arg)
|
1178
|
+
{
|
1179
|
+
MP_INT *self_val, *arg_val, *res_val;
|
1180
|
+
VALUE res;
|
1181
|
+
|
1182
|
+
mpz_get_struct (self,self_val);
|
1183
|
+
|
1184
|
+
if (GMPZ_P (arg)) {
|
1185
|
+
mpz_make_struct_init (res, res_val);
|
1186
|
+
mpz_get_struct (arg, arg_val);
|
1187
|
+
mpz_gcd (res_val, self_val, arg_val);
|
1188
|
+
} else if (FIXNUM_P (arg)) {
|
1189
|
+
mpz_make_struct_init (res, res_val);
|
1190
|
+
mpz_gcd_ui (res_val, self_val, FIX2INT(arg));
|
1191
|
+
} else if (BIGNUM_P (arg)) {
|
1192
|
+
mpz_make_struct_init (res, res_val);
|
1193
|
+
mpz_set_bignum (res_val, arg);
|
1194
|
+
mpz_gcd (res_val, res_val, self_val);
|
1195
|
+
} else {
|
1196
|
+
typeerror (ZXB);
|
1197
|
+
}
|
1198
|
+
return res;
|
1199
|
+
}
|
1200
|
+
|
1201
|
+
VALUE r_gmpz_invert(VALUE self, VALUE arg)
|
1202
|
+
{
|
1203
|
+
MP_INT *self_val, *arg_val, *res_val;
|
1204
|
+
VALUE res;
|
1205
|
+
|
1206
|
+
mpz_get_struct (self,self_val);
|
1207
|
+
|
1208
|
+
if (GMPZ_P (arg)) {
|
1209
|
+
mpz_make_struct_init (res, res_val);
|
1210
|
+
mpz_get_struct (arg, arg_val);
|
1211
|
+
mpz_invert (res_val, self_val, arg_val);
|
1212
|
+
} else if (FIXNUM_P (arg)) {
|
1213
|
+
mpz_temp_alloc(arg_val);
|
1214
|
+
mpz_init_set_ui(arg_val, FIX2INT(arg));
|
1215
|
+
mpz_make_struct_init (res, res_val);
|
1216
|
+
mpz_invert (res_val, self_val, arg_val);
|
1217
|
+
} else if (BIGNUM_P (arg)) {
|
1218
|
+
mpz_make_struct_init (res, res_val);
|
1219
|
+
mpz_set_bignum (res_val, arg);
|
1220
|
+
mpz_invert (res_val, res_val, self_val);
|
1221
|
+
} else {
|
1222
|
+
typeerror (ZXB);
|
1223
|
+
}
|
1224
|
+
return res;
|
1225
|
+
}
|
1226
|
+
|
1140
1227
|
/*
|
1141
1228
|
* Document-method: jacobi
|
1142
1229
|
*
|
@@ -1322,7 +1409,7 @@ VALUE r_gmpz_remove(VALUE self, VALUE arg)
|
|
1322
1409
|
* GMP::Z.fac(3) #=> 6
|
1323
1410
|
* GMP::Z.fac(4) #=> 24
|
1324
1411
|
*/
|
1325
|
-
DEFUN_INT_SINGLETON_UI(fac,mpz_fac_ui)
|
1412
|
+
DEFUN_INT_SINGLETON_UI(fac, mpz_fac_ui)
|
1326
1413
|
/*
|
1327
1414
|
* Document-method: GMP::Z.fib
|
1328
1415
|
*
|
@@ -1343,7 +1430,7 @@ DEFUN_INT_SINGLETON_UI(fac,mpz_fac_ui)
|
|
1343
1430
|
* GMP::Z.fac(6) #=> 8
|
1344
1431
|
* GMP::Z.fac(7) #=> 13
|
1345
1432
|
*/
|
1346
|
-
DEFUN_INT_SINGLETON_UI(fib,mpz_fib_ui)
|
1433
|
+
DEFUN_INT_SINGLETON_UI(fib, mpz_fib_ui)
|
1347
1434
|
|
1348
1435
|
|
1349
1436
|
/**********************************************************************
|
@@ -1545,17 +1632,17 @@ VALUE r_gmpz_setbit(VALUE self, VALUE bitnr, VALUE set_to)
|
|
1545
1632
|
MP_INT *self_val;
|
1546
1633
|
int bitnr_val;
|
1547
1634
|
|
1548
|
-
mpz_get_struct(self, self_val);
|
1635
|
+
mpz_get_struct (self, self_val);
|
1549
1636
|
|
1550
|
-
if (FIXNUM_P(bitnr)) {
|
1637
|
+
if (FIXNUM_P (bitnr)) {
|
1551
1638
|
bitnr_val = FIX2INT (bitnr);
|
1552
1639
|
} else {
|
1553
|
-
typeerror_as(X, "index");
|
1640
|
+
typeerror_as (X, "index");
|
1554
1641
|
}
|
1555
|
-
if (RTEST(set_to)) {
|
1556
|
-
mpz_setbit(self_val, bitnr_val);
|
1642
|
+
if (RTEST (set_to)) {
|
1643
|
+
mpz_setbit (self_val, bitnr_val);
|
1557
1644
|
} else {
|
1558
|
-
mpz_clrbit(self_val, bitnr_val);
|
1645
|
+
mpz_clrbit (self_val, bitnr_val);
|
1559
1646
|
}
|
1560
1647
|
return Qnil;
|
1561
1648
|
}
|
@@ -1580,14 +1667,27 @@ VALUE r_gmpz_getbit(VALUE self, VALUE bitnr)
|
|
1580
1667
|
}
|
1581
1668
|
|
1582
1669
|
|
1583
|
-
/**********************************************************************
|
1584
|
-
* Integer Random Numbers *
|
1585
|
-
**********************************************************************/
|
1586
|
-
|
1587
1670
|
/**********************************************************************
|
1588
1671
|
* Miscellaneous Integer Functions *
|
1589
1672
|
**********************************************************************/
|
1590
1673
|
|
1674
|
+
VALUE r_gmpz_sizeinbase(VALUE self, VALUE base)
|
1675
|
+
{
|
1676
|
+
MP_INT *self_val;
|
1677
|
+
int base_val;
|
1678
|
+
mpz_get_struct (self, self_val);
|
1679
|
+
base_val = FIX2INT (base);
|
1680
|
+
return INT2FIX (mpz_sizeinbase (self_val, base_val));
|
1681
|
+
}
|
1682
|
+
|
1683
|
+
VALUE r_gmpz_size_in_bin(VALUE self)
|
1684
|
+
{
|
1685
|
+
MP_INT *self_val;
|
1686
|
+
mpz_get_struct (self, self_val);
|
1687
|
+
return INT2FIX (mpz_sizeinbase (self_val, 2));
|
1688
|
+
}
|
1689
|
+
|
1690
|
+
|
1591
1691
|
/**********************************************************************
|
1592
1692
|
* Integer Special Functions *
|
1593
1693
|
**********************************************************************/
|
@@ -1800,6 +1900,7 @@ void init_gmpz()
|
|
1800
1900
|
rb_define_method(cGMP_Z, "fmod", r_gmpz_fmod, 1);
|
1801
1901
|
rb_define_method(cGMP_Z, "cdiv", r_gmpz_cdiv, 1);
|
1802
1902
|
rb_define_method(cGMP_Z, "cmod", r_gmpz_cmod, 1);
|
1903
|
+
rb_define_method(cGMP_Z, "%", r_gmpz_mod, 1);
|
1803
1904
|
|
1804
1905
|
// Integer Exponentiation
|
1805
1906
|
rb_define_singleton_method(cGMP_Z, "pow", r_gmpzsg_pow, 2);
|
@@ -1820,6 +1921,8 @@ void init_gmpz()
|
|
1820
1921
|
rb_define_method( cGMP_Z, "nextprime!", r_gmpz_nextprime_self, 0);
|
1821
1922
|
rb_define_alias( cGMP_Z, "next_prime", "nextprime");
|
1822
1923
|
rb_define_alias( cGMP_Z, "next_prime!", "nextprime!");
|
1924
|
+
rb_define_method( cGMP_Z, "gcd", r_gmpz_gcd, 1);
|
1925
|
+
rb_define_method( cGMP_Z, "invert", r_gmpz_invert, 1);
|
1823
1926
|
rb_define_method( cGMP_Z, "jacobi", r_gmpz_jacobi, 1);
|
1824
1927
|
rb_define_singleton_method(cGMP_Z, "jacobi", r_gmpzsg_jacobi, 2);
|
1825
1928
|
rb_define_method( cGMP_Z, "legendre", r_gmpz_legendre, 1);
|
@@ -1835,7 +1938,7 @@ void init_gmpz()
|
|
1835
1938
|
rb_define_method(cGMP_Z, "<=", r_gmpz_cmp_le, 1);
|
1836
1939
|
rb_define_method(cGMP_Z, "cmpabs", r_gmpz_cmpabs, 1);
|
1837
1940
|
|
1838
|
-
//
|
1941
|
+
// Integer Logic and Bit Fiddling
|
1839
1942
|
rb_define_method(cGMP_Z, "com", r_gmpz_com, 0);
|
1840
1943
|
rb_define_method(cGMP_Z, "com!", r_gmpz_com_self, 0);
|
1841
1944
|
rb_define_method(cGMP_Z, "&", r_gmpz_and, 1);
|
@@ -1845,10 +1948,16 @@ void init_gmpz()
|
|
1845
1948
|
rb_define_method(cGMP_Z, "[]", r_gmpz_getbit, 1);
|
1846
1949
|
rb_define_method(cGMP_Z, "scan0", r_gmpz_scan0, 1);
|
1847
1950
|
rb_define_method(cGMP_Z, "scan1", r_gmpz_scan1, 1);
|
1951
|
+
|
1952
|
+
//Miscellaneous Integer Functions
|
1953
|
+
rb_define_method(cGMP_Z, "sizeinbase", r_gmpz_sizeinbase, 1);
|
1954
|
+
rb_define_alias( cGMP_Z, "size_in_base", "sizeinbase");
|
1955
|
+
rb_define_method(cGMP_Z, "size_in_bin", r_gmpz_size_in_bin, 0);
|
1956
|
+
|
1957
|
+
// _unsorted_
|
1848
1958
|
rb_define_method(cGMP_Z, "even?", r_gmpz_is_even, 0);
|
1849
1959
|
rb_define_method(cGMP_Z, "odd?", r_gmpz_is_odd, 0);
|
1850
1960
|
rb_define_method(cGMP_Z, "sgn", r_gmpz_sgn, 0);
|
1851
|
-
|
1852
1961
|
rb_define_method(cGMP_Z, "==", r_gmpz_eq, 1);
|
1853
1962
|
rb_define_method(cGMP_Z, ">>", r_gmpz_fshr, 1);
|
1854
1963
|
rb_define_method(cGMP_Z, "tshr", r_gmpz_tshr, 1);
|
data/ext/ruby_gmp.h
CHANGED
@@ -34,13 +34,21 @@ typedef __mpfr_struct MP_FLOAT;
|
|
34
34
|
typedef __mpf_struct MP_FLOAT;
|
35
35
|
#endif /* HAVE_MPF2MPFR_H */
|
36
36
|
|
37
|
+
/*
|
38
|
+
I don't like this solution, because in gmp.h, all of these typedefs are
|
39
|
+
marked with "gmp 1 source compatibility". :(.
|
40
|
+
*/
|
41
|
+
typedef __gmp_randstate_struct MP_RANDSTATE;
|
42
|
+
|
37
43
|
#define mpz_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_INT, c_var); }
|
38
44
|
#define mpq_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_RAT, c_var); }
|
39
45
|
#define mpf_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_FLOAT, c_var); }
|
46
|
+
#define mprandstate_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_RANDSTATE, c_var); }
|
40
47
|
#define mpf_get_struct_prec(ruby_var,c_var,prec) { mpf_get_struct(ruby_var,c_var); prec = mpf_get_prec(c_var); }
|
41
48
|
#define mpz_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Z, MP_INT, 0, r_gmpz_free, c_var); }
|
42
49
|
#define mpq_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Q, MP_RAT, 0, r_gmpq_free, c_var); }
|
43
50
|
#define mpf_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_F, MP_FLOAT, 0, r_gmpf_free, c_var); }
|
51
|
+
#define mprandstate_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_RandState, MP_RANDSTATE, 0, r_gmprandstate_free, c_var); }
|
44
52
|
#define mpz_make_struct_init(ruby_var,c_var) { mpz_make_struct(ruby_var,c_var); mpz_init (c_var); }
|
45
53
|
#define mpq_make_struct_init(ruby_var,c_var) { mpq_make_struct(ruby_var,c_var); mpq_init (c_var); }
|
46
54
|
#define mpf_make_struct_init(ruby_var,c_var,prec) { mpf_make_struct(ruby_var,c_var); mpf_init2 (c_var,prec); }
|
@@ -74,11 +82,12 @@ typedef __mpf_struct MP_FLOAT;
|
|
74
82
|
//should change exception type
|
75
83
|
#define not_yet rb_raise(rb_eTypeError,"Not implemented yet")
|
76
84
|
|
77
|
-
extern VALUE mGMP, cGMP_Z, cGMP_Q, cGMP_F;
|
85
|
+
extern VALUE mGMP, cGMP_Z, cGMP_Q, cGMP_F, cGMP_RandState;
|
78
86
|
|
79
87
|
extern void r_gmpz_free(void *ptr);
|
80
88
|
extern void r_gmpq_free(void *ptr);
|
81
89
|
extern void r_gmpf_free(void *ptr);
|
90
|
+
extern void r_gmprandstate_free(void *ptr);
|
82
91
|
|
83
92
|
|
84
93
|
/* from gmpz.h */
|
@@ -102,11 +111,16 @@ extern VALUE r_gmpz_sub(VALUE self, VALUE arg);
|
|
102
111
|
extern VALUE r_gmpz_sub_self(VALUE self, VALUE arg);
|
103
112
|
extern VALUE r_gmpz_mul(VALUE self, VALUE arg);
|
104
113
|
|
114
|
+
// Integer Division
|
115
|
+
extern VALUE r_gmpz_mod(VALUE self, VALUE arg);
|
116
|
+
|
105
117
|
// Integer Exponentiation
|
106
118
|
extern VALUE r_gmpzsg_pow(VALUE klass, VALUE base, VALUE exp);
|
107
119
|
|
108
120
|
// Number Theoretic Functions
|
109
121
|
extern VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self);
|
122
|
+
extern VALUE r_gmpz_gcd(VALUE self, VALUE arg);
|
123
|
+
extern VALUE r_gmpz_invert(VALUE self, VALUE arg);
|
110
124
|
extern VALUE r_gmpz_jacobi(VALUE self, VALUE b);
|
111
125
|
extern VALUE r_gmpzsg_jacobi(VALUE klass, VALUE a, VALUE b);
|
112
126
|
extern VALUE r_gmpz_legendre(VALUE self, VALUE p);
|
@@ -117,6 +131,10 @@ extern VALUE r_gmpz_eq(VALUE self, VALUE arg);
|
|
117
131
|
extern VALUE r_gmpz_cmp(VALUE self, VALUE arg);
|
118
132
|
extern VALUE r_gmpz_cmpabs(VALUE self, VALUE arg);
|
119
133
|
|
134
|
+
// Miscelaneous Integer Functions
|
135
|
+
extern VALUE r_gmpz_sizeinbase(VALUE self, VALUE base);
|
136
|
+
extern VALUE r_gmpz_size_in_bin(VALUE self);
|
137
|
+
|
120
138
|
// _unsorted_
|
121
139
|
extern VALUE r_gmpz_div(VALUE self, VALUE arg);
|
122
140
|
extern VALUE r_gmpz_popcount(VALUE self);
|
@@ -194,8 +212,32 @@ extern VALUE r_gmpf_sgn(VALUE self);
|
|
194
212
|
extern VALUE r_gmpf_get_prec(VALUE self);
|
195
213
|
|
196
214
|
|
215
|
+
/* from gmprandstate.h */
|
216
|
+
|
217
|
+
// Random State Initialization
|
218
|
+
extern VALUE r_gmprandstatesg_new(int argc, VALUE *argv, VALUE klass);
|
219
|
+
extern VALUE r_gmprandstate_initialize(int argc, VALUE *argv, VALUE self);
|
220
|
+
extern VALUE r_gmpmod_randstate(int argc, VALUE *argv, VALUE module);
|
221
|
+
|
222
|
+
// Random State Seeding
|
223
|
+
extern VALUE r_gmprandstate_seed(VALUE self, VALUE arg);
|
224
|
+
|
225
|
+
// Integer Random Numbers
|
226
|
+
extern VALUE r_gmprandstate_urandomb(VALUE self, VALUE arg);
|
227
|
+
|
228
|
+
|
229
|
+
/* from gmpbench_timing.c */
|
230
|
+
|
231
|
+
// GMPbench Timing
|
232
|
+
extern VALUE r_gmpmod_cputime(VALUE self);
|
233
|
+
extern VALUE r_gmpmod_time(VALUE self);
|
234
|
+
|
235
|
+
|
236
|
+
|
197
237
|
extern void init_gmpz();
|
198
238
|
extern void init_gmpq();
|
199
239
|
extern void init_gmpf();
|
240
|
+
extern void init_gmprandstate();
|
241
|
+
extern void init_gmpbench_timing();
|
200
242
|
|
201
243
|
#endif
|