partitions 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2decbf60e2bc3cd7377d2d42b003897d7e167c2f
4
- data.tar.gz: 4eee0fbaa035a56b04f862c4207442f365256a73
3
+ metadata.gz: 2aa22121b5627f30e18b9a2740d3cac3b8f33ecb
4
+ data.tar.gz: f1857f98aaf24b9f6db43cb62ddbb5203b4c1f14
5
5
  SHA512:
6
- metadata.gz: 1a564fa6fe63af32ae7aed33cec7a3c7ff3f878bfe62d24f1cca23a2b1e9849e21ad31d990cd96259880e2638e3f1b50725de6acbea5c1ce939f1dafe46b082f
7
- data.tar.gz: 354d064c68d4a5c9b9ac944dd0613ed54c21ec2f6bfe7c278f1b599fedf5576b9d0b082de3acd104509528b44ca2bffa3016e6213e8e862c700aee3a678213d1
6
+ metadata.gz: 96c4c851431664fbebeee2622cf118ab78b4400ae91788e821ef8dce4dfbfcfc8635c1a0f1e731dc9cb8186f6956676cfa7f347e4ee5c94c041a24227342a3be
7
+ data.tar.gz: 2650403dca28ff72cf42662491ad0a021b357f11829fe0a4b46020923e741dc69411c663c4a236a807d0ed3878a73807a82892ce034e375eaa66f24dfeefb4e5
data/README.md CHANGED
@@ -92,6 +92,26 @@ Or install it yourself as:
92
92
  irb(main):004:0> sp.count
93
93
  => 4140
94
94
 
95
+ irb(main):005:0> sp = Partitions::SetPartitions.new(6,5)
96
+ => #<Partitions::SetPartitions:0x007fd9c284def8 @n=6, @k=[0, 0, 1, 2, 3, 4], @m=[0, 0, 1, 2, 3, 4], @p=5, @size=5>
97
+ irb(main):006:0> sp.each_partition{|partition| p partition};nil
98
+ [0, 0, 1, 2, 3, 4]
99
+ [0, 1, 0, 2, 3, 4]
100
+ [0, 1, 1, 2, 3, 4]
101
+ [0, 1, 2, 0, 3, 4]
102
+ [0, 1, 2, 1, 3, 4]
103
+ [0, 1, 2, 2, 3, 4]
104
+ [0, 1, 2, 3, 0, 4]
105
+ [0, 1, 2, 3, 1, 4]
106
+ [0, 1, 2, 3, 2, 4]
107
+ [0, 1, 2, 3, 3, 4]
108
+ [0, 1, 2, 3, 4, 0]
109
+ [0, 1, 2, 3, 4, 1]
110
+ [0, 1, 2, 3, 4, 2]
111
+ [0, 1, 2, 3, 4, 3]
112
+ [0, 1, 2, 3, 4, 4]
113
+ => nil
114
+
95
115
  ##References
96
116
  ###Integer Partitions
97
117
  ---------------------------
@@ -1,47 +1,93 @@
1
1
  module Partitions
2
2
  class SetPartitions
3
- attr_accessor :k, :m, :n, :size
3
+ attr_reader :size
4
4
 
5
5
  def initialize(n, p=nil)
6
6
  @n = n
7
7
  @k = Array.new(n, 0)
8
8
  @m = Array.new(n, 0)
9
9
  @p = p
10
- @size = 0
10
+ pinitialize
11
+ @size = partition_size
11
12
  end
12
13
 
13
14
  def next_partition
14
- (@n - 1).downto(1) do |i|
15
- if @k[i] <= @m[i - 1]
16
- @k[i] = @k[i] + 1
17
- @m[i] = max(@m[i], @k[i])
18
- j = i + 1
19
- while j <= (n - 1) do
20
- @k[j] = @k[0]
21
- @m[j] = @m[i]
22
- j = j + 1
15
+ if @p.nil?
16
+ (@n - 1).downto(1) do |i|
17
+ if @k[i] <= @m[i - 1]
18
+ @k[i] = @k[i] + 1
19
+ @m[i] = max(@m[i], @k[i])
20
+ j = i + 1
21
+ while j <= (n - 1) do
22
+ @k[j] = @k[0]
23
+ @m[j] = @m[i]
24
+ j = j + 1
25
+ end
26
+ @size = partition_size
27
+ return @k.clone
28
+ end
29
+ end
30
+ else
31
+ p = partition_size
32
+ (@n - 1).downto(1) do |i|
33
+ if (@k[i] < (p - 1)) && (@k[i] <= @m[i - 1])
34
+ @k[i] = @k[i] + 1
35
+ @m[i] = max(@m[i], @k[i])
36
+ j = i + 1
37
+ while j <= (@n - (p - @m[i])) do
38
+ @k[j] = 0
39
+ @m[j] = @m[i]
40
+ j = j + 1
41
+ end
42
+ j = @n - (p - @m[i]) + 1
43
+ while j <= (n - 1) do
44
+ @k[j] = @m[j] = p - (@n - j)
45
+ j = j + 1
46
+ end
47
+ @size = partition_size
48
+ return @k.clone
23
49
  end
