gmp 0.4.0-x86-mingw32
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.
- data/CHANGELOG +109 -0
- data/INSTALL +4 -0
- data/README.rdoc +357 -0
- 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/extconf.rb +30 -0
- data/ext/gmp.c +197 -0
- data/ext/gmpbench_timing.c +80 -0
- data/ext/gmpf.c +595 -0
- data/ext/gmpf.h +144 -0
- data/ext/gmpq.c +780 -0
- data/ext/gmpq.h +12 -0
- data/ext/gmprandstate.c +224 -0
- data/ext/gmpz.c +1968 -0
- data/ext/gmpz.h +20 -0
- data/ext/libgmp-10.dll +0 -0
- data/ext/ruby_gmp.h +243 -0
- data/ext/takeover.h +36 -0
- data/manual.pdf +0 -0
- data/manual.tex +804 -0
- data/test/README +34 -0
- data/test/tc_cmp.rb +74 -0
- data/test/tc_division.rb +109 -0
- data/test/tc_f_arithmetics_coersion.rb +71 -0
- data/test/tc_f_precision.rb +48 -0
- data/test/tc_fib_fac_nextprime.rb +51 -0
- data/test/tc_floor_ceil_truncate.rb +21 -0
- data/test/tc_logical_roots.rb +48 -0
- data/test/tc_q.rb +27 -0
- data/test/tc_q_basic.rb +41 -0
- data/test/tc_random.rb +54 -0
- data/test/tc_sgn_neg_abs.rb +47 -0
- data/test/tc_swap.rb +19 -0
- data/test/tc_z.rb +71 -0
- data/test/tc_z_basic.rb +35 -0
- data/test/tc_z_exponentiation.rb +22 -0
- data/test/tc_z_gcd_lcm_invert.rb +57 -0
- data/test/tc_z_jac_leg_rem.rb +73 -0
- data/test/tc_z_logic.rb +54 -0
- data/test/tc_z_shifts_last_bits.rb +22 -0
- data/test/tc_z_to_d_to_i.rb +24 -0
- data/test/tc_zerodivisionexceptions.rb +17 -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 +8 -0
- data/test/unit_tests.rb +39 -0
- metadata +115 -0
data/test/tc_q.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TC_Q < Test::Unit::TestCase
|
4
|
+
def test_init_null
|
5
|
+
assert_equal(GMP::Q.new(), 0, "GMP::Q.new() should initialize to 0")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_init_fixnum
|
9
|
+
assert_equal(GMP::Q.new(1), 1, "GMP::Q.new(x : Fixnum) should initialize to 0")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_init_fixnum2
|
13
|
+
assert_equal(GMP::Q.new(1, 2).to_s, "1/2", "GMP::Q.new(num : Fixnum, den : Fixnum) should initialize to num/den")
|
14
|
+
assert_equal(GMP::Q.new(1, 3).to_s, "1/3", "GMP::Q.new(num : Fixnum, den : Fixnum) should initialize to num/den")
|
15
|
+
assert_equal(GMP::Q.new(2, 4).to_s, "1/2", "GMP::Q.new(num : Fixnum, den : Fixnum) should initialize to num/den")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_init_string
|
19
|
+
assert_equal(GMP::Q.new("1/2").to_s, "1/2", "GMP::Q.new(x : String) should initialize to x")
|
20
|
+
assert_equal(GMP::Q.new("1/3").to_s, "1/3", "GMP::Q.new(x : String) should initialize to x")
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_init_q
|
24
|
+
a = GMP::Q.new(1,2)
|
25
|
+
assert_equal(GMP::Q.new(a), a, "GMP::Q.new(x : Q) should initialize to x")
|
26
|
+
end
|
27
|
+
end
|
data/test/tc_q_basic.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# [Q op Q, Q op Z, Z op Q, Q op FixNum, Q op BigNum, FixNum op Q, BigNum op Q]
|
4
|
+
class TC_Q_Basic < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@a=GMP::Q.new(100,11)
|
7
|
+
@b=GMP::Q.new(200,17)
|
8
|
+
@c=GMP::Z.new(40)
|
9
|
+
@d=2**32
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_add
|
13
|
+
assert_equal(@a + @b, GMP::Q(3900, 187), "GMP::Q should add GMP::Q correctly")
|
14
|
+
assert_equal(@a + @c, GMP::Q(540, 11), "GMP::Q should add GMP::Z correctly")
|
15
|
+
assert_equal(@c + @a, GMP::Q(540, 11), "GMP::Z should add GMP::Q correctly")
|
16
|
+
assert_equal(@a + 2, GMP::Q(122, 11), "GMP::Z should add Fixnum correctly")
|
17
|
+
assert_equal(@a + @d, GMP::Q(47244640356, 11), "GMP::Z should add Bignum correctly")
|
18
|
+
assert_equal( 2 + @a, GMP::Q(122, 11), "Fixnum should add GMP::Q correctly")
|
19
|
+
assert_equal(@d + @a, GMP::Q(47244640356, 11), "Bignum should add GMP::Q correctly")
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_sub
|
23
|
+
assert_equal(@a - @b, GMP::Q(-500, 187), "GMP::Q should subtract GMP::Q correctly")
|
24
|
+
assert_equal(@a - @c, GMP::Q(-340, 11), "GMP::Q should subtract GMP::Z correctly")
|
25
|
+
assert_equal(@c - @a, GMP::Q(340, 11), "GMP::Z should subtract GMP::Q correctly")
|
26
|
+
assert_equal(@a - 2, GMP::Q(78, 11), "GMP::Z should subtract Fixnum correctly")
|
27
|
+
assert_equal(@a - @d, GMP::Q(-47244640156, 11),"GMP::Z should subtract Bignum correctly")
|
28
|
+
assert_equal( 2 - @a, GMP::Q(-78, 11), "Fixnum should subtract GMP::Q correctly")
|
29
|
+
assert_equal(@d - @a, GMP::Q(47244640156, 11), "Bignum should subtract GMP::Q correctly")
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_mul
|
33
|
+
assert_equal(@a * @b, GMP::Q(20000, 187), "GMP::Q should multiply GMP::Q correctly")
|
34
|
+
assert_equal(@a * @c, GMP::Q(4000, 11), "GMP::Q should multiply GMP::Z correctly")
|
35
|
+
assert_equal(@c * @a, GMP::Q(4000, 11), "GMP::Z should multiply GMP::Q correctly")
|
36
|
+
assert_equal(@a * 2, GMP::Q(200, 11), "GMP::Z should multiply Fixnum correctly")
|
37
|
+
# assert_equal(@a * @d, GMP::Q(429496729600, 11),"GMP::Z should multiply Bignum correctly") # SEGFAULT
|
38
|
+
assert_equal( 2 * @a, GMP::Q(200, 11), "Fixnum should multiply GMP::Q correctly")
|
39
|
+
# assert_equal(@d * @a, GMP::Q(429496729600, 11),"Bignum should multiply GMP::Q correctly") # SEGFAULT
|
40
|
+
end
|
41
|
+
end
|
data/test/tc_random.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TC_Random < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_urandomb
|
8
|
+
@a = GMP::RandState.new
|
9
|
+
@a.seed(13579)
|
10
|
+
g1 = [ 392, 507, 1657, 3963, 2275, 1264, 2370, 2152, 3282, 407,
|
11
|
+
1746, 2488, 1753, 1639, 721, 3291, 3697, 2258, 3990, 1019]
|
12
|
+
g1.size.times do |i|
|
13
|
+
assert_equal(g1[i], @a.urandomb(12), "GMP::RandState should urandomb predictably.")
|
14
|
+
end
|
15
|
+
|
16
|
+
@b = GMP::RandState.new
|
17
|
+
@b.seed(314159)
|
18
|
+
g2 = [ 20, 5, 40, 228, 223, 205, 1750, 690, 5794, 13752,
|
19
|
+
31377, 49064, 37010, 187285, 489973, 312091, 550520, 916752, 3213943, 1561294]
|
20
|
+
g2.size.times do |i|
|
21
|
+
assert_equal(g2[i], @b.urandomb(i+5), "GMP::RandState should urandomb predictably.")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_reseed
|
26
|
+
@c = GMP::RandState.new
|
27
|
+
@c.seed(1000)
|
28
|
+
assert_equal( 6461, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
29
|
+
assert_equal(42961, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
30
|
+
assert_equal(44699, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
31
|
+
@c.seed(1000)
|
32
|
+
assert_equal( 6461, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
33
|
+
assert_equal(42961, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
34
|
+
assert_equal(44699, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
35
|
+
@c.seed(1000)
|
36
|
+
assert_equal( 6461, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
37
|
+
assert_equal(42961, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
38
|
+
assert_equal(44699, @c.urandomb(16), "GMP::RandState should re-seed correctly.")
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_random_independent_states
|
42
|
+
@d = GMP::RandState.new
|
43
|
+
@d.seed(13579)
|
44
|
+
@e = GMP::RandState.new
|
45
|
+
@e.seed(13579)
|
46
|
+
|
47
|
+
assert_equal( 392, @d.urandomb(12), "GMP::RandState should be independent correctly.")
|
48
|
+
assert_equal( 507, @d.urandomb(12), "GMP::RandState should be independent correctly.")
|
49
|
+
assert_equal( 392, @e.urandomb(12), "GMP::RandState should be independent correctly.")
|
50
|
+
assert_equal( 507, @e.urandomb(12), "GMP::RandState should be independent correctly.")
|
51
|
+
assert_equal(1657, @d.urandomb(12), "GMP::RandState should be independent correctly.")
|
52
|
+
assert_equal(1657, @e.urandomb(12), "GMP::RandState should be independent correctly.")
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TC_sgn_neg_abs < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@a=GMP::Z.new(10)
|
6
|
+
@b=GMP::Z.new()
|
7
|
+
@c=GMP::Z.new(-10)
|
8
|
+
@d=GMP::Q.new(10)
|
9
|
+
@e=GMP::Q.new()
|
10
|
+
@f=GMP::Q.new(-10)
|
11
|
+
@k=GMP::Z.new(10)
|
12
|
+
@l=GMP::Z.new()
|
13
|
+
@m=GMP::Z.new(-10)
|
14
|
+
@n=GMP::Q.new(10)
|
15
|
+
@o=GMP::Q.new()
|
16
|
+
@p=GMP::Q.new(-10)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_sgn
|
20
|
+
assert_equal([1, 0, 1, 0], [@a.sgn, @b.sgn, @d.sgn, @e.sgn], "GMP::Z, GMP::Q should calculate sgn correctly")
|
21
|
+
assert_equal([-1, -1], [@c.sgn, @f.sgn], "GMP::Z, GMP::Q should calculate sgn correctly")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_neg
|
25
|
+
assert_equal(-@a, @c, "-(x : GMP::Z) should be calculated correctly.")
|
26
|
+
assert_equal(-@c, @a, "-(x : GMP::Z) should be calculated correctly.")
|
27
|
+
assert_equal(-@b, @b, "-GMP::Z.new() should equal GMP::Z.new().")
|
28
|
+
assert_equal(-@d, @f, "-(x : GMP::Q) should be calculated correctly.")
|
29
|
+
assert_equal(-@f, @d, "-(x : GMP::Q) should be calculated correctly.")
|
30
|
+
assert_equal(-@e, @e, "-GMP::Q.new() should equal GMP::Q.new().")
|
31
|
+
@k.neg!; @l.neg!; @m.neg!; @n.neg!; @o.neg!; @p.neg!
|
32
|
+
assert_equal(@k, @c, "(x : GMP::Z).neg! should be calculated correctly.")
|
33
|
+
assert_equal(@l, @b, "(x : GMP::Z).neg! should be calculated correctly.")
|
34
|
+
assert_equal(@m, @a, "GMP::Z.new().neg! should equal GMP::Z.new().")
|
35
|
+
assert_equal(@n, @f, "(x : GMP::Q).neg! should be calculated correctly.")
|
36
|
+
assert_equal(@o, @e, "(x : GMP::Q).neg! should be calculated correctly.")
|
37
|
+
assert_equal(@p, @d, "GMP::Q.new().neg! should equal GMP::Q.new().")
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_abs
|
41
|
+
assert_equal([10, 0, 10], [@a.abs, @b.abs, @c.abs], "(x : GMP::Z).abs should be calculated correctly.")
|
42
|
+
assert_equal([10, 0, 10], [@d.abs, @e.abs, @f.abs], "(x : GMP::Q).abs should be calculated correctly.")
|
43
|
+
@a.abs!; @b.abs!; @c.abs!; @d.abs!; @e.abs!; @f.abs!
|
44
|
+
assert_equal([10, 0, 10], [@a, @b, @c], "(x : GMP::Z).abs! should be calculated correctly.")
|
45
|
+
assert_equal([10, 0, 10], [@d, @e, @f], "(x : GMP::Q).abs! should be calculated correctly.")
|
46
|
+
end
|
47
|
+
end
|
data/test/tc_swap.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TC_swap < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@a=GMP::Z.new(100)
|
6
|
+
@b=GMP::Z.new(200)
|
7
|
+
@c=GMP::Q.new(100,11)
|
8
|
+
@d=GMP::Q.new(200,17)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_swap
|
12
|
+
@a.swap @b
|
13
|
+
@c.swap @d
|
14
|
+
assert_equal(@a, 200, "GMP::Z should swap with GMP::Z.")
|
15
|
+
assert_equal(@b, 100, "GMP::Z should swap with GMP::Z.")
|
16
|
+
assert_equal(@c, GMP::Q.new(200,17), "GMP::Z should swap with GMP::Z.")
|
17
|
+
assert_equal(@d, GMP::Q.new(100,11), "GMP::Z should swap with GMP::Z.")
|
18
|
+
end
|
19
|
+
end
|
data/test/tc_z.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TC_Z < Test::Unit::TestCase
|
4
|
+
def test_init_null
|
5
|
+
assert_equal(GMP::Z.new(), 0, "GMP::Z.new() should initialize to 0")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_init_fixnum
|
9
|
+
assert_equal(GMP::Z.new(1), 1, "GMP::Z.new(x : Fixnum) should initialize to x")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_init_z
|
13
|
+
b = GMP::Z.new(1)
|
14
|
+
assert_equal(GMP::Z.new(b), b, "GMP::Z.new(x : GMP::Z) should initialize to x")
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_init_string
|
18
|
+
assert_equal(GMP::Z.new("1"), 1, "GMP::Z.new(x : String) should initialize to x")
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_init_bignum
|
22
|
+
assert_equal(GMP::Z.new(2**32), 2**32, "GMP::Z.new(x : Bignum) should initialize to x")
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_cmp_z
|
26
|
+
a = GMP::Z.new(2)
|
27
|
+
b = GMP::Z.new(1)
|
28
|
+
assert_equal(a > b, true, "GMP::Z should compare correctly with GMP::Z")
|
29
|
+
assert_equal(a > a, false, "GMP::Z should compare correctly with GMP::Z")
|
30
|
+
assert_equal(b > a, false, "GMP::Z should compare correctly with GMP::Z")
|
31
|
+
|
32
|
+
assert_equal(a >= b, true, "GMP::Z should compare correctly with GMP::Z")
|
33
|
+
assert_equal(a >= a, true, "GMP::Z should compare correctly with GMP::Z")
|
34
|
+
assert_equal(b >= a, false, "GMP::Z should compare correctly with GMP::Z")
|
35
|
+
|
36
|
+
assert_equal(a <= b, false, "GMP::Z should compare correctly with GMP::Z")
|
37
|
+
assert_equal(a <= a, true, "GMP::Z should compare correctly with GMP::Z")
|
38
|
+
assert_equal(b <= a, true, "GMP::Z should compare correctly with GMP::Z")
|
39
|
+
|
40
|
+
assert_equal(a < b, false, "GMP::Z should compare correctly with GMP::Z")
|
41
|
+
assert_equal(a < a, false, "GMP::Z should compare correctly with GMP::Z")
|
42
|
+
assert_equal(b < a, true, "GMP::Z should compare correctly with GMP::Z")
|
43
|
+
|
44
|
+
assert_equal(a == b, false, "GMP::Z should == correctly with GMP::Z")
|
45
|
+
assert_equal(a == a, true, "GMP::Z should == correctly with GMP::Z")
|
46
|
+
|
47
|
+
assert_equal(a != b, true, "GMP::Z should != correctly with GMP::Z")
|
48
|
+
assert_equal(a != a, false, "GMP::Z should != correctly with GMP::Z")
|
49
|
+
|
50
|
+
assert_equal(a <=> b, 1, "GMP::Z should <=> correctly with GMP::Z")
|
51
|
+
assert_equal(a <=> a, 0, "GMP::Z should <=> correctly with GMP::Z")
|
52
|
+
assert_equal(b <=> a, -1, "GMP::Z should <=> correctly with GMP::Z")
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_to_s
|
56
|
+
assert_equal("1", GMP::Z.new(1).to_s, "Z(1).to_s should equal '1'")
|
57
|
+
assert_equal("-1", GMP::Z.new(-1).to_s, "Z(1).to_s should equal '-1'")
|
58
|
+
assert_equal("1234567890", GMP::Z.new(1234567890).to_s, "GMP::Z should to_s correctly.")
|
59
|
+
assert_equal("100000", GMP::Z.new(32).to_s( 2), "GMP::Z should to_s( 2) correctly.")
|
60
|
+
assert_equal("200", GMP::Z.new(32).to_s( 4), "GMP::Z should to_s( 4) correctly.")
|
61
|
+
assert_equal("40", GMP::Z.new(32).to_s( 8), "GMP::Z should to_s( 8) correctly.")
|
62
|
+
assert_equal("32", GMP::Z.new(32).to_s( 10), "GMP::Z should to_s( 10) correctly.")
|
63
|
+
assert_equal("20", GMP::Z.new(32).to_s( 16), "GMP::Z should to_s( 16) correctly.")
|
64
|
+
assert_equal("a", GMP::Z.new(10).to_s( 16), "GMP::Z should to_s( 16) correctly.")
|
65
|
+
assert_equal("A", GMP::Z.new(10).to_s( -16), "GMP::Z should to_s( -16) correctly.")
|
66
|
+
assert_equal("11111111", GMP::Z.new(255).to_s(:bin), "GMP::Z should to_s(:bin) correctly.")
|
67
|
+
assert_equal("377", GMP::Z.new(255).to_s(:oct), "GMP::Z should to_s(:oct) correctly.")
|
68
|
+
assert_equal("255", GMP::Z.new(255).to_s(:dec), "GMP::Z should to_s(:dec) correctly.")
|
69
|
+
assert_equal("ff", GMP::Z.new(255).to_s(:hex), "GMP::Z should to_s(:hex) correctly.")
|
70
|
+
end
|
71
|
+
end
|
data/test/tc_z_basic.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# Tested: [Z op Z, Z op FixNum, Z op BigNum, FixNum op Z, BigNum op Z]
|
4
|
+
# Things are tested both ways because the implementation is asymetrical
|
5
|
+
class TC_Z_Basic < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@a=GMP::Z.new(100)
|
8
|
+
@b=GMP::Z.new(200)
|
9
|
+
@c=2**32
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_add
|
13
|
+
assert_equal(@a + @b, 100 + 200, "GMP::Z should add correctly")
|
14
|
+
assert_equal(@a + 2, 100 + 2, "GMP::Z should add correctly")
|
15
|
+
assert_equal(@a + @c, 100 + 2**32, "GMP::Z should add correctly")
|
16
|
+
assert_equal( 2 + @a, 2 + 100, "GMP::Z should add correctly")
|
17
|
+
assert_equal(@c + @a, 2**32 + 100, "GMP::Z should add correctly")
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_sub
|
21
|
+
assert_equal(@a - @b, 100 - 200, "GMP::Z should subtract correctly")
|
22
|
+
assert_equal(@a - 2, 100 - 2, "GMP::Z should subtract correctly")
|
23
|
+
assert_equal(@a - @c, 100 - 2**32, "GMP::Z should subtract correctly")
|
24
|
+
assert_equal( 2 - @a, 2 - 100, "GMP::Z should subtract correctly")
|
25
|
+
assert_equal(@c - @a, 2**32 - 100, "GMP::Z should subtract correctly")
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_mul
|
29
|
+
assert_equal(@a * @b, 100 * 200, "GMP::Z should multiply correctly")
|
30
|
+
assert_equal(@a * 2, 100 * 2, "GMP::Z should multiply correctly")
|
31
|
+
assert_equal(@a * @c, 100 * 2**32, "GMP::Z should multiply correctly")
|
32
|
+
assert_equal( 2 * @a, 2 * 100, "GMP::Z should multiply correctly")
|
33
|
+
assert_equal(@c * @a, 2**32 * 100, "GMP::Z should multiply correctly")
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TC_Z_Exponentiation < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@a = GMP::Z.new(100)
|
6
|
+
@b = GMP::Z.new(16)
|
7
|
+
@c = @a**5
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_exponentiation
|
11
|
+
assert_equal(GMP::Z(10000000000), @a**5, "GMP::Z should **(Fixnum) correctly")
|
12
|
+
assert_equal(GMP::Z("100000000000000000000000000000000"), @a**@b, "GMP::Z should **(GMP::Z) correctly")
|
13
|
+
assert_equal(GMP::Z(65536), 2**@b, "Fixnum should **(GMP::Z) correctly")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_powmod
|
17
|
+
assert_equal(GMP::Z(16), @a.powmod(2,256), "(a : GMP::Z).powmod((b : Fixnum), (c : Fixnum)) should work correctly")
|
18
|
+
assert_equal(GMP::Z(76), @b.powmod(10,@a), "(a : GMP::Z).powmod((b : Fixnum), (c : GMP::Z)) should work correctly")
|
19
|
+
assert_equal(GMP::Z(0), @a.powmod(@b,256), "(a : GMP::Z).powmod((b : GMP::Z), (c : Fixnum)) should work correctly")
|
20
|
+
assert_equal(GMP::Z(0), @a.powmod(@b,@c), "(a : GMP::Z).powmod((b : GMP::Z), (c : GMP::Z)) should work correctly")
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TC_Z_GCD_LCM_Invert < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@a = GMP::Z( 24) # 2^3 * 3
|
6
|
+
@b = GMP::Z( 8) # 2^3
|
7
|
+
@c = GMP::Z( 3) # 3
|
8
|
+
@d = GMP::Z( 7) # 7
|
9
|
+
@e = GMP::Z( 11) # 11
|
10
|
+
@f = GMP::Z( 25) # 25
|
11
|
+
@g = GMP::Z(720) # 2^4 * 3^2 * 5 = 1*2*3*4*5*6
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_gcd
|
15
|
+
assert_equal(GMP::Z( 8), @a.gcd(@b), "GMP::Z should gcd correctly")
|
16
|
+
assert_equal(GMP::Z( 3), @a.gcd(@c), "GMP::Z should gcd correctly")
|
17
|
+
assert_equal(GMP::Z( 1), @c.gcd(@d), "GMP::Z should gcd correctly")
|
18
|
+
assert_equal(GMP::Z( 1), @a.gcd(@f), "GMP::Z should gcd correctly")
|
19
|
+
assert_equal(GMP::Z(24), @a.gcd(@g), "GMP::Z should gcd correctly")
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_gcd2
|
23
|
+
assert_equal(GMP::Z( 8), (-@a).gcd(@b), "GMP::Z should gcd negatives correctly")
|
24
|
+
assert_equal(GMP::Z( 3), (-@a).gcd(@c), "GMP::Z should gcd negatives correctly")
|
25
|
+
assert_equal(GMP::Z( 1), (-@c).gcd(@d), "GMP::Z should gcd correctly")
|
26
|
+
assert_equal(GMP::Z(24), (-@a).gcd(@g), "GMP::Z should gcd correctly")
|
27
|
+
|
28
|
+
assert_equal(GMP::Z( 8), @a.gcd(-@b), "GMP::Z should gcd negatives correctly")
|
29
|
+
assert_equal(GMP::Z( 3), @a.gcd(-@c), "GMP::Z should gcd negatives correctly")
|
30
|
+
assert_equal(GMP::Z( 1), @c.gcd(-@d), "GMP::Z should gcd correctly")
|
31
|
+
assert_equal(GMP::Z(24), @a.gcd(-@g), "GMP::Z should gcd correctly")
|
32
|
+
|
33
|
+
assert_equal(GMP::Z( 8), (-@a).gcd(-@b), "GMP::Z should gcd negatives correctly")
|
34
|
+
assert_equal(GMP::Z( 3), (-@a).gcd(-@c), "GMP::Z should gcd negatives correctly")
|
35
|
+
assert_equal(GMP::Z( 1), (-@c).gcd(-@d), "GMP::Z should gcd correctly")
|
36
|
+
assert_equal(GMP::Z(24), (-@a).gcd(-@g), "GMP::Z should gcd correctly")
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_invert
|
40
|
+
assert_equal(GMP::Z( 1), GMP::Z( 1).invert(@e), "GMP::Z should invert correctly")
|
41
|
+
assert_equal(GMP::Z( 6), GMP::Z( 2).invert(@e), "GMP::Z should invert correctly")
|
42
|
+
assert_equal(GMP::Z( 4), GMP::Z( 3).invert(@e), "GMP::Z should invert correctly")
|
43
|
+
assert_equal(GMP::Z( 3), GMP::Z( 4).invert(@e), "GMP::Z should invert correctly")
|
44
|
+
assert_equal(GMP::Z( 9), GMP::Z( 5).invert(@e), "GMP::Z should invert correctly")
|
45
|
+
assert_equal(GMP::Z( 2), GMP::Z( 6).invert(@e), "GMP::Z should invert correctly")
|
46
|
+
assert_equal(GMP::Z( 8), GMP::Z( 7).invert(@e), "GMP::Z should invert correctly")
|
47
|
+
assert_equal(GMP::Z( 7), GMP::Z( 8).invert(@e), "GMP::Z should invert correctly")
|
48
|
+
assert_equal(GMP::Z( 5), GMP::Z( 9).invert(@e), "GMP::Z should invert correctly")
|
49
|
+
assert_equal(GMP::Z(10), GMP::Z(10).invert(@e), "GMP::Z should invert correctly")
|
50
|
+
assert_equal(GMP::Z( 0), GMP::Z(11).invert(@e), "GMP::Z should invert correctly")
|
51
|
+
|
52
|
+
assert_equal(GMP::Z( 1), GMP::Z(12).invert(@e), "GMP::Z should invert correctly")
|
53
|
+
assert_equal(GMP::Z( 6), GMP::Z(13).invert(@e), "GMP::Z should invert correctly")
|
54
|
+
assert_equal(GMP::Z( 4), GMP::Z(14).invert(@e), "GMP::Z should invert correctly")
|
55
|
+
assert_equal(GMP::Z( 3), GMP::Z(15).invert(@e), "GMP::Z should invert correctly")
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TC_Z_Jacobi_Legendre_Remove < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@one = GMP::Z(1)
|
6
|
+
@two = GMP::Z(2)
|
7
|
+
@three = GMP::Z(3)
|
8
|
+
@four = GMP::Z(4)
|
9
|
+
@five = GMP::Z(5)
|
10
|
+
@nine = GMP::Z(9)
|
11
|
+
@forty_five = GMP::Z(45)
|
12
|
+
@neg_one = GMP::Z(-1)
|
13
|
+
end
|
14
|
+
|
15
|
+
# I don't actually know the Jacobi symbol, so these are just from Wolfram Alpha.
|
16
|
+
def test_jacobi
|
17
|
+
assert_equal(@one.jacobi(@one), 1, "GMP::Z should jacobi(GMP::Z) correctly")
|
18
|
+
assert_equal(@two.jacobi(@one), 1, "GMP::Z should jacobi(GMP::Z) correctly")
|
19
|
+
assert_equal(@forty_five.jacobi(@one), 1, "GMP::Z should jacobi(GMP::Z) correctly")
|
20
|
+
assert_equal(@one.jacobi(@three), 1, "GMP::Z should jacobi(GMP::Z) correctly")
|
21
|
+
assert_equal(@two.jacobi(@three), -1, "GMP::Z should jacobi(GMP::Z) correctly")
|
22
|
+
assert_equal(@three.jacobi(@three), 0, "GMP::Z should jacobi(GMP::Z) correctly")
|
23
|
+
assert_equal(@forty_five.jacobi(@three), 0, "GMP::Z should jacobi(GMP::Z) correctly")
|
24
|
+
|
25
|
+
assert_equal(GMP::Z.jacobi(@one, @one), 1, "GMP::Z should jacobi(GMP::Z, GMP::Z) correctly")
|
26
|
+
assert_equal(GMP::Z.jacobi(@four, @one), 1, "GMP::Z should jacobi(GMP::Z, GMP::Z) correctly")
|
27
|
+
assert_equal(GMP::Z.jacobi(@two, @three), -1, "GMP::Z should jacobi(GMP::Z, GMP::Z) correctly")
|
28
|
+
assert_equal(GMP::Z.jacobi(@three, @three), 0, "GMP::Z should jacobi(GMP::Z, GMP::Z) correctly")
|
29
|
+
|
30
|
+
assert_equal(GMP::Z.jacobi(1, @one), 1, "GMP::Z should jacobi(Fixnum, GMP::Z) correctly")
|
31
|
+
assert_equal(GMP::Z.jacobi(4, @one), 1, "GMP::Z should jacobi(Fixnum, GMP::Z) correctly")
|
32
|
+
assert_equal(GMP::Z.jacobi(2, @three), -1, "GMP::Z should jacobi(Fixnum, GMP::Z) correctly")
|
33
|
+
assert_equal(GMP::Z.jacobi(3, @three), 0, "GMP::Z should jacobi(Fixnum, GMP::Z) correctly")
|
34
|
+
|
35
|
+
assert_equal(GMP::Z.jacobi(@one, 1), 1, "GMP::Z should jacobi(GMP::Z, Fixnum) correctly")
|
36
|
+
assert_equal(GMP::Z.jacobi(@four, 1), 1, "GMP::Z should jacobi(GMP::Z, Fixnum) correctly")
|
37
|
+
assert_equal(GMP::Z.jacobi(@two, 3), -1, "GMP::Z should jacobi(GMP::Z, Fixnum) correctly")
|
38
|
+
assert_equal(GMP::Z.jacobi(@three, 3), 0, "GMP::Z should jacobi(GMP::Z, Fixnum) correctly")
|
39
|
+
|
40
|
+
assert_equal(GMP::Z.jacobi(1, 1), 1, "GMP::Z should jacobi(Fixnum, Fixnum) correctly")
|
41
|
+
assert_equal(GMP::Z.jacobi(4, 1), 1, "GMP::Z should jacobi(Fixnum, Fixnum) correctly")
|
42
|
+
assert_equal(GMP::Z.jacobi(2, 3), -1, "GMP::Z should jacobi(Fixnum, Fixnum) correctly")
|
43
|
+
assert_equal(GMP::Z.jacobi(3, 3), 0, "GMP::Z should jacobi(Fixnum, Fixnum) correctly")
|
44
|
+
|
45
|
+
assert_raise(RangeError) { @two.jacobi(@two) }
|
46
|
+
assert_raise(RangeError) { @three.jacobi(@neg_one) }
|
47
|
+
assert_raise(RangeError) { GMP::Z.jacobi(@two, @two) }
|
48
|
+
assert_raise(RangeError) { GMP::Z.jacobi(@three, @neg_one) }
|
49
|
+
assert_raise(RangeError) { GMP::Z.jacobi(@two, 2) }
|
50
|
+
assert_raise(RangeError) { GMP::Z.jacobi(3, @neg_one) }
|
51
|
+
assert_raise(RangeError) { GMP::Z.jacobi(3, -1) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_legendre
|
55
|
+
assert_equal(@one.legendre(@three), 1, "GMP::Z should legendre(GMP::Z) correctly")
|
56
|
+
assert_equal(@two.legendre(@three), -1, "GMP::Z should legendre(GMP::Z) correctly")
|
57
|
+
|
58
|
+
assert_raise(RangeError) { @one.legendre(@one) }
|
59
|
+
assert_raise(RangeError) { @one.legendre(@two) }
|
60
|
+
assert_raise(RangeError) { @one.legendre(@neg_one) }
|
61
|
+
assert_raise(RangeError) { @one.legendre(@four) }
|
62
|
+
assert_raise(RangeError) { @one.legendre(@nine) }
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_remove
|
66
|
+
assert_equal(@nine, @forty_five.remove(5)[0], "GMP::Z should remove(GMP::Z) correctly.")
|
67
|
+
assert_equal(@nine, @forty_five.remove(@five)[0], "GMP::Z should remove(GMP::Z) correctly.")
|
68
|
+
assert_equal(@five, @forty_five.remove(@three)[0], "GMP::Z should remove(GMP::Z) correctly.")
|
69
|
+
assert_equal(1, @forty_five.remove(5)[1], "GMP::Z should remove(GMP::Z) correctly.")
|
70
|
+
assert_equal(1, @forty_five.remove(@five)[1], "GMP::Z should remove(GMP::Z) correctly.")
|
71
|
+
assert_equal(2, @forty_five.remove(@three)[1], "GMP::Z should remove(GMP::Z) correctly.")
|
72
|
+
end
|
73
|
+
end
|