gmp 0.6.13 → 0.6.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -97,7 +97,7 @@ by me: gmp gem 0.5.47 on:
97
97
  GMP 5.0.1 (3.0.0)</td>
98
98
  </tr>
99
99
  <tr>
100
- <td rowspan="4">Mac OS X 10.6.8 on x86_64 (64-bit)</td>
100
+ <td rowspan="3">Mac OS X 10.6.8 on x86_64 (64-bit)</td>
101
101
  <td>(MRI) Ruby 1.8.7</td>
102
102
  <td>GMP 4.3.2 (2.4.2)<br />
103
103
  GMP 5.0.5 (3.1.1)</td>
@@ -284,6 +284,8 @@ Methods
284
284
  remove(n) remove all occurences of factor n
285
285
  popcount the number of bits equal to 1
286
286
  hamdist the hamming distance between two integers
287
+ out_raw output to IO object
288
+ inp_raw input from IO object
287
289
  sizeinbase(b) digits in base b
288
290
  size_in_bin digits in binary
289
291
  size number of limbs
data/ext/gmpz.c CHANGED
@@ -1,6 +1,7 @@
1
1
  #include <gmpz.h>
2
2
  #include <gmpq.h>
3
3
  #include <gmpf.h>
4
+ #include <ruby/io.h>
4
5
 
5
6
  /*
6
7
  * Document-class: GMP::Z
@@ -2675,6 +2676,61 @@ VALUE r_gmpz_getbit(VALUE self, VALUE bitnr)
2675
2676
  }
2676
2677
 
2677
2678
 
2679
+ /**********************************************************************
2680
+ * I/O of Integers *
2681
+ **********************************************************************/
2682
+
2683
+ /*
2684
+ * call-seq:
2685
+ * a.out_raw(stream) #=> Fixnum
2686
+ *
2687
+ * Output _a_ on IO object _stream_, in raw binary format. The integer is
2688
+ * written in a portable format, with 4 bytes of size information, and that
2689
+ * many bytes of limbs. Both the size and the limbs are written in decreasing
2690
+ * significance order (i.e., in big-endian).
2691
+ *
2692
+ * The output can be read with `GMP::Z.inp_raw`.
2693
+ *
2694
+ * Return the number of bytes written, or if an error occurred, return 0.
2695
+ */
2696
+ VALUE r_gmpz_out_raw(VALUE self, VALUE stream)
2697
+ {
2698
+ MP_INT *self_val;
2699
+ FILE *fd;
2700
+ mpz_get_struct(self, self_val);
2701
+ if (TYPE (stream) != T_FILE) {
2702
+ rb_raise (rb_eTypeError, "stream must be an IO.");
2703
+ }
2704
+ fd = rb_io_stdio_file (RFILE (stream)->fptr);
2705
+ return INT2FIX (mpz_out_raw (fd, self_val));
2706
+ }
2707
+
2708
+ /*
2709
+ * call-seq:
2710
+ * GMP::Z.inp_raw(a, stream) #=> Fixnum
2711
+ *
2712
+ * Input from IO object _stream_ in the format written by `GMP::Z#out_raw`, and
2713
+ * put the result in _a_. Return the number of bytes read, or if an error
2714
+ * occurred, return 0.
2715
+ */
2716
+ VALUE r_gmpzsg_inp_raw(VALUE klass, VALUE a_val, VALUE stream_val)
2717
+ {
2718
+ MP_INT *a;
2719
+ FILE *stream;
2720
+ (void)klass;
2721
+
2722
+ if (! GMPZ_P(a_val))
2723
+ typeerror_as(Z, "a");
2724
+
2725
+ if (TYPE (stream_val) != T_FILE)
2726
+ rb_raise (rb_eTypeError, "stream must be an IO.");
2727
+
2728
+ mpz_get_struct(a_val, a);
2729
+ stream = rb_io_stdio_file (RFILE (stream_val)->fptr);
2730
+ return INT2FIX (mpz_inp_raw (a, stream));
2731
+ }
2732
+
2733
+
2678
2734
  /**********************************************************************
2679
2735
  * Miscellaneous Integer Functions *
2680
2736
  **********************************************************************/