24
- @size = partition_size
25
- return @k
26
50
  end
27
51
  end
28
52
 
29
53
  @size = nil
30
- return
54
+ return
31
55
  end
32
56
 
33
57
  def previous_partition
34
- (@n - 1).downto(1) do |i|
35
- if @k[i] > @k[0]
36
- @k[i] = @k[i] - 1
37
- @m[i] = @m[i - 1]
38
- j = i + 1
39
- while j <= n - 1 do
40
- @k[j] = @m[j] = @m[i] + j - i;
41
- j = j + 1
58
+ if @p.nil?
59
+ (@n - 1).downto(1) do |i|
60
+ if @k[i] > @k[0]
61
+ @k[i] = @k[i] - 1
62
+ @m[i] = @m[i - 1]
63
+ j = i + 1
64
+ while j <= n - 1 do
65
+ @k[j] = @m[j] = @m[i] + j - i;
66
+ j = j + 1
67
+ end
68
+ @size = partition_size
69
+ return @k.clone
70
+ end
71
+ end
72
+ else
73
+ p = partition_size
74
+ (@n - 1).downto(1).each do |i|
75
+ if (@k[i] > 0) && ((p - @m[i - 1]) <= (n - i))
76
+ @k[i] = @k[i] - 1
77
+ @m[i] = @m[i - 1]
78
+ j = i + 1
79
+ while j <= (i + (p - @m[i]) - 1) do
80
+ @k[j] = @m[j] = @m[i] + j - i
81
+ j = j + 1
82
+ end
83
+ j = i + (p - @m[i])
84
+ while j <= (@n - 1) do
85
+ @k[j] = @m[j] = p - 1
86
+ j = j + 1
87
+ end
88
+ @size = partition_size
89
+ return @k.clone
42
90
  end
43
- @size = partition_size
44
- return @k
45
91
  end
46
92
  end
47
93
 
@@ -54,23 +100,31 @@ module Partitions
54
100
  raise ArgumentError, "Missing block"
55
101
  end
56
102
  reinitialize
57
- yield @k
103
+ yield @k.clone
58
104
  (count - 1).times do
59
- yield next_partition
105
+ partition = next_partition
106
+ yield partition
60
107
  end
61
108
  reinitialize
62
109
  end
63
110
 
64
111
  def count
65
- sum = 0
66
- (1..n).each do |k|
67
- sum += sterling_second(@n, k)
112
+ if @p.nil?
113
+ sum = 0
114
+ (1..n).each do |k|
115
+ sum += sterling_second(@n, k)
116
+ end
117
+ return sum
118
+ else
119
+ sum = sterling_second(@n, @p)
68
120
  end
69
- return sum
70
121
  end
71
122
 
72
123
  private
73
124
 
125
+ attr_accessor :k, :m, :n
126
+ attr_writer :size
127
+
74
128
  def sterling_second(n, k)
75
129
  if k == 1 || k == n
76
130
  return 1
@@ -86,7 +140,21 @@ module Partitions
86
140
  def reinitialize
87
141
  @k = Array.new(n, 0)
88
142
  @m = Array.new(n, 0)
89
- @size = 0
143
+ pinitialize
144
+ @size = partition_size
145
+ end
146
+
147
+ def pinitialize
148
+ unless @p.nil?
149
+ (0..(@n - @p)).each do |i|
150
+ @k[i] = @m[i] = 0
151
+ end
152
+ i = (@n - @p + 1)
153
+ while i <= (@n - 1) do
154
+ @k[i] = @m[i] = i - (@n - @p)
155
+ i = i + 1
156
+ end
157
+ end
90
158
  end
91
159
 
92
160
  def max a, b
@@ -1,3 +1,3 @@
1
1
  module Partitions
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/partitions.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "partitions"
8
8
  spec.version = Partitions::VERSION
9
9
  spec.authors = ["NagaChaitanya Vellanki"]
10
- spec.email = ["me@chaitanyavellanki.com"]
10
+ spec.email = ["nagachaitanya.vellanki.com"]
11
11
 
12
12
  spec.summary = %q{a rubygem to generate partitions.}
13
13
  spec.description = %q{Generate integer, set and multiset partitions}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: partitions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - NagaChaitanya Vellanki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-09-23 00:00:00.000000000 Z
11
+ date: 2015-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -68,7 +68,7 @@ dependencies:
68
68
  version: '0.10'
69
69
  description: Generate integer, set and multiset partitions
70
70
  email:
71
- - me@chaitanyavellanki.com
71
+ - nagachaitanya.vellanki.com
72
72
  executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []