numb 0.184.0 → 0.185.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/numb/divisors.rb +1 -1
- data/lib/numb/kronecker.rb +113 -0
- data/spec/numb/jacobi_spec.rb +65 -0
- data/spec/numb/kronecker_spec.rb +76 -0
- data/spec/numb/legendre_spec.rb +142 -0
- metadata +10 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.185.0
|
data/lib/numb/divisors.rb
CHANGED
@@ -472,7 +472,7 @@ class Integer
|
|
472
472
|
# 56.xgcd(72) #=> [8, 4, -3]
|
473
473
|
#
|
474
474
|
# @param [Integer] b the number `self` is divided by
|
475
|
-
# @
|
475
|
+
# @return [Array<Integer>] GCD, `x`, and `y`
|
476
476
|
def xgcd b
|
477
477
|
a = self
|
478
478
|
x, y, u, v = 0, 1, 1, 0
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
class Integer
|
3
|
+
# Returns the Kronecker symbol for `self`/`b`
|
4
|
+
#
|
5
|
+
# The Kronecker symbol is an extension of the Jacobi symbol to all
|
6
|
+
# integers.
|
7
|
+
#
|
8
|
+
# 2.kronecker 3 #=> -1
|
9
|
+
# -8.kronecker 3 #=> 1
|
10
|
+
# 6.kronecker 7 #=> -1
|
11
|
+
#
|
12
|
+
# @param [Integer] b The "denominator"
|
13
|
+
# @return [Integer] -1, 0, 1
|
14
|
+
def kronecker b
|
15
|
+
# The following algorithm is excerpted from Henri Cohen's A Course
|
16
|
+
# in Computational Algebraic Number Theory, 3rd. ed. It appears on
|
17
|
+
# page 48, and is entitled "Algorithm 1.4.12 (Kronecker-Binary).
|
18
|
+
|
19
|
+
# Given a, b ∈ ℤ, this algorithm computes the Kronecker symbol
|
20
|
+
# (a/b) (hence the Legendre symbol when b is an odd prime).
|
21
|
+
raise ArgumentError unless b.is_a?(Integer)
|
22
|
+
|
23
|
+
a = self
|
24
|
+
# The following Array is a lookup table for computing (-1)^(a^2 -
|
25
|
+
# 1)/8 (Cohen, p. 29)
|
26
|
+
tab2 = [0, 1, 0, -1, 0, -1, 0, 1]
|
27
|
+
|
28
|
+
# 1. [Test b = 0] If b = 0, then output 0 if |a| ≠ 1, 1 if |a| = 1
|
29
|
+
# and terminate the algorithm
|
30
|
+
return a.abs == 1 ? 1 : 0 if b.zero?
|
31
|
+
|
32
|
+
# 2. [Remove 2's from b] If a and b are both even, output 0 and
|
33
|
+
# terminate the algorithm. Otherwise, set v ← 0 and while b is
|
34
|
+
# even set v ← v + 1 and b ← b/2. Then if v is even set k ← 1,
|
35
|
+
# otherwise set k ← (-1)^(a^2 - 1)/8 (by table lookup, not by
|
36
|
+
# computing (a^2 - 1)/8). Finally, if b < 0 set b ← -b, and if in
|
37
|
+
# addition a < 0 set k ← -k.
|
38
|
+
return 0 if a.even? and b.even?
|
39
|
+
v, k = 0, nil
|
40
|
+
while b.even?
|
41
|
+
v += 1
|
42
|
+
b = b.quo(2).to_i
|
43
|
+
end
|
44
|
+
k = v.even? ? 1 : tab2[a&7]
|
45
|
+
if b < 0
|
46
|
+
b = -b
|
47
|
+
k =-k if a < 0
|
48
|
+
end
|
49
|
+
|
50
|
+
# 3. [Reduce size once] (Here b is odd and b > 0.) Set a ← a mod b
|
51
|
+
raise unless b.odd? and b > 0
|
52
|
+
a %= b
|
53
|
+
|
54
|
+
loop do
|
55
|
+
# 4. [Finished?] If a = 0, output 0 if b > 1, k if b = 1, and
|
56
|
+
# terminate the algorithm
|
57
|
+
return (b > 1) ? 0 : k if a.zero?
|
58
|
+
|
59
|
+
# 5. [Remove powers of 2] Set v ← 0 and, while a is even, set v ←
|
60
|
+
# v + 1 and a ← a/2. If v is odd, set k ← (-1)^((b^2 - 1)/8) * k
|
61
|
+
v = 0
|
62
|
+
while a.even?
|
63
|
+
v += 1
|
64
|
+
a = a.quo(2).to_i
|
65
|
+
end
|
66
|
+
k = ((-1)**((b**2).pred.quo 8) * k).to_i if v.odd?
|
67
|
+
|
68
|
+
# 6. [Subtract and apply reciprocity] (Here a and b are odd.) Set
|
69
|
+
# r ← b - a. If r > 0, then set k ← (-1)^((a-1)(b-1)/4) * k (using
|
70
|
+
# if statements), b ← a and a ← r, else set a ← -r. Go to step 4.
|
71
|
+
raise unless a.odd? and b.odd?
|
72
|
+
r = b - a
|
73
|
+
if r > 0
|
74
|
+
# The optimisation below is from Cohen, p. 29
|
75
|
+
k = -k unless (a & b & 2).zero?
|
76
|
+
b = a
|
77
|
+
a = r
|
78
|
+
else
|
79
|
+
a = -r
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Returns the Legendre symbol for `self`/`p`
|
85
|
+
#
|
86
|
+
# The Legendre symbol is a multiplicative function with values 1,
|
87
|
+
# −1, 0: its value on a (nonzero) quadratic residue mod `p` is 1 and
|
88
|
+
# on a quadratic non-residue is −1. It is defined only when `p` is
|
89
|
+
# an odd prime.
|
90
|
+
#
|
91
|
+
# 12345.legendre 331 #=> -1
|
92
|
+
# 0.legendre 83 #=> 0
|
93
|
+
# 55.legendre 10 #=> nil
|
94
|
+
# 6.legendre 7 #=> -1
|
95
|
+
#
|
96
|
+
# @param [Integer] p The "denominator"
|
97
|
+
# @return [Integer, nil] -1, 0, 1, or `nil`
|
98
|
+
def legendre p
|
99
|
+
kronecker(p) if p.odd? and p > 2 and p.prime?
|
100
|
+
end
|
101
|
+
|
102
|
+
# Returns the Jacobi symbol for `a`/`n`
|
103
|
+
#
|
104
|
+
# For any integer `a` and any positive odd integer `n` the Jacobi
|
105
|
+
# symbol is defined as the product of the Legendre symbols
|
106
|
+
# corresponding to the prime factors of `n`.
|
107
|
+
#
|
108
|
+
# @param [Integer] p The "denominator"
|
109
|
+
# @return [Integer, nil] -1, 0, 1, or `nil`
|
110
|
+
def jacobi n
|
111
|
+
kronecker(n) if n.odd? and n > 0
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
describe Integer, "#jacobi" do
|
3
|
+
|
4
|
+
@seq = {
|
5
|
+
# A165591
|
6
|
+
59701 => [0,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,
|
7
|
+
1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,
|
8
|
+
-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,
|
9
|
+
-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,
|
10
|
+
1,-1,1],
|
11
|
+
# A165596
|
12
|
+
59881 => [0,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,
|
13
|
+
-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,
|
14
|
+
-1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,
|
15
|
+
-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,
|
16
|
+
1,-1,-1],
|
17
|
+
}
|
18
|
+
|
19
|
+
@seq.each do |a, ns|
|
20
|
+
ns.each_with_index do |j, n|
|
21
|
+
it "returns #{j} for #{a}.jacobi(#{n})" do
|
22
|
+
n.jacobi(a).should == j
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# A077009
|
28
|
+
[1,-1,1,-1,0,-1,1,1,1,-1,0,-1,0,0,1,-1,-1,-1,1,0,
|
29
|
+
1,-1,0,-1,0,-1,1,0,0,-1,1,0,-1,-1,1,-1,1,0,1,-1,0,
|
30
|
+
-1,1,1,1,-1,0,1,1,0,1,-1,0,-1,1,0,1,1,0,1,0,-1,0,
|
31
|
+
-1,0,-1,1,0,1,-1,1,-1,-1,0,1,-1,0,0,1,1,1,-1,0,-1,
|
32
|
+
0,0,1,0,-1,-1,1,0,1,1,0,-1,1,0,1,-1].each_with_index do |j, n|
|
33
|
+
n = (2 * n).succ
|
34
|
+
a = n.φ
|
35
|
+
it "returns #{j} for #{a}.jacobi(#{n})" do
|
36
|
+
a.jacobi(n).should == j
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# A077010
|
41
|
+
[1,1,1,1,1,1,1,0,1,1,-1,1,1,1,1,1,0,1,1,-1,1,1,0,
|
42
|
+
1,1,0,1,1,-1,1,1,-1,-1,1,0,1,1,1,1,1,1,1,1,0,1,0,
|
43
|
+
-1,0,1,0,1,1,0,1,1,-1,1,1,0,1,1,0,1,1,-1,1,1,0,1,
|
44
|
+
1,0,1,0,0,1,1,0,1,1,0,-1,1,0,1,1,-1,1,-1,0,1,1,-1,
|
45
|
+
1,1,1,1,1,0,1,1].each_with_index do |j, n|
|
46
|
+
n = (2 * n).succ
|
47
|
+
a = n.σ
|
48
|
+
it "returns #{j} for #{a}.jacobi(#{n})" do
|
49
|
+
a.jacobi(n).should == j
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
[2, 10, -4, 0].each do |n|
|
54
|
+
10.times do |a|
|
55
|
+
it "returns nil for #{a}.jacobi(#{n})" do
|
56
|
+
a.jacobi(n).should be_nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
|
@@ -0,0 +1,76 @@
|
|
1
|
+
describe Integer, "#kronecker" do
|
2
|
+
@seq = {
|
3
|
+
# A109017
|
4
|
+
-6 => [0,1,0,0,0,1,0,1,0,0,0,1,0,-1,0,0,0,-1,0,-1,0,0,0,
|
5
|
+
-1,0,1,0,0,0,1,0,1,0,0,0,1,0,-1,0,0,0,-1,0,-1,0,0,
|
6
|
+
0,-1,0,1,0,0,0,1,0,1,0,0,0,1,0,-1,0,0,0,-1,0,-1,0,
|
7
|
+
0,0,-1,0,1,0,0,0,1,0,1,0,0,0,1,0,-1,0,0,0,-1,0,-1,
|
8
|
+
0,0,0,-1,0,1,0,0,0,1,0,1,0].map.with_index,
|
9
|
+
# -5..-2 are extracted from <http://mathworld.wolfram.com/KroneckerSymbol.html>
|
10
|
+
-5 => [1, -1, 1, 1, 0, -1, 1, -1, 1, 0, -1, 1, -1, -1, 0, 1, -1,
|
11
|
+
-1, -1, 0].map.with_index(1),
|
12
|
+
-4 => [1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0,
|
13
|
+
-1, 0].map.with_index(1),
|
14
|
+
-3 => [1, -1, 0, 1, -1, 0, 1, -1, 0, 1, -1, 0, 1, -1, 0, 1, -1, 0,
|
15
|
+
1, -1].map.with_index(1),
|
16
|
+
-2 => [1, 0, 1, 0, -1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, 1, 0,
|
17
|
+
1, 0].map.with_index(1),
|
18
|
+
# A034947
|
19
|
+
-1 => [1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,
|
20
|
+
1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,
|
21
|
+
1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,
|
22
|
+
-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,
|
23
|
+
1,1].map.with_index(1),
|
24
|
+
# 0..1 are extracted from <http://mathworld.wolfram.com/KroneckerSymbol.html>
|
25
|
+
0 => [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
26
|
+
0].map.with_index(1),
|
27
|
+
1 => [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1].map.with_index(1),
|
28
|
+
# A091337
|
29
|
+
2 => [1,0,-1,0,-1,0,1,0,1,0,-1,0,-1,0,1,0,1,0,-1,0,-1,
|
30
|
+
0,1,0,1,0,-1,0,-1,0,1,0,1,0,-1,0,-1,0,1,0,1,0,-1,
|
31
|
+
0,-1,0,1,0,1,0,-1,0,-1,0,1,0,1,0,-1,0,-1,0,1,0,1,
|
32
|
+
0,-1,0,-1,0,1,0,1,0,-1,0,-1,0,1,0,1,0,-1,0,-1,0,1,
|
33
|
+
0,1,0,-1,0,-1,0,1,0,1,0,-1,0,-1,0,1,0,1].map.with_index(1),
|
34
|
+
# A091338
|
35
|
+
3 => [1,-1,0,1,-1,0,-1,-1,0,1,1,0,1,1,0,1,-1,0,-1,-1,0,
|
36
|
+
-1,1,0,1,-1,0,-1,-1,0,-1,-1,0,1,1,0,1,1,0,1,-1,0,
|
37
|
+
-1,1,0,-1,1,0,1,-1,0,1,-1,0,-1,1,0,1,1,0,1,1,0,1,
|
38
|
+
-1,0,-1,-1,0,-1,1,0,1,-1,0,-1,-1,0,-1,-1,0,1,1,0,
|
39
|
+
1,1,0,-1,-1,0,-1,1,0,-1,1,0,1,-1,0,1,-1,0].map.with_index(1),
|
40
|
+
# A080891
|
41
|
+
5 => [0,1,-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,
|
42
|
+
0,1,-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0,
|
43
|
+
1,-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0,1,
|
44
|
+
-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0,1,
|
45
|
+
-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0,1,-1,-1,1,0].map.with_index,
|
46
|
+
# The below is extracted from <http://mathworld.wolfram.com/KroneckerSymbol.html>
|
47
|
+
6 => [1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, 1,
|
48
|
+
0].map.with_index(1)
|
49
|
+
}
|
50
|
+
|
51
|
+
@seq.each do |a, bs|
|
52
|
+
bs.each do |k, b|
|
53
|
+
it "returns #{k} for #{a}.kronecker(#{b})" do
|
54
|
+
a.kronecker(b).should == k
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# A071935, A071936
|
60
|
+
[1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,
|
61
|
+
-1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,
|
62
|
+
-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,
|
63
|
+
1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,
|
64
|
+
1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,
|
65
|
+
-1,-1].map.with_index(1){|k, n| [n, n.succ, k]} + \
|
66
|
+
[1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,
|
67
|
+
1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,
|
68
|
+
1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,
|
69
|
+
1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,
|
70
|
+
1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,
|
71
|
+
1,1,1,1,1].map.with_index(1){|k, n| [n.succ, n, k]}.each do |a, b, k|
|
72
|
+
it "returns #{k} for #{a}.kronecker(#{b})" do
|
73
|
+
a.kronecker(b).should == k
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
describe Integer, "#legendre" do
|
2
|
+
|
3
|
+
@seq = {
|
4
|
+
# A011582
|
5
|
+
11 => [0,1,-1,1,1,1,-1,-1,-1,1,-1,0,1,-1,1,1,1,-1,-1,-1,
|
6
|
+
1,-1,0,1,-1,1,1,1,-1,-1,-1,1,-1,0,1,-1,1,1,1,-1,
|
7
|
+
-1,-1,1,-1,0,1,-1,1,1,1,-1,-1,-1,1,-1,0,1,-1,1,1,
|
8
|
+
1,-1,-1,-1,1,-1,0,1,-1,1,1,1,-1,-1,-1,1,-1,0,1,-1,
|
9
|
+
1],
|
10
|
+
# A011583
|
11
|
+
13 => [0,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,0,1,-1,1,1,-1,-1,
|
12
|
+
-1,-1,1,1,-1,1,0,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,0,
|
13
|
+
1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,0,1,-1,1,1,-1,-1,-1,
|
14
|
+
-1,1,1,-1,1,0,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,0,1,
|
15
|
+
-1],
|
16
|
+
# A011584
|
17
|
+
17 => [0,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,0,1,1,
|
18
|
+
-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,0,1,1,-1,1,-1,
|
19
|
+
-1,-1,1,1,-1,-1,-1,1,-1,1,1,0,1,1,-1,1,-1,-1,-1,1,
|
20
|
+
1,-1,-1,-1,1,-1,1,1,0,1,1,-1,1,-1,-1,-1,1,1,-1,-1,
|
21
|
+
-1],
|
22
|
+
# A011585
|
23
|
+
19 => [0,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,0,
|
24
|
+
1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,0,1,
|
25
|
+
-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,0,1,-1,
|
26
|
+
-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,0,1,-1,-1,
|
27
|
+
1],
|
28
|
+
|
29
|
+
# A011586
|
30
|
+
23 => [0,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,
|
31
|
+
-1,-1,-1,0,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,
|
32
|
+
-1,1,-1,-1,-1,-1,0,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,
|
33
|
+
-1,-1,1,-1,1,-1,-1,-1,-1,0,1,1,1,1,-1,1,-1,1,1,-1,
|
34
|
+
-1],
|
35
|
+
# A011587
|
36
|
+
29 => [0,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,
|
37
|
+
-1,1,-1,1,1,1,1,-1,-1,1,0,1,-1,-1,1,1,1,1,-1,1,-1,
|
38
|
+
-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,0,1,
|
39
|
+
-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,
|
40
|
+
-1,1],
|
41
|
+
# A011588
|
42
|
+
31 => [0,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,
|
43
|
+
-1,-1,-1,-1,1,-1,-1,1,-1,-1,0,1,1,-1,1,1,-1,1,1,1,
|
44
|
+
1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,
|
45
|
+
-1,-1,0,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,
|
46
|
+
1],
|
47
|
+
# A011589
|
48
|
+
37 => [0,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,
|
49
|
+
-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,0,1,
|
50
|
+
-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,
|
51
|
+
1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,0,1,-1,1,1,
|
52
|
+
-1,-1],
|
53
|
+
# A011590
|
54
|
+
41 => [0,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,
|
55
|
+
-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,
|
56
|
+
-1,1,1,0,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,
|
57
|
+
-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,
|
58
|
+
1,1,-1,1],
|
59
|
+
# A011591
|
60
|
+
43 => [0,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,
|
61
|
+
-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,
|
62
|
+
-1,1,1,-1,0,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,
|
63
|
+
1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,
|
64
|
+
1,-1],
|
65
|
+
# A011626
|
66
|
+
227 => [0,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,
|
67
|
+
-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,
|
68
|
+
1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,
|
69
|
+
1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,
|
70
|
+
-1],
|
71
|
+
# A011627
|
72
|
+
229 => [0,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,
|
73
|
+
-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,
|
74
|
+
-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,
|
75
|
+
1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,
|
76
|
+
1],
|
77
|
+
# A011628
|
78
|
+
233 => [0,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,
|
79
|
+
-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,
|
80
|
+
-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,
|
81
|
+
-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,
|
82
|
+
-1,-1,-1],
|
83
|
+
# A165573
|
84
|
+
257 => [0,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,
|
85
|
+
-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,
|
86
|
+
-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,
|
87
|
+
1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,
|
88
|
+
1,-1,1],
|
89
|
+
# A165574
|
90
|
+
263 => [0,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,
|
91
|
+
-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,
|
92
|
+
-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,
|
93
|
+
1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,
|
94
|
+
-1,1],
|
95
|
+
# A165471
|
96
|
+
65537 => [0,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,
|
97
|
+
-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,
|
98
|
+
-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,
|
99
|
+
-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,
|
100
|
+
-1,1,-1,1],
|
101
|
+
# A165476
|
102
|
+
131071 => [0,1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,
|
103
|
+
-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,
|
104
|
+
-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,
|
105
|
+
-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,
|
106
|
+
1,-1,1,-1,1],
|
107
|
+
# A165481
|
108
|
+
28657 => [0,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,
|
109
|
+
-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,
|
110
|
+
-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,
|
111
|
+
-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,
|
112
|
+
-1,-1,-1,1],
|
113
|
+
# A165586
|
114
|
+
514229 => [0,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,
|
115
|
+
1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,
|
116
|
+
-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,
|
117
|
+
-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,
|
118
|
+
1,1,1,1],
|
119
|
+
# A165581
|
120
|
+
524287 => [0,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,
|
121
|
+
-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,
|
122
|
+
-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,
|
123
|
+
1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,
|
124
|
+
-1,1,1,-1],
|
125
|
+
}
|
126
|
+
|
127
|
+
@seq.each do |p, as|
|
128
|
+
as.each_with_index do |l, a|
|
129
|
+
it "returns #{l} for #{a}.legendre(#{p})" do
|
130
|
+
a.legendre(p).should == l
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
[1, 2, 4].each do |b|
|
136
|
+
100.times do |a|
|
137
|
+
it "returns nil for #{a}.legendre(#{b})" do
|
138
|
+
a.legendre(b).should be_nil
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 185
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.185.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Run Paint Run Run
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-18 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -110,6 +110,7 @@ files:
|
|
110
110
|
- lib/numb/keith.rb
|
111
111
|
- lib/numb/knodel.rb
|
112
112
|
- lib/numb/knuth.rb
|
113
|
+
- lib/numb/kronecker.rb
|
113
114
|
- lib/numb/kynea.rb
|
114
115
|
- lib/numb/lah.rb
|
115
116
|
- lib/numb/leonardo.rb
|
@@ -286,14 +287,17 @@ files:
|
|
286
287
|
- spec/numb/interprime_spec.rb
|
287
288
|
- spec/numb/inv_mod_spec.rb
|
288
289
|
- spec/numb/isqrt_spec.rb
|
290
|
+
- spec/numb/jacobi_spec.rb
|
289
291
|
- spec/numb/jacobsthal_lucas_spec.rb
|
290
292
|
- spec/numb/k_perfect_spec.rb
|
291
293
|
- spec/numb/kaprekar_spec.rb
|
292
294
|
- spec/numb/keith_spec.rb
|
293
295
|
- spec/numb/knodel_spec.rb
|
294
296
|
- spec/numb/knuth_spec.rb
|
297
|
+
- spec/numb/kronecker_spec.rb
|
295
298
|
- spec/numb/kynea_spec.rb
|
296
299
|
- spec/numb/lah_spec.rb
|
300
|
+
- spec/numb/legendre_spec.rb
|
297
301
|
- spec/numb/leonardo_spec.rb
|
298
302
|
- spec/numb/leyland_spec.rb
|
299
303
|
- spec/numb/liouville_spec.rb
|
@@ -477,6 +481,7 @@ test_files:
|
|
477
481
|
- spec/numb/woodall_spec.rb
|
478
482
|
- spec/numb/unitary_sociable_spec.rb
|
479
483
|
- spec/numb/refactorable_spec.rb
|
484
|
+
- spec/numb/kronecker_spec.rb
|
480
485
|
- spec/numb/maris_mcgwire_sosa_pair_spec.rb
|
481
486
|
- spec/numb/zeisel_spec.rb
|
482
487
|
- spec/numb/q_spec.rb
|
@@ -589,6 +594,7 @@ test_files:
|
|
589
594
|
- spec/numb/amicable_spec.rb
|
590
595
|
- spec/numb/bell_spec.rb
|
591
596
|
- spec/numb/super_catalan_spec.rb
|
597
|
+
- spec/numb/legendre_spec.rb
|
592
598
|
- spec/numb/motzkin_spec.rb
|
593
599
|
- spec/numb/mobius_spec.rb
|
594
600
|
- spec/numb/chen_prime_spec.rb
|
@@ -628,6 +634,7 @@ test_files:
|
|
628
634
|
- spec/numb/nsw_spec.rb
|
629
635
|
- spec/numb/knuth_spec.rb
|
630
636
|
- spec/numb/first_with_n_divisors_spec.rb
|
637
|
+
- spec/numb/jacobi_spec.rb
|
631
638
|
- spec/numb/isqrt_spec.rb
|
632
639
|
- spec/numb/inrt_spec.rb
|
633
640
|
- spec/numb/nexus_spec.rb
|