ruby-mpfr 0.0.2 → 0.0.4

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.
Files changed (42) hide show
  1. data/History.txt +5 -2
  2. data/Manifest.txt +33 -7
  3. data/README.rdoc +10 -8
  4. data/Rakefile +4 -3
  5. data/ext/{extconf.rb → mpfr/extconf.rb} +4 -0
  6. data/ext/{ruby_mpfr.c → mpfr/ruby_mpfr.c} +466 -199
  7. data/ext/{ruby_mpfr.h → mpfr/ruby_mpfr.h} +2 -0
  8. data/ext/mpfr_matrix/mpfr/extconf.rb +7 -0
  9. data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.c +524 -0
  10. data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.h +72 -0
  11. data/ext/mpfr_matrix/mpfr/ruby_mpfr.h +40 -0
  12. data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.c +1056 -0
  13. data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.h +13 -0
  14. data/lib/mpfr/matrix.rb +145 -0
  15. data/lib/mpfr/version.rb +3 -0
  16. data/ruby-mpfr.gemspec +36 -0
  17. data/spec/mpfr/allocate_spec.rb +60 -0
  18. data/spec/mpfr/arithmetic_spec.rb +64 -0
  19. data/spec/mpfr/comparison_spec.rb +21 -0
  20. data/spec/mpfr/constant_spec.rb +23 -0
  21. data/spec/mpfr/conversion_spec.rb +14 -0
  22. data/spec/mpfr/exception_spec.rb +60 -0
  23. data/spec/mpfr/functions_spec.rb +25 -0
  24. data/spec/mpfr/generate_number_modulue.rb +44 -0
  25. data/spec/mpfr/precision_roundmode_spec.rb +65 -0
  26. data/spec/mpfr/rounding_spec.rb +51 -0
  27. data/spec/mpfr/set_value_spec.rb +77 -0
  28. data/spec/mpfr/spec_helper.rb +13 -0
  29. data/spec/mpfr/string_spec.rb +58 -0
  30. data/spec/mpfr_matrix/generate_matrix_arguments.rb +55 -0
  31. data/spec/mpfr_matrix/mpfr_matrix_alloc_spec.rb +126 -0
  32. data/spec/mpfr_matrix/mpfr_matrix_arithmetic_spec.rb +93 -0
  33. data/spec/mpfr_matrix/mpfr_matrix_set_element_spec.rb +55 -0
  34. data/spec/mpfr_matrix/mpfr_matrix_string_spec.rb +31 -0
  35. data/spec/mpfr_matrix/mpfr_square_matrix_spec.rb +75 -0
  36. data/spec/mpfr_matrix/spec_helper.rb +16 -0
  37. data/tasks/extconf.rake +36 -0
  38. metadata +48 -16
  39. data/lib/ruby-mpfr.rb +0 -6
  40. data/spec/ruby-mpfr_spec.rb +0 -11
  41. data/spec/spec_helper.rb +0 -10
  42. data/tasks/rspec.rake +0 -21
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ MPFR.set_default_prec(300)
4
+
5
+ describe MPFR, 'when setting abnormal number' do
6
+ it "should be set nan" do
7
+ a = MPFR.new(rand)
8
+ a.set_nan
9
+ a.nan?.should be_true
10
+ a.to_s.should == "nan"
11
+ end
12
+
13
+ it "should be set infinity" do
14
+ a = MPFR.new(rand)
15
+ a.set_inf(0)
16
+ a.infinite?.should be_true
17
+ a.to_s.should == "inf"
18
+
19
+ a.set_inf(1)
20
+ a.infinite?.should be_true
21
+ a.to_s.should == "inf"
22
+
23
+ a.set_inf(-1)
24
+ a.infinite?.should be_true
25
+ a.to_s.should == "-inf"
26
+ end
27
+ end
28
+
29
+ describe MPFR, 'when setting value' do
30
+ it "should swap each other" do
31
+ num = 100
32
+ args = [GenerateNumber.mpfr_args(num), GenerateNumber.mpfr_args(num)]
33
+ args[0].each_index{ |i| check_swap(args[0][i], args[1][i]) }
34
+ end
35
+
36
+ it "should set other value" do
37
+ [0, 3, 2.2, -0.2, '1.0e-3', '-2e14', '2225'].each{ |val| check_set(val) }
38
+ end
39
+
40
+ it "should set value by set_fixnum_2exp" do
41
+ for i in 0..100
42
+ check_fixnum_2exp(rand(100), rand(100))
43
+ end
44
+ end
45
+ end
46
+
47
+ def check_swap(a, b)
48
+ tmp_a = a.dup
49
+ tmp_b = b.dup
50
+ tmp_a.swap(tmp_b)
51
+ a.should == tmp_b
52
+ b.should == tmp_a
53
+ end
54
+
55
+ def check_set(val)
56
+ tmp = MPFR.new
57
+ tmp.set(val)
58
+ tmp2 = tmp.dup
59
+ a = (tmp2 + 3) / Math::PI
60
+ tmp.nan?.should_not be_true
61
+ tmp.should_not == a
62
+ end
63
+
64
+ def check_fixnum_2exp(num, exp)
65
+ ret = MPFR.new(num)
66
+ if exp < 0
67
+ for i in 0...(exp.abs)
68
+ ret /= MPFR.new(2)
69
+ end
70
+ else
71
+ for i in 0...exp
72
+ ret *= MPFR.new(2)
73
+ end
74
+ end
75
+ MPFR.new.set_fixnum_2exp(num, exp).should == ret
76
+ end
77
+
@@ -0,0 +1,13 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
10
+ $:.unshift(File.dirname(__FILE__) + '/../../ext')
11
+ $:.unshift(File.dirname(__FILE__))
12
+ require 'mpfr'
13
+ require "generate_number_modulue"
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR, "when converted to string" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(200)
6
+ @args = GenerateNumber.float(10).map{ |a| MPFR.new(a.to_s) }
7
+ end
8
+
9
+ it "should be to_s" do
10
+ @args.each do |a|
11
+ a.to_s.should match(/^(-|)[1-9]\.[0-9]+e[-+][0-9]+$/)
12
+ end
13
+ end
14
+
15
+ it "should be formatted string \"#<MPFR:%lx,'%.Re',%d>\" for inspect" do
16
+ @args.each do |a|
17
+ a.inspect.should match(/^#<MPFR:.+,'(-|)[1-9]\.[0-9]+e[-+][0-9]+',\d+>$/)
18
+ end
19
+ end
20
+
21
+ it "should be formatted string by to_strf" do
22
+ @args.each do |a|
23
+ a.to_strf("%.Re").should eql a.to_s
24
+ a.to_strf("%.RE").should match(/^(-|)[1-9]\.[0-9]+E[-+][0-9]+$/)
25
+ a.to_strf("%.Rf").should match(/^(-|)[0-9]*\.[0-9]*$/)
26
+ end
27
+
28
+ format = ["14.6", ".8", "10.10", "+10.4", "-10.4", "+012.2", "-012.2", "3.0"]
29
+ @args.each do |a|
30
+ MPFR.set_default_prec(100)
31
+ for i in 0...1000
32
+ a = rand(100) + rand
33
+ check_to_s_e(a, format)
34
+ check_to_s_e(-a, format)
35
+ # check_to_s_f(a, format)
36
+ # check_to_s_f(-a, format)
37
+ end
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ def check_to_s_e(float, format_ary)
44
+ a = MPFR.new(float)
45
+ format_ary.each do |format|
46
+ sprintf("%#{format}e", float).should == a.to_strf("%#{format}Re")
47
+ sprintf("%#{format}E", float).should == a.to_strf("%#{format}RE")
48
+ end
49
+ end
50
+
51
+ # Probably MPFR bug makes this test be failure. Need further investigations. (Tue Aug 18 10:43:51 2009)
52
+ def check_to_s_f(float, format_ary)
53
+ a = MPFR.new(float)
54
+ format_ary.each do |format|
55
+ sprintf("%#{format}f", float).should == a.to_strf("%#{format}Rf")
56
+ end
57
+ end
58
+
@@ -0,0 +1,55 @@
1
+ module GenerateNumber
2
+
3
+ def self.float_matrix_arguments(number, row, column, max = 100)
4
+ ret = []
5
+ (0...number).each do
6
+ ret << Array.new(row){ |j| Array.new(column){ |i| rand(max) - rand } }
7
+ for i in 0...(ret[-1].size)
8
+ ret[-1][i].map!{ |a| (rand > 0.5 ? -a : a) }
9
+ end
10
+ end
11
+ ret
12
+ end
13
+
14
+ def self.float_arguments(size, number, max = 100)
15
+ ret = Array.new(number){ |j| Array.new(size){ |i| rand(max) - rand } }
16
+ for i in 0...(ret.size)
17
+ case i % 4
18
+ when 1
19
+ ret[i].map!{ |a| -a }
20
+ when 2, 3
21
+ ret[i].map!{ |a| (rand > 0.5 ? -a : a) }
22
+ end
23
+ end
24
+ ret
25
+ end
26
+
27
+ def self.float(num, max = 100, &block)
28
+ if block_given?
29
+ for i in 0...num
30
+ a = rand(max) - rand
31
+ a = -a if rand > 0.5
32
+ yield(a)
33
+ end
34
+ else
35
+ ary = Array.new(num){ |i| rand(max) - rand }
36
+ ary.map!{ |a| (rand > 0.5 ? -a : a) }
37
+ end
38
+ end
39
+
40
+ def self.string(number)
41
+ prec = MPFR.get_default_prec
42
+ max = 2 ** prec
43
+ Array.new(number) do |i|
44
+ sign = ((rand > 0.5 ? '-' : ''))
45
+ "#{sign}#{rand(max)}.#{rand(max)}"
46
+ end
47
+ end
48
+
49
+ def self.mpfr_args(number)
50
+ ret = self.string(number)
51
+ ret.map!{ |a| MPFR.new(a) }
52
+ end
53
+
54
+
55
+ end
@@ -0,0 +1,126 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe "initialization of matrix" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(128)
6
+ @sizes = [[1, 2], [2, 3], [8, 5], [7, 3]]
7
+ @matrixes = @sizes.map{ |a| MPFR::Matrix.new(*a) }
8
+ end
9
+
10
+ it "should has size which equals size of array." do
11
+ @matrixes.each_with_index do |a, i|
12
+ a.size.should == (@sizes[i][0] * @sizes[i][1])
13
+ end
14
+ end
15
+
16
+ it "should has size of row which equals size of array." do
17
+ @matrixes.each_with_index do |a, i|
18
+ a.row_size.should == @sizes[i][0]
19
+ end
20
+ end
21
+
22
+ it "should has size of column which equals size of array." do
23
+ @matrixes.each_with_index do |a, i|
24
+ a.column_size.should == @sizes[i][1]
25
+ end
26
+ end
27
+
28
+ it "should have MPFR instances as elements." do
29
+ @matrixes.each do |m|
30
+ m.each { |a| a.should be_an_instance_of MPFR }
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ describe "argument error raises for invalid initialization argument" do
37
+ before(:all) do
38
+ MPFR.set_default_prec(256)
39
+ @data = [[[1, 2, 3], [0, 0]],
40
+ [[MPFR.new(0)], [MPFR.new(1), 3]]]
41
+ end
42
+
43
+ it "should make error for invalid array argument" do
44
+ @data.each do |ary|
45
+ lambda { MPFR::Matrix.new(ary) }.should raise_error ArgumentError
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "when methods of matrix 'dup' and 'transpose' are executed" do
51
+ before(:all) do
52
+ MPFR.set_default_prec(256)
53
+ @data = [[[1, 2], [3, 3]],
54
+ [[-1, 0.8], ['1.2342', 99]],
55
+ [[36.237582938, 7122], ['-1e7', 8237]],
56
+ [[-2.2738, 8.23, 9.237482], [11, '8237.2374', '1239']],
57
+ [[MPFR.new('23'), MPFR.new('123.23')], [MPFR.new(-3.2378), MPFR.new('1.2837')]]]
58
+ @matrixes = @data.map{ |a| MPFR::Matrix.new(a) }
59
+ end
60
+
61
+ it "should have MPFR instances as elements." do
62
+ @matrixes.each do |m|
63
+ m.each { |a| a.should be_an_instance_of MPFR }
64
+ end
65
+ end
66
+
67
+ it "should create matrix which has same values as original and different object id." do
68
+ @matrixes.each do |m|
69
+ new = m.dup
70
+ m.object_id.should_not == new.object_id
71
+ m.should == new
72
+ end
73
+ end
74
+
75
+ it "should has transposed values." do
76
+ @matrixes.each do |m|
77
+ id = m.object_id
78
+ old = m.dup
79
+ new = m.transpose
80
+ m.transpose!
81
+ m.should_not == old
82
+ m.should == new
83
+ m.object_id.should == id
84
+ m.object_id.should_not == new.object_id
85
+ m.column_size.should == old.row_size
86
+ m.row_size.should == old.column_size
87
+ end
88
+ end
89
+ end
90
+
91
+ describe "when methods of vector 'dup' and 'transpose' are executed" do
92
+ before(:all) do
93
+ MPFR.set_default_prec(768)
94
+ @data = [[1, 2, 3, 3],
95
+ [-1, 0.8, '1.2342', 99],
96
+ [36.237582938, 7122, '-1e7', 8237],
97
+ [-2.2738, 8.23, 9.237482, '8237.2374', '1239'],
98
+ [MPFR.new('23'), MPFR.new('123.23'), MPFR.new(-3.2378), MPFR.new('1.2837')]]
99
+ @column = @data.map{ |a| MPFR::ColumnVector.new(a) }
100
+ @row = @data.map{ |a| MPFR::RowVector.new(a) }
101
+ end
102
+
103
+ it "should create matrix which has same values as original and different object id." do
104
+ (@column + @row).each do |m|
105
+ new = m.dup
106
+ m.object_id.should_not == new.object_id
107
+ m.should == new
108
+ end
109
+ end
110
+
111
+ it "should change row vector to column vector and make the opposite changes" do
112
+ (@column + @row).each do |m|
113
+ id = m.object_id
114
+ old = m.dup
115
+ new = m.transpose
116
+ m.transpose!
117
+ m.should_not == old
118
+ m.should == new
119
+ m.object_id.should == id
120
+ m.object_id.should_not == new.object_id
121
+ m.column_size.should == old.row_size
122
+ m.row_size.should == old.column_size
123
+ end
124
+ end
125
+
126
+ end
@@ -0,0 +1,93 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR::Matrix, "when making matrix negative" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(512)
6
+ @row = 8
7
+ @column = 3
8
+ @args = GenerateNumber.float_matrix_arguments(1000, @row, @column).map{ |a| MPFR::Matrix.new(a) }
9
+ end
10
+
11
+ it "should be negative" do
12
+ zero_matrix = MPFR::Matrix.new(@row, @column)
13
+ @args.each { |m| (zero_matrix - m).should == m.neg }
14
+ end
15
+
16
+ end
17
+
18
+ describe MPFR::Matrix, "when arithmetic operator applies to 2x3 matrixies" do
19
+ before(:all) do
20
+ MPFR.set_default_prec(128)
21
+ @row = 2
22
+ @column = 3
23
+ @args = GenerateNumber.float_matrix_arguments(1000, @row, @column).map!{ |a| MPFR::Matrix.new(a) }
24
+ end
25
+
26
+ it "should be added" do
27
+ @args.each_index do |i|
28
+ if i > 0
29
+ res = @args[i-1] + @args[i]
30
+ (0...@row).each do |j|
31
+ (0...@column).each { |k| res[j, k].should eql(@args[i-1][j, k] + @args[i][j, k]) }
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ it "should be subtracted" do
38
+ @args.each_index do |i|
39
+ if i > 0
40
+ res = @args[i-1] + @args[i]
41
+ (0...@row).each do |j|
42
+ (0...@column).each { |k| res[j, k].should eql(@args[i-1][j, k] + @args[i][j, k]) }
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ it "should be multiplied" do
49
+ @args.each_index do |i|
50
+ if i > 0
51
+ trans = @args[i].transpose
52
+ res = @args[i-1] * trans
53
+ (0...@row).each do |j|
54
+ (0...@row).each do |k|
55
+ res2 = MPFR.new(0)
56
+ (0...@column).each { |l| res2 += @args[i-1][j, l] * trans[l, k] }
57
+ res[j, k].should eql res2
58
+ end
59
+ end
60
+ trans = @args[i-1].transpose
61
+ res = trans * @args[i]
62
+ (0...@column).each do |j|
63
+ (0...@column).each do |k|
64
+ res2 = MPFR.new(0)
65
+ (0...@row).each { |l| res2 += trans[j, l] * @args[i][l, k] }
66
+ res[j, k].should eql res2
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ it "should be multyplied by scalar" do
74
+ @args.each do |a|
75
+ scalar = MPFR.new(GenerateNumber.float(1)[0])
76
+ res = a.mul_scalar(scalar)
77
+ (0...@row).each do |j|
78
+ (0...@column).each { |k| res[j, k].should eql a[j, k] * scalar }
79
+ end
80
+ end
81
+ end
82
+
83
+ it "should be divided by scalar" do
84
+ @args.each do |a|
85
+ scalar = MPFR.new(GenerateNumber.float(1)[0])
86
+ res = a.div_scalar(scalar)
87
+ (0...@row).each do |j|
88
+ (0...@column).each { |k| res[j, k].should eql a[j, k] / scalar }
89
+ end
90
+ end
91
+ end
92
+
93
+ end
@@ -0,0 +1,55 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR::Matrix, "when setting number to particular element" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(128)
6
+ @row = 4
7
+ @column = 7
8
+ @matrix = MPFR::Matrix.new(@row, @column)
9
+ @source = GenerateNumber.float_matrix_arguments(1, @row, @column)[0]
10
+ end
11
+
12
+ it "should have elements which equals to source number." do
13
+ (0...(@matrix.row_size)).each do |i|
14
+ (0...(@matrix.column_size)).each do |j|
15
+ fr = MPFR.new(@source[i][j].to_s)
16
+ @matrix.set_element(i, j, fr)
17
+ @matrix[i, j].should eql fr
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ describe MPFR::Matrix, "when calculating row and column" do
25
+ before(:all) do
26
+ MPFR.set_default_prec(128)
27
+ @row = 6
28
+ @column = 4
29
+ @sources = GenerateNumber.float_matrix_arguments(100, @row, @column)
30
+ @matrixies = @sources.map { |a| MPFR::Matrix.new(a) }
31
+ end
32
+
33
+ it "should have row vector." do
34
+ @matrixies.each do |m|
35
+ (0...(m.column_size)).each do |i|
36
+ col = m.column(i)
37
+ (0...(m.row_size)).each do |j|
38
+ col[j].should eql m[j, i]
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ it "should have column vector." do
45
+ @matrixies.each do |m|
46
+ (0...(m.row_size)).each do |i|
47
+ row = m.row(i)
48
+ (0...(m.column_size)).each do |j|
49
+ row[j].should eql m[i, j]
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR::Matrix, "when MPFR instance is converted to string by some methods." do
4
+
5
+ before(:all) do
6
+ MPFR.set_default_prec(128)
7
+ @row = 2
8
+ @column = 3
9
+ @matrixes = ((0..100).map { |i| MPFR::Matrix.new(GenerateNumber.float_arguments(@column, @row)) })
10
+ end
11
+
12
+ it "should return array having strings." do
13
+ @matrixes.each do |m|
14
+ m.str_ary("%.Re").each_with_index do |s, i|
15
+ s.to_s.should eql m[i % @row, i / @row].to_s
16
+ end
17
+ end
18
+ end
19
+
20
+ it "should return inspect string." do
21
+ @matrixes.each do |m|
22
+ ins = m.inspect
23
+ ins.should match(/#{Regexp.escape(sprintf("%x", m.object_id))}/)
24
+ m.each do |a|
25
+ ins.should match(/#{Regexp.escape(a.to_s)}/)
26
+ end
27
+ end
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,75 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR::SquareMatrix, "when calculating LU decomposition" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(128)
6
+ @dim = 7
7
+ @matrixies = GenerateNumber.float_matrix_arguments(100, @dim, @dim).map{ |a| MPFR::SquareMatrix.new(a) }
8
+ @error = MPFR.new('1e-30')
9
+ end
10
+
11
+ it "should have lu decomposition" do
12
+ @matrixies.each do |mat|
13
+ l, u, indx = mat.lu_decomp
14
+ if l
15
+ mul = l * u
16
+ (0...(indx.size)).to_a.reverse.each do |i|
17
+ if i != indx[i]
18
+ row = mul.row(i)
19
+ (0...(mul.column_size)).each do |j|
20
+ mul.set_element(i, j, mul[indx[i], j])
21
+ mul.set_element(indx[i], j, row[j])
22
+ end
23
+ end
24
+ end
25
+ (0...(mat.row_size)).each do |i|
26
+ (0...(mat.column_size)).each do |j|
27
+ (mat[i, j] - mul[i, j]).abs.should < @error
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ describe MPFR::SquareMatrix, "when calculating determinant" do
36
+ before(:all) do
37
+ MPFR.set_default_prec(512)
38
+ @error = MPFR.new('1e-30')
39
+ end
40
+
41
+ it "should have the same values of determinant by formula and lu decomposition" do
42
+ [2, 3].each do |dim|
43
+ GenerateNumber.float_matrix_arguments(100, dim, dim).each do |src|
44
+ m = MPFR::SquareMatrix.new(src)
45
+ l, u, idx = m.lu_decomp
46
+ if l
47
+ det = MPFR.new(1)
48
+ (0...(u.row_size)).each { |i| det *= u[i, i] }
49
+ count = 0
50
+ idx.each_with_index { |ind, i| count += (ind != i ? 1 : 0) }
51
+ det = -det if count % 2 == 1
52
+ (det - m.determinant).should < @error
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ it "should have the same values of determinant by formula and lu decomposition" do
59
+ [4, 5, 6].each do |dim|
60
+ GenerateNumber.float_matrix_arguments(100, dim, dim).each do |src|
61
+ m = MPFR::SquareMatrix.new(src)
62
+ l, u, idx = m.lu_decomp
63
+ if l
64
+ det = MPFR.new(1)
65
+ (0...(u.row_size)).each { |i| det *= u[i, i] }
66
+ count = 0
67
+ idx.each_with_index { |ind, i| count += (ind != i ? 1 : 0) }
68
+ det = -det if count % 2 == 1
69
+ (det - m.determinant).should < @error
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ end
@@ -0,0 +1,16 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
10
+ $:.unshift(*Dir.glob(File.dirname(__FILE__) + '/../../ext/*'))
11
+ $:.unshift(File.dirname(__FILE__))
12
+
13
+ require 'mpfr'
14
+ require 'mpfr/matrix'
15
+ require "generate_matrix_arguments"
16
+
@@ -0,0 +1,36 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run 'make realclean' for extended libraries"
18
+ task "ext:realclean" do
19
+ Dir.glob("ext/**/Makefile").each do |path|
20
+ system("cd #{File.dirname(path)}; make realclean")
21
+ end
22
+ end
23
+
24
+ desc "Run 'make clean' for extended libraries"
25
+ task "ext:clean" do
26
+ Dir.glob("ext/**/Makefile").each do |path|
27
+ system("cd #{File.dirname(path)}; make clean")
28
+ end
29
+ end
30
+
31
+ desc "Run 'make realclean' for extended libraries"
32
+ task 'ext:make' do
33
+ Dir.glob("ext/**/extconf.rb").each do |path|
34
+ system("cd #{File.dirname(path)}; ruby extconf.rb && make")
35
+ end
36
+ end