@@ -2903,6 +2959,11 @@ void init_gmpz()
2903
2959
  // Functional Mappings
2904
2960
  rb_define_singleton_method(cGMP_Z, "com", r_gmpzsg_com, 2);
2905
2961
 
2962
+ // I/O of Integers
2963
+ rb_define_method(cGMP_Z, "out_raw", r_gmpz_out_raw, 1);
2964
+ // Functional Mapping
2965
+ rb_define_singleton_method(cGMP_Z, "inp_raw", r_gmpzsg_inp_raw, 2);
2966
+
2906
2967
  // Miscellaneous Integer Functions
2907
2968
  rb_define_method(cGMP_Z, "even?", r_gmpz_is_even, 0);
2908
2969
  rb_define_method(cGMP_Z, "odd?", r_gmpz_is_odd, 0);
@@ -0,0 +1,50 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
+ require 'fileutils'
3
+
4
+ class TC_Z_IO < Test::Unit::TestCase
5
+ def setup
6
+ @two_pow_100 = GMP::Z.pow(GMP::Z(2), 100)
7
+ @three_pow_100 = GMP::Z.pow(GMP::Z(3), 100)
8
+ @rs = GMP::RandState.new
9
+ @rs.seed(13579)
10
+ end
11
+
12
+ def test_io_raw_with_two_pow_100
13
+ handle = File.new('test_io_raw', 'w')
14
+ @two_pow_100.out_raw(handle)
15
+ handle.close
16
+
17
+ handle = File.open('test_io_raw')
18
+ result = GMP::Z()
19
+ GMP::Z.inp_raw(result, handle)
20
+ FileUtils.rm('test_io_raw')
21
+ assert_equal(@two_pow_100, result, "GMP::Z should out_raw and inp_raw correctly")
22
+ end
23
+
24
+ def test_io_raw_with_three_pow_100
25
+ handle = File.new('test_io_raw', 'w')
26
+ @three_pow_100.out_raw(handle)
27
+ handle.close
28
+
29
+ handle = File.open('test_io_raw')
30
+ result = GMP::Z()
31
+ GMP::Z.inp_raw(result, handle)
32
+ FileUtils.rm('test_io_raw')
33
+ assert_equal(@three_pow_100, result, "GMP::Z should out_raw and inp_raw correctly")
34
+ end
35
+
36
+ def test_io_raw_randoms
37
+ 100.times do |i|
38
+ handle = File.new('test_io_raw', 'w')
39
+ z = @rs.urandomb(1024)
40
+ z.out_raw(handle)
41
+ handle.close
42
+
43
+ handle = File.open('test_io_raw')
44
+ result = GMP::Z()
45
+ GMP::Z.inp_raw(result, handle)
46
+ assert_equal(z, result, "GMP::Z should out_raw and inp_raw correctly")
47
+ end
48
+ FileUtils.rm('test_io_raw')
49
+ end
50
+ end
@@ -14,6 +14,7 @@ require './tc_z_submul'
14
14
  require './tc_z_logic'
15
15
  require './tc_z_exponentiation'
16
16
  require './tc_z_hamdist'
17
+ require './tc_z_io'
17
18
  require './tc_z_to_dis'
18
19
  require './tc_z_shifts_last_bits'
19
20
  require './tc_z_jac_leg_rem'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.13
4
+ version: 0.6.17
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-12-12 00:00:00.000000000 Z
13
+ date: 2012-12-13 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: gmp - providing Ruby bindings to the GMP library.
16
16
  email:
@@ -71,6 +71,7 @@ files:
71
71
  - test/tc_z_functional_mappings.rb
72
72
  - test/tc_z_gcd_lcm_invert.rb
73
73
  - test/tc_z_hamdist.rb
74
+ - test/tc_z_io.rb
74
75
  - test/tc_z_jac_leg_rem.rb
75
76
  - test/tc_z_logic.rb
76
77
  - test/tc_z_shifts_last_bits.rb