partitions 0.1.0 → 0.2.0

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.
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: []