M500 0.9.2 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/M500_containers.rb +448 -0
- data/lib/{M500.rb → m500.rb} +365 -20
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f192b4fe1ad28c8858892daba9c685b3b8113700
|
4
|
+
data.tar.gz: 514c03db3500f1091f8bd4d363f8af27ddf65848
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8800d206c4ddfd7caa61defc8dba29ab5e8b8bc5b7a267916e332b214ac1c7209fb9e3d9cf51ac10c809d8b90ef0b1329eefef76c82f5c2014b461f0b69cbcdf
|
7
|
+
data.tar.gz: 382234406fa4e5907ca2a83f61b48ebc382d486fd8c67c42a8ddf0d9753c2a36de6385cfdcfd061f9b7d721a39df66e6a7c55dea49137ebecc19596f1d8cc305
|
@@ -0,0 +1,448 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module Enumerable
|
3
|
+
def to_list(klass = List, *args, &block)
|
4
|
+
klass.new!(self, *args, &block)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
def List(a=nil,&b)
|
8
|
+
b ? List.new!(a) {b} : List.new!(a)
|
9
|
+
end
|
10
|
+
def Set(a,&b)
|
11
|
+
b ? Set.new!(a) {b} : Set.new!(a)
|
12
|
+
end
|
13
|
+
def Sequence(a)
|
14
|
+
Sequence.new(a)
|
15
|
+
end
|
16
|
+
def Sigma(a,&block)
|
17
|
+
if a.kind_of?(Sigma)
|
18
|
+
a
|
19
|
+
elsif a.kind_of?(Quotient)
|
20
|
+
Sigma.new!(a,block)
|
21
|
+
elsif a.kind_of?(Natural) or a.kind_of?(Counting) or a.kind_of?(Zahlen) or a.kind_of?(Fraction) or a.kind_of?(Decimal)
|
22
|
+
elsif
|
23
|
+
Sigma.new!(a.to_Q,block)
|
24
|
+
elsif a.kind_of?(NaughtClass) or a.kind_of?(EmptyListClass) or a.kind_of?(NilClass)
|
25
|
+
a unless b
|
26
|
+
new(Quotinet(0,1),block)
|
27
|
+
elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
|
28
|
+
a
|
29
|
+
end
|
30
|
+
end
|
31
|
+
class List
|
32
|
+
def List.new!(a=nil, &b)
|
33
|
+
b ? new(a) {b} : new(a)
|
34
|
+
end
|
35
|
+
private_class_method :new
|
36
|
+
include Enumerable
|
37
|
+
def self.[](*ary)
|
38
|
+
new(ary)
|
39
|
+
end
|
40
|
+
def initialize(a, &block)
|
41
|
+
@hash ||= Hash.new
|
42
|
+
a.nil? and return
|
43
|
+
if block
|
44
|
+
with_enum(a) {|o| add(block[o]) }
|
45
|
+
else
|
46
|
+
merge(a)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
private :initialize
|
50
|
+
def with_enum(enum, &block)
|
51
|
+
if enum.respond_to?(:each_entry)
|
52
|
+
enum.each_entry(&block)
|
53
|
+
elsif enum.respond_to?(:each)
|
54
|
+
enum.each(&block)
|
55
|
+
else
|
56
|
+
raise ArgumentError, "value must be enumerable"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
private :with_enum
|
60
|
+
def initialize_copy(orig)
|
61
|
+
@hash = orig.instance_variable_get(:@hash).dup
|
62
|
+
end
|
63
|
+
def freeze
|
64
|
+
super
|
65
|
+
@hash.freeze
|
66
|
+
self
|
67
|
+
end
|
68
|
+
def taint
|
69
|
+
super
|
70
|
+
@hash.taint
|
71
|
+
self
|
72
|
+
end
|
73
|
+
def untaint
|
74
|
+
super
|
75
|
+
@hash.untaint
|
76
|
+
self
|
77
|
+
end
|
78
|
+
def size
|
79
|
+
@hash.size
|
80
|
+
end
|
81
|
+
alias length size
|
82
|
+
def empty?
|
83
|
+
@hash.empty?
|
84
|
+
end
|
85
|
+
def clear
|
86
|
+
@hash.clear
|
87
|
+
self
|
88
|
+
end
|
89
|
+
def replace(enum)
|
90
|
+
if enum.instance_of?(self.class)
|
91
|
+
@hash.replace(enum.instance_variable_get(:@hash))
|
92
|
+
else
|
93
|
+
clear
|
94
|
+
merge(enum)
|
95
|
+
end
|
96
|
+
self
|
97
|
+
end
|
98
|
+
def to_a
|
99
|
+
@hash.keys
|
100
|
+
end
|
101
|
+
def flatten_merge(set, seen = List.new!)
|
102
|
+
set.each { |e|
|
103
|
+
if e.is_a?(List)
|
104
|
+
if seen.include?(e_id = e.object_id)
|
105
|
+
raise ArgumentError, "tried to flatten recursive List"
|
106
|
+
end
|
107
|
+
seen.add(e_id)
|
108
|
+
flatten_merge(e, seen)
|
109
|
+
seen.delete(e_id)
|
110
|
+
else
|
111
|
+
add(e)
|
112
|
+
end
|
113
|
+
}
|
114
|
+
self
|
115
|
+
end
|
116
|
+
protected :flatten_merge
|
117
|
+
def flatten
|
118
|
+
self.class.new!.flatten_merge(self)
|
119
|
+
end
|
120
|
+
def flatten!
|
121
|
+
detect {|e| e.is_a?(List) }? replace(flatten()) : nil
|
122
|
+
end
|
123
|
+
def member?(a)
|
124
|
+
@hash.include?(a)
|
125
|
+
end
|
126
|
+
alias include? member?
|
127
|
+
def contianing_list?(li)
|
128
|
+
li.is_a?(List) or raise ArgumentError, "value must be a List"
|
129
|
+
return false if size < li.size
|
130
|
+
li.all? {|a| include?(a) }
|
131
|
+
end
|
132
|
+
alias superset? contianing_list?
|
133
|
+
alias >= contianing_list?
|
134
|
+
def strict_contianing_list?(li)
|
135
|
+
li.is_a?(List) or raise ArgumentError, "value must be a List"
|
136
|
+
return false if size <= li.size
|
137
|
+
li.all? {|a| include?(a) }
|
138
|
+
end
|
139
|
+
alias proper_superset? strict_contianing_list?
|
140
|
+
alias > strict_contianing_list?
|
141
|
+
def contianed_list?(li)
|
142
|
+
li.is_a?(List) or raise ArgumentError, "value must be a List"
|
143
|
+
return false if li.size < size
|
144
|
+
all? {|a| li.include?(a) }
|
145
|
+
end
|
146
|
+
alias subset? contianed_list?
|
147
|
+
alias <= contianed_list?
|
148
|
+
def strictly_contianed_list?(li)
|
149
|
+
li.is_a?(List) or raise ArgumentError, "value must be a set"
|
150
|
+
return false if li.size <= size
|
151
|
+
all? {|a| li.include?(a) }
|
152
|
+
end
|
153
|
+
alias proper_subset? strictly_contianed_list?
|
154
|
+
alias < strictly_contianed_list?
|
155
|
+
def each(&block)
|
156
|
+
block or return enum_for(__method__)
|
157
|
+
@hash.each_key(&block)
|
158
|
+
self
|
159
|
+
end
|
160
|
+
def add(a)
|
161
|
+
@hash[a] = true
|
162
|
+
self
|
163
|
+
end
|
164
|
+
alias << add
|
165
|
+
def add?(a)
|
166
|
+
include?(a) ? nil : add(a)
|
167
|
+
end
|
168
|
+
def delete(a)
|
169
|
+
@hash.delete(a)
|
170
|
+
self
|
171
|
+
end
|
172
|
+
def delete?(a)
|
173
|
+
include?(a) ? delete(a) : nil
|
174
|
+
end
|
175
|
+
def delete_if
|
176
|
+
block_given? or return enum_for(__method__)
|
177
|
+
to_a.each {|a| @hash.delete(a) if yield(a) }
|
178
|
+
self
|
179
|
+
end
|
180
|
+
def keep_if
|
181
|
+
block_given? or return enum_for(__method__)
|
182
|
+
to_a.each {|a| @hash.delete(a) unless yield(a) }
|
183
|
+
self
|
184
|
+
end
|
185
|
+
def collect!
|
186
|
+
block_given? or return enum_for(__method__)
|
187
|
+
li = self.class.new!
|
188
|
+
each {|a| li << yield(a) }
|
189
|
+
replace(li)
|
190
|
+
end
|
191
|
+
alias map! collect!
|
192
|
+
def reject!(&block)
|
193
|
+
block or return enum_for(__method__)
|
194
|
+
n = size
|
195
|
+
delete_if(&block)
|
196
|
+
size == n ? nil : self
|
197
|
+
end
|
198
|
+
def select!(&block)
|
199
|
+
block or return enum_for(__method__)
|
200
|
+
n = size
|
201
|
+
keep_if(&block)
|
202
|
+
size == n ? nil : self
|
203
|
+
end
|
204
|
+
def merge(enum)
|
205
|
+
enum.instance_of?(self.class) ? @hash.update(enum.instance_variable_get(:@hash)) : with_enum(enum) { |o| add(o) }
|
206
|
+
self
|
207
|
+
end
|
208
|
+
def subtract(enum)
|
209
|
+
with_enum(enum) {|a| delete(a) }
|
210
|
+
self
|
211
|
+
end
|
212
|
+
def union(a)
|
213
|
+
dup.merge(a)
|
214
|
+
end
|
215
|
+
alias + union
|
216
|
+
alias | union
|
217
|
+
def difference(a)
|
218
|
+
dup.subtract(a)
|
219
|
+
end
|
220
|
+
alias - difference
|
221
|
+
def intersection(a)
|
222
|
+
n = self.class.new!
|
223
|
+
with_enum(a) {|b| n.add(b) if include?(b) }
|
224
|
+
n
|
225
|
+
end
|
226
|
+
alias & intersection
|
227
|
+
def symetric_difference(a)
|
228
|
+
n = List.new!(a)
|
229
|
+
each {|b| if n.include?(b) then n.delete(b) else n.add(b) end }
|
230
|
+
n
|
231
|
+
end
|
232
|
+
alias ^ symetric_difference
|
233
|
+
alias sym_diff symetric_difference
|
234
|
+
def ==(other)
|
235
|
+
if self.equal?(other)
|
236
|
+
true
|
237
|
+
elsif other.instance_of?(self.class)
|
238
|
+
@hash == other.instance_variable_get(:@hash)
|
239
|
+
elsif other.is_a?(List) && self.size == other.size
|
240
|
+
other.all? {|a| @hash.include?(a) }
|
241
|
+
else
|
242
|
+
false
|
243
|
+
end
|
244
|
+
end
|
245
|
+
def hash
|
246
|
+
@hash.hash
|
247
|
+
end
|
248
|
+
def eql?(a)
|
249
|
+
return false unless a.is_a?(List)
|
250
|
+
@hash.eql?(a.instance_variable_get(:@hash))
|
251
|
+
end
|
252
|
+
def cartisian(a)
|
253
|
+
# E.g.
|
254
|
+
# {1, 2} × {red, white} = {(1, red), (1, white), (2, red), (2, white)}.
|
255
|
+
# {1, 2, green} × {red, white, green} = {(1, red), (1, white), (1, green), (2, red), (2, white), (2, green), (green, red), (green, white), (green, green)}.
|
256
|
+
# {1, 2} × {1, 2} = {(1, 1), (1, 2), (2, 1), (2, 2)}.
|
257
|
+
#Some basic properties of cartesian products:
|
258
|
+
#A × ∅ = ∅.
|
259
|
+
#A × (B ∪ C) = (A × B) ∪ (A × C).
|
260
|
+
#(A ∪ B) × C = (A × C) ∪ (B × C).
|
261
|
+
#Let A and B be finite sets. Then
|
262
|
+
#| A × B | = | B × A | = | A | × | B |.
|
263
|
+
end
|
264
|
+
alias * cartisian
|
265
|
+
alias x cartisian
|
266
|
+
def categorise_list
|
267
|
+
# e.g.:
|
268
|
+
# files = List.new(Dir.glob("*.rb"))
|
269
|
+
# ret = files.classify { |f| File.mtime(f).year }
|
270
|
+
# p ret # => {2010=>#<List: {"a.rb", "b.rb"}>,2011=>#<List: {"c.rb", "d.rb", "e.rb"}>,2012=>#<List: {"f.rb"}>}
|
271
|
+
block_given? or return enum_for(__method__)
|
272
|
+
h = {}
|
273
|
+
each { |i|
|
274
|
+
x = yield(i)
|
275
|
+
(h[x] ||= self.class.new!).add(i)
|
276
|
+
}
|
277
|
+
h
|
278
|
+
end
|
279
|
+
alias classify categorise_list
|
280
|
+
def contain_by_rule(&rule)
|
281
|
+
rule or return enum_for(__method__)
|
282
|
+
if rule.arity == 2
|
283
|
+
require 'tsort'
|
284
|
+
class << dig = {} # :nodoc:
|
285
|
+
include TSort
|
286
|
+
alias tsort_each_node each_key
|
287
|
+
def tsort_each_child(node, &block)
|
288
|
+
fetch(node).each(&block)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
each { |u|
|
292
|
+
dig[u] = a = []
|
293
|
+
each{ |v| rule.call(u, v) and a << v }
|
294
|
+
}
|
295
|
+
li = List.new!()
|
296
|
+
dig.each_strongly_connected_component { |css|
|
297
|
+
li.add(self.class.new!(css))
|
298
|
+
}
|
299
|
+
li
|
300
|
+
else
|
301
|
+
List.new!(classify(&rule).values)
|
302
|
+
end
|
303
|
+
alias contain_by contain_by_rule
|
304
|
+
alias divide contain_by_rule
|
305
|
+
end
|
306
|
+
def inspect
|
307
|
+
ids = (Thread.current[:__inspect_key__] ||= [])
|
308
|
+
return sprintf('#<%s:: {...}>', self.class.name) if ids.include?(object_id)
|
309
|
+
begin
|
310
|
+
ids << object_id
|
311
|
+
return sprintf('#<%s:: {%s}>', self.class, to_a.inspect[1..-2])
|
312
|
+
ensure
|
313
|
+
ids.pop
|
314
|
+
end
|
315
|
+
end
|
316
|
+
def pretty_print(pp)
|
317
|
+
pp.text sprintf('#<%s:: {', self.class.name)
|
318
|
+
pp.nest(1) {
|
319
|
+
pp.seplist(self) { |o|
|
320
|
+
pp.pp o
|
321
|
+
}
|
322
|
+
}
|
323
|
+
pp.text "}>"
|
324
|
+
end
|
325
|
+
alias pp pretty_print
|
326
|
+
def pretty_print_cycle(pp)
|
327
|
+
pp.text sprintf('#<%s:: {%s}>', self.class.name, empty? ? '' : '...')
|
328
|
+
end
|
329
|
+
alias pp_cycle pretty_print_cycle
|
330
|
+
end
|
331
|
+
class Set < List
|
332
|
+
@@setup = false
|
333
|
+
def Set.new!(*args)
|
334
|
+
new(args)
|
335
|
+
end
|
336
|
+
private_class_method :new
|
337
|
+
private :initialize
|
338
|
+
def initialize(*args, &block)
|
339
|
+
initialize(*args, &block)
|
340
|
+
end
|
341
|
+
end
|
342
|
+
class Sigma<Numeric
|
343
|
+
def Sigma.new!(a,b)
|
344
|
+
if a.kind_of?(Sigma)
|
345
|
+
a
|
346
|
+
elsif a.kind_of?(Quotient)
|
347
|
+
new(a,b)
|
348
|
+
elsif a.kind_of?(Natural) or a.kind_of?(Counting) or a.kind_of?(Zahlen) or a.kind_of?(Fraction) or a.kind_of?(Decimal)
|
349
|
+
elsif
|
350
|
+
new(a.to_Q,b)
|
351
|
+
elsif a.kind_of?(NaughtClass) or a.kind_of?(EmptyListClass) or a.kind_of?(NilClass)
|
352
|
+
a unless b
|
353
|
+
new(Quotinet(0,1),b) if b
|
354
|
+
elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
|
355
|
+
a
|
356
|
+
end
|
357
|
+
end
|
358
|
+
private_class_method :new
|
359
|
+
@@epsilon = Quotient(1,100000000000)
|
360
|
+
@@upsilon = "a very large number ceiling to signal change to scientific format"
|
361
|
+
def Sigma::epsilon(e)
|
362
|
+
#on epsilon change flag for dirty and recalculate
|
363
|
+
end
|
364
|
+
def initialize(rat,irrat,abs=1)
|
365
|
+
@absolute = abs
|
366
|
+
@rat = rat
|
367
|
+
@irrat = irrat
|
368
|
+
@k = 1
|
369
|
+
@k0 = 0
|
370
|
+
@update_proc = proc{ ret = Quotient(0,1) ; (@k0..@k).to_a.each{|n| ret += @irrat.call(n)}; ret}
|
371
|
+
end
|
372
|
+
attr_accessor :k, :k0
|
373
|
+
def convergents
|
374
|
+
[]
|
375
|
+
end
|
376
|
+
def irrational
|
377
|
+
true ? false : true
|
378
|
+
end
|
379
|
+
def rational?
|
380
|
+
true ? true : false
|
381
|
+
end
|
382
|
+
def to_a
|
383
|
+
convergents
|
384
|
+
end
|
385
|
+
def to_s
|
386
|
+
e = ""
|
387
|
+
e = "-" if @absolute == -1
|
388
|
+
# @update_proc
|
389
|
+
end
|
390
|
+
def updateApprox(&block)
|
391
|
+
instance_exec(&block)
|
392
|
+
end
|
393
|
+
def updateApprox1
|
394
|
+
@rat += @update_proc.call
|
395
|
+
# instance_eval(@update_eval.call)
|
396
|
+
end
|
397
|
+
def next
|
398
|
+
t = @k
|
399
|
+
@k0 = t
|
400
|
+
@k += 1
|
401
|
+
@rat += @update_proc.call
|
402
|
+
t = @k
|
403
|
+
@k0 = t
|
404
|
+
@k += 1
|
405
|
+
end
|
406
|
+
private :initialize
|
407
|
+
attr_accessor :update_proc
|
408
|
+
def to_Q
|
409
|
+
@rat
|
410
|
+
end
|
411
|
+
def to_Dec
|
412
|
+
@rat.to_Dec
|
413
|
+
end
|
414
|
+
end
|
415
|
+
#class List
|
416
|
+
#end
|
417
|
+
class Sequence
|
418
|
+
def initialize
|
419
|
+
@index0 = 0
|
420
|
+
@indexn = 50
|
421
|
+
@func = proc{|k|
|
422
|
+
@a_n_minus1 = @a_n
|
423
|
+
@a_n *= (Quotient(1) + Quotient(Zahlen(1),Natural(k+1)))
|
424
|
+
}
|
425
|
+
@a_n_minus1 = Quotient(1)
|
426
|
+
@a_n = Quotient(1)
|
427
|
+
@sequence = List.new!#([])
|
428
|
+
(@index0..@indexn).to_a.each{|n|
|
429
|
+
@sequence << @func.call(n)}
|
430
|
+
end
|
431
|
+
def to_h
|
432
|
+
end
|
433
|
+
def to_cols
|
434
|
+
result = [[],[]]
|
435
|
+
(@index0..@indexn).to_a.each{|n|
|
436
|
+
result.at(0)<< n
|
437
|
+
result.at(1)<< @func.call(n)}
|
438
|
+
end
|
439
|
+
def to_Set
|
440
|
+
Set(@sequence)
|
441
|
+
end
|
442
|
+
def to_Series
|
443
|
+
a = Sigma(@sequence.inject(:+).to_Q) {@func}
|
444
|
+
a.k0 = @index0
|
445
|
+
a.k = @indexn
|
446
|
+
a
|
447
|
+
end
|
448
|
+
end
|
data/lib/{M500.rb → m500.rb}
RENAMED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# m500.rb -
|
3
3
|
# $Release Version: 0.9 $
|
4
|
-
# $Revision: 1.
|
4
|
+
# $Revision: 1.45 $
|
5
5
|
# by mark ingram
|
6
6
|
#
|
7
7
|
# --
|
@@ -122,12 +122,15 @@ class String
|
|
122
122
|
ret = naught
|
123
123
|
if md then
|
124
124
|
t = 1
|
125
|
-
ret = Quotient(Zahlen(md[1].to_i),Natural(md[2].to_i))
|
125
|
+
Natural(md[2].to_i).kind_of?(EmptySetClass) ? ret = infinity : ret = Quotient(Zahlen(md[1].to_i),Natural(md[2].to_i))
|
126
126
|
else
|
127
|
-
ret = Quotient(Zahlen(md[1].to_i),Natural(md[2].to_i))
|
127
|
+
Natural(md[2].to_i).kind_of?(EmptySetClass) ? ret = infinity : ret = Quotient(Zahlen(md[1].to_i),Natural(md[2].to_i))
|
128
128
|
end
|
129
129
|
ret
|
130
130
|
end
|
131
|
+
def to_ST
|
132
|
+
ST.new(self)
|
133
|
+
end
|
131
134
|
def to_Dec
|
132
135
|
re = /^-/
|
133
136
|
md = re.match(self.to_s)
|
@@ -433,6 +436,63 @@ class Rational
|
|
433
436
|
"<mn #{sgml_id}class='rational'>#{self.to_s}</mn>"
|
434
437
|
end
|
435
438
|
end
|
439
|
+
class ST<Numeric
|
440
|
+
#class SymbolicTerm<Numeric
|
441
|
+
def initialize(a,b=0,c='t') # a*(c) + b
|
442
|
+
if a.kind_of?(String)
|
443
|
+
regex = /(\d+[a-z])*(\+)?(\d+)?/
|
444
|
+
m = regex.match(a)
|
445
|
+
n = /(\d+)([a-z])/.match(m[1]) if m[1]
|
446
|
+
@a = [n.nil? ? 0 : n[1] ? n[1] : 0, m[3] ? m[3] : 0, n.nil? ? c : n[2] ? n[2] : 0]
|
447
|
+
else
|
448
|
+
@a = [a,b,c]
|
449
|
+
end
|
450
|
+
end
|
451
|
+
attr_reader :a
|
452
|
+
def +(o)
|
453
|
+
if o.kind_of?(ST) then
|
454
|
+
"#{@a.at(0).to_i+o.a.at(0).to_i}#{@a.at(2)}+#{@a.at(1).to_i+o.a.at(1).to_i}"
|
455
|
+
elsif o == 0
|
456
|
+
self
|
457
|
+
else
|
458
|
+
a.at(0).to_i ==0 ? o : "#{@a.at(0)}#{@a.at(2)}+#{@a.at(1).to_i+o}" if o.kind_of?(Numeric)
|
459
|
+
end
|
460
|
+
end
|
461
|
+
def *(o)
|
462
|
+
if o.kind_of?(ST) then
|
463
|
+
"#{@a.at(0).to_i*o.a.at(0).to_i}#{@a.at(2)}+#{@a.at(1).to_i*o.a.at(1)}"
|
464
|
+
elsif o == 0
|
465
|
+
"0"
|
466
|
+
else
|
467
|
+
"#{@a.at(0).to_i*o}#{@a.at(2)}+#{@a.at(1).to_i*o}" if o.kind_of?(Numeric)
|
468
|
+
end
|
469
|
+
end
|
470
|
+
def -(o)
|
471
|
+
if o.kind_of?(ST) then
|
472
|
+
"#{@a.at(0).to_i-o.a.at(0).to_i}#{@a.at(2)}+#{@a.at(1)-o.a.at(1)}"
|
473
|
+
else
|
474
|
+
"#{@a.at(0)}#{@a.at(2)}+#{@a.at(1)-o}" if o.kind_of?(Numeric)
|
475
|
+
end
|
476
|
+
end
|
477
|
+
def /(o)
|
478
|
+
if o.kind_of?(ST) then
|
479
|
+
"#{@a.at(0).to_i/o.a.at(0).to_i}#{@a.at(2)}+#{@a.at(1).to_i/o.a.at(1)}"
|
480
|
+
elsif o == 0
|
481
|
+
"OO"
|
482
|
+
else
|
483
|
+
"#{@a.at(0).to_i/o}#{@a.at(2)}+#{@a.at(1).to_i/o}" if o.kind_of?(Numeric)
|
484
|
+
end
|
485
|
+
end
|
486
|
+
def coerce(o)
|
487
|
+
[self, o]
|
488
|
+
end
|
489
|
+
def to_s
|
490
|
+
"'#{@a.at(0)}#{@a.at(2)}+#{@a.at(1)}'"
|
491
|
+
end
|
492
|
+
def inspect
|
493
|
+
"'#{@a.at(0)}#{@a.at(2)}+#{@a.at(1)}'.to_ST"
|
494
|
+
end
|
495
|
+
end
|
436
496
|
def naught
|
437
497
|
NaughtClass.new!
|
438
498
|
end
|
@@ -1157,6 +1217,16 @@ class Counting < Natural
|
|
1157
1217
|
Counting(x ** y)
|
1158
1218
|
end
|
1159
1219
|
end
|
1220
|
+
def factorial_1
|
1221
|
+
(Counting(1)..self).inject {|product, n| product * n }
|
1222
|
+
end
|
1223
|
+
def factorial
|
1224
|
+
if self == Counting(0)
|
1225
|
+
Counting(1)
|
1226
|
+
else
|
1227
|
+
self * Counting(self.to_i-1).factorial
|
1228
|
+
end
|
1229
|
+
end
|
1160
1230
|
def % (a)
|
1161
1231
|
self.to_i%(a.to_i)
|
1162
1232
|
end
|
@@ -2483,7 +2553,17 @@ t << zz
|
|
2483
2553
|
elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
|
2484
2554
|
infinity
|
2485
2555
|
else
|
2486
|
-
|
2556
|
+
op = Matrix(2,4)
|
2557
|
+
op.at_1_1 = 1
|
2558
|
+
op.at_2_1 = 0
|
2559
|
+
op.at_1_2 = 0
|
2560
|
+
op.at_2_2 = 1
|
2561
|
+
op.at_1_3 = 0
|
2562
|
+
op.at_2_3 = 0
|
2563
|
+
op.at_1_4 = 1
|
2564
|
+
op.at_2_4 = 0
|
2565
|
+
res = self.operation(op,a)
|
2566
|
+
res.to_K
|
2487
2567
|
end
|
2488
2568
|
end
|
2489
2569
|
def -(a)
|
@@ -2492,7 +2572,17 @@ t << zz
|
|
2492
2572
|
elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
|
2493
2573
|
infinity
|
2494
2574
|
else
|
2495
|
-
|
2575
|
+
op = Matrix(2,4)
|
2576
|
+
op.at_1_1 = 1
|
2577
|
+
op.at_2_1 = 0
|
2578
|
+
op.at_1_2 = 0
|
2579
|
+
op.at_2_2 = -1
|
2580
|
+
op.at_1_3 = 0
|
2581
|
+
op.at_2_3 = 0
|
2582
|
+
op.at_1_4 = 1
|
2583
|
+
op.at_2_4 = 0
|
2584
|
+
res = self.operation(op,a)
|
2585
|
+
res.to_K
|
2496
2586
|
end
|
2497
2587
|
end
|
2498
2588
|
def * (a)
|
@@ -2501,7 +2591,17 @@ t << zz
|
|
2501
2591
|
elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
|
2502
2592
|
infinity
|
2503
2593
|
else
|
2504
|
-
|
2594
|
+
op = Matrix(2,4)
|
2595
|
+
op.at_1_1 = 0
|
2596
|
+
op.at_2_1 = 1
|
2597
|
+
op.at_1_2 = 0
|
2598
|
+
op.at_2_2 = 0
|
2599
|
+
op.at_1_3 = 0
|
2600
|
+
op.at_2_3 = 0
|
2601
|
+
op.at_1_4 = 1
|
2602
|
+
op.at_2_4 = 0
|
2603
|
+
res = self.operation(op,a)
|
2604
|
+
res.to_K
|
2505
2605
|
end
|
2506
2606
|
end
|
2507
2607
|
def / (a)
|
@@ -2510,11 +2610,134 @@ t << zz
|
|
2510
2610
|
elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
|
2511
2611
|
NAN.Class.new
|
2512
2612
|
elsif a.kind_of?(Kuttenbruch)
|
2513
|
-
|
2613
|
+
op = Matrix(2,4)
|
2614
|
+
op.at_1_1 = 1
|
2615
|
+
op.at_2_1 = 0
|
2616
|
+
op.at_1_2 = 0
|
2617
|
+
op.at_2_2 = 0
|
2618
|
+
op.at_1_3 = 0
|
2619
|
+
op.at_2_3 = 0
|
2620
|
+
op.at_1_4 = 0
|
2621
|
+
op.at_2_4 = 1
|
2622
|
+
res = self.operation(op,a)
|
2623
|
+
res.to_K
|
2514
2624
|
else
|
2515
2625
|
(self.to_Q/a.to_Q).to_K
|
2516
2626
|
end
|
2517
2627
|
end
|
2628
|
+
def operation(z,other)
|
2629
|
+
oa = other.to_a
|
2630
|
+
sa = self.to_a
|
2631
|
+
a0 = nil
|
2632
|
+
b0 = nil
|
2633
|
+
c0 = nil
|
2634
|
+
d0 = nil
|
2635
|
+
e0 = nil
|
2636
|
+
f0 = nil
|
2637
|
+
g0 = nil
|
2638
|
+
h0 = nil
|
2639
|
+
a1 = nil
|
2640
|
+
b1 = nil
|
2641
|
+
c1 = nil
|
2642
|
+
d1 = nil
|
2643
|
+
e1 = nil
|
2644
|
+
f1 = nil
|
2645
|
+
g1 = nil
|
2646
|
+
h1 = nil
|
2647
|
+
x = 0
|
2648
|
+
y =0
|
2649
|
+
res_a = []
|
2650
|
+
if z.kind_of?(Matrix) then
|
2651
|
+
# check is z = Matrix(2,4)
|
2652
|
+
a0 = z.at_1_1
|
2653
|
+
e0 = z.at_2_1
|
2654
|
+
b0 = z.at_1_2
|
2655
|
+
f0 = z.at_2_2
|
2656
|
+
c0 = z.at_1_3
|
2657
|
+
g0 = z.at_2_3
|
2658
|
+
d0 = z.at_1_4
|
2659
|
+
h0 = z.at_2_4
|
2660
|
+
else
|
2661
|
+
p "raise an input error NOT a MATRIX 2x4"
|
2662
|
+
end
|
2663
|
+
tmp = 0
|
2664
|
+
self.to_pix(a0,b0,c0,d0,e0,f0,g0,h0)
|
2665
|
+
p "init"
|
2666
|
+
while tmp <19 #true # size of k_res is less than epsilon
|
2667
|
+
eggs = true
|
2668
|
+
if e0 == 0 or f0 == 0 or g0 == 0 or h0 == 0 then
|
2669
|
+
eggs = false if f0 == 0
|
2670
|
+
else # all are positive
|
2671
|
+
p "positive"
|
2672
|
+
#p a0.div(e0).at(0)
|
2673
|
+
eggs = false if a0.divmod(e0).at(0) == c0.divmod(g0).at(0)
|
2674
|
+
end
|
2675
|
+
#p (f > 0 and e > 0 and g > 0 )? (b/f-a/e).abs : f,e,g
|
2676
|
+
#p (f > 0 and e > 0 and g > 0 ) ? (c/g-a/e).abs : f,e,g
|
2677
|
+
p "### #{eggs}"
|
2678
|
+
if eggs then
|
2679
|
+
p "to the right"
|
2680
|
+
x = sa.shift
|
2681
|
+
a1 = (a0*x)+c0
|
2682
|
+
b1 = (b0*x)+d0
|
2683
|
+
c1 = a0
|
2684
|
+
d1 = b0
|
2685
|
+
e1 = (e0*x)+g0
|
2686
|
+
f1 = (f0*x)+h0
|
2687
|
+
g1 = e0
|
2688
|
+
h1 = f0
|
2689
|
+
self.to_pix(a1,b1,c1,d1,e1,f1,g1,h1)
|
2690
|
+
else
|
2691
|
+
p "downwards"
|
2692
|
+
y = oa.shift
|
2693
|
+
a1 = (a0*y)+b0
|
2694
|
+
b1 = a0
|
2695
|
+
c1 = (c0*y)+d0
|
2696
|
+
d1 = c0
|
2697
|
+
e1 = (e0*y)+f0
|
2698
|
+
f1 = e0
|
2699
|
+
g1 = (g0*y)+h0
|
2700
|
+
h1 = g0
|
2701
|
+
self.to_pix(a1,b1,c1,d1,e1,f1,g1,h1)
|
2702
|
+
end
|
2703
|
+
test = false
|
2704
|
+
eucint = a0.divmod(e0).at(0) if e0 > 0
|
2705
|
+
if y > 1 and x > 1 and f0 > 0 and g0 > 0 and h0>0
|
2706
|
+
test = eucint == b0.divmod(f0).at(0) and eucint == c0.divmod(g0).at(0) and eucint == d0.divmod(h0).at(0) and eucint > 0
|
2707
|
+
end
|
2708
|
+
if test then
|
2709
|
+
p "here"
|
2710
|
+
res_a << eucint
|
2711
|
+
a0 = e1
|
2712
|
+
b0 = f1
|
2713
|
+
c0 = g1
|
2714
|
+
d0 = h1
|
2715
|
+
e0 = a1-(e1*eucint)
|
2716
|
+
f0 = b1-(f1*eucint)
|
2717
|
+
g0 = c1-(g1*eucint)
|
2718
|
+
h0 = d1-(h1*eucint)
|
2719
|
+
a1 = a0
|
2720
|
+
b1 = b0
|
2721
|
+
c1 = c0
|
2722
|
+
d1 = d0
|
2723
|
+
e1 = e0
|
2724
|
+
f1 = f0
|
2725
|
+
g1 = g0
|
2726
|
+
h1 = h0
|
2727
|
+
self.to_pix(a1,b1,c1,d1,e1,f1,g1,h1)
|
2728
|
+
end
|
2729
|
+
tmp += 1
|
2730
|
+
a0 = a1
|
2731
|
+
b0 = b1
|
2732
|
+
c0 = c1
|
2733
|
+
d0 = d1
|
2734
|
+
e0 = e1
|
2735
|
+
f0 = f1
|
2736
|
+
g0 = g1
|
2737
|
+
h0 = h1
|
2738
|
+
end
|
2739
|
+
res_a
|
2740
|
+
end
|
2518
2741
|
def ** (a)
|
2519
2742
|
self.to_f ** a.to_f
|
2520
2743
|
end
|
@@ -2648,6 +2871,7 @@ class Real < Numeric
|
|
2648
2871
|
end
|
2649
2872
|
class Matrix
|
2650
2873
|
include SGML
|
2874
|
+
include Comparable
|
2651
2875
|
def to_sgml
|
2652
2876
|
tmp = "<mn #{sgml_id}class='matrix'><mrow><mo>(</mo><mtable>"
|
2653
2877
|
(1..@nsize).to_a.each{|a|
|
@@ -2745,6 +2969,9 @@ attr_accessor :msize, :nsize
|
|
2745
2969
|
def og!
|
2746
2970
|
@tr = false
|
2747
2971
|
end
|
2972
|
+
def size
|
2973
|
+
self.msize * self.nsize
|
2974
|
+
end
|
2748
2975
|
def +(nm)
|
2749
2976
|
a = ""
|
2750
2977
|
if not(nm.is_tr? or @tr) then
|
@@ -2781,14 +3008,14 @@ attr_accessor :msize, :nsize
|
|
2781
3008
|
end
|
2782
3009
|
return a
|
2783
3010
|
end
|
2784
|
-
|
3011
|
+
def -(nm)
|
2785
3012
|
a = ""
|
2786
3013
|
if not(nm.is_tr? or @tr) then
|
2787
3014
|
if nm.msize == @msize and nm.nsize == @nsize then
|
2788
3015
|
a= Matrix(@nsize, @msize)
|
2789
3016
|
(1..@nsize).to_a.each{|x|
|
2790
3017
|
(1..@msize).to_a.each{|y|
|
2791
|
-
eval("a.at_#{x}_#{y}= self.at_#{x}_#{y}
|
3018
|
+
eval("a.at_#{x}_#{y}= self.at_#{x}_#{y} - nm.at_#{x}_#{y}")
|
2792
3019
|
}
|
2793
3020
|
}
|
2794
3021
|
else
|
@@ -2798,7 +3025,7 @@ attr_accessor :msize, :nsize
|
|
2798
3025
|
a= Matrix(@nsize, @msize)
|
2799
3026
|
(1..@nsize).to_a.each{|x|
|
2800
3027
|
(1..@msize).to_a.each{|y|
|
2801
|
-
eval("a.at_#{x}_#{y}= self.at_#{x}_#{y}
|
3028
|
+
eval("a.at_#{x}_#{y}= self.at_#{x}_#{y} - nm.tr_#{x}_#{y}")
|
2802
3029
|
}
|
2803
3030
|
}
|
2804
3031
|
else
|
@@ -2808,7 +3035,7 @@ attr_accessor :msize, :nsize
|
|
2808
3035
|
a= Matrix(@msize, @nsize)
|
2809
3036
|
(1..@msize).to_a.each{|x|
|
2810
3037
|
(1..@nsize).to_a.each{|y|
|
2811
|
-
eval("a.at_#{x}_#{y}= self.tr_#{x}_#{y}
|
3038
|
+
eval("a.at_#{x}_#{y}= self.tr_#{x}_#{y} - nm.at_#{x}_#{y}")
|
2812
3039
|
}
|
2813
3040
|
}
|
2814
3041
|
else
|
@@ -2817,6 +3044,111 @@ attr_accessor :msize, :nsize
|
|
2817
3044
|
end
|
2818
3045
|
return a
|
2819
3046
|
end
|
3047
|
+
def *(nm)
|
3048
|
+
a = nil
|
3049
|
+
cmd = ""
|
3050
|
+
if nm.kind_of?(Matrix) then
|
3051
|
+
if not(nm.is_tr? or @tr) then
|
3052
|
+
if nm.msize == @msize and nm.nsize == @nsize then
|
3053
|
+
a= Matrix(@nsize, @msize)
|
3054
|
+
(1..@nsize).to_a.each{|x|
|
3055
|
+
(1..@msize).to_a.each{|y|
|
3056
|
+
cmd += "a.at_#{x}_#{y}= self.at_#{x}_#{y} * nm.at_#{x}_#{y};"
|
3057
|
+
}
|
3058
|
+
}
|
3059
|
+
else
|
3060
|
+
end
|
3061
|
+
elsif nm.is_tr? and not @tr then
|
3062
|
+
if nm.msize == @nsize and nm.nsize == @msize then
|
3063
|
+
a= Matrix(@nsize, @msize)
|
3064
|
+
(1..@nsize).to_a.each{|x|
|
3065
|
+
(1..@msize).to_a.each{|y|
|
3066
|
+
cmd += "a.at_#{x}_#{y}= self.at_#{x}_#{y} * nm.tr_#{x}_#{y};"
|
3067
|
+
}
|
3068
|
+
}
|
3069
|
+
else
|
3070
|
+
end
|
3071
|
+
elsif not nm.is_tr? and @tr then
|
3072
|
+
if nm.msize == @nsize and nm.nsize == @msize then
|
3073
|
+
a= Matrix(@msize, @nsize)
|
3074
|
+
(1..@msize).to_a.each{|x|
|
3075
|
+
(1..@nsize).to_a.each{|y|
|
3076
|
+
cmd += "a.at_#{x}_#{y}= self.tr_#{x}_#{y} + nm.at_#{x}_#{y};"
|
3077
|
+
}
|
3078
|
+
}
|
3079
|
+
else
|
3080
|
+
end
|
3081
|
+
else
|
3082
|
+
end
|
3083
|
+
elsif nm.kind_of?(Numeric)
|
3084
|
+
a= Matrix(@msize, @nsize)
|
3085
|
+
(1..@msize).to_a.each{|x|
|
3086
|
+
(1..@nsize).to_a.each{|y|
|
3087
|
+
cmd += "a.at_#{x}_#{y}= self.at_#{x}_#{y} * nm;"
|
3088
|
+
}
|
3089
|
+
}
|
3090
|
+
end
|
3091
|
+
eval(cmd)
|
3092
|
+
return a
|
3093
|
+
end
|
3094
|
+
def <=>(o)
|
3095
|
+
r = -1 if self.size < o.size
|
3096
|
+
r = 0 if self.size == o.size
|
3097
|
+
r = 1 if self.size > o.size
|
3098
|
+
r
|
3099
|
+
end
|
3100
|
+
def ==(o)
|
3101
|
+
t = []
|
3102
|
+
if self.msize == o.msize and self.nsize == o.nsize then
|
3103
|
+
m = (1..self.msize)
|
3104
|
+
n = (1..self.nsize)
|
3105
|
+
for x in m
|
3106
|
+
for y in n
|
3107
|
+
self.send("at_#{x}_#{y}") == o.send("at_#{x}_#{y}") ? t << true : t << false
|
3108
|
+
end
|
3109
|
+
end
|
3110
|
+
end
|
3111
|
+
t.include?(false) ? false : true
|
3112
|
+
end
|
3113
|
+
def each
|
3114
|
+
m = (1..self.msize)
|
3115
|
+
n = (1..self.nsize)
|
3116
|
+
for x in m
|
3117
|
+
for y in n
|
3118
|
+
#p ".at_#{x}_#{y}"
|
3119
|
+
yield self.send("at_#{x}_#{y}")
|
3120
|
+
end
|
3121
|
+
end
|
3122
|
+
end
|
3123
|
+
def column_vectors
|
3124
|
+
#each_m
|
3125
|
+
end
|
3126
|
+
def row_vectors
|
3127
|
+
r = []
|
3128
|
+
# self.each_n{||}
|
3129
|
+
end
|
3130
|
+
def each_m
|
3131
|
+
m = (1..self.msize)
|
3132
|
+
n = (1..self.nsize)
|
3133
|
+
for x in m
|
3134
|
+
r = Matrix(1,self.nsize)
|
3135
|
+
for y in n
|
3136
|
+
r.send("at_1_#{y}=",self.send("at_#{x}_#{y}"))
|
3137
|
+
end
|
3138
|
+
yield r
|
3139
|
+
end
|
3140
|
+
end
|
3141
|
+
def each_n
|
3142
|
+
m = (1..self.msize)
|
3143
|
+
n = (1..self.nsize)
|
3144
|
+
for x in n
|
3145
|
+
r = Matrix(self.msize,1)
|
3146
|
+
for y in m
|
3147
|
+
r.send("at_#{y}_1=",self.send("at_#{y}_#{x}"))
|
3148
|
+
end
|
3149
|
+
yield r
|
3150
|
+
end
|
3151
|
+
end
|
2820
3152
|
def to_s
|
2821
3153
|
t = ""
|
2822
3154
|
(1..@nsize).to_a.each{|a|
|
@@ -2987,16 +3319,29 @@ tu += "\na\n}"
|
|
2987
3319
|
return a
|
2988
3320
|
end
|
2989
3321
|
def to_s
|
2990
|
-
|
2991
|
-
|
2992
|
-
|
2993
|
-
|
2994
|
-
|
2995
|
-
|
2996
|
-
|
3322
|
+
t = ""
|
3323
|
+
page = 4
|
3324
|
+
(1..@order.at(0)).to_a.each{|a|
|
3325
|
+
t << "|"
|
3326
|
+
(1..@order.at(1)).to_a.each{|b|
|
3327
|
+
t << eval("at_#{a}_#{b}_#{page}").to_s
|
3328
|
+
unless b == @order.at(1) then t << 9 end
|
3329
|
+
}
|
3330
|
+
t << "|"
|
3331
|
+
unless a == @order.at(1) then t << 10 end
|
2997
3332
|
}
|
2998
|
-
|
2999
|
-
|
3333
|
+
t
|
3334
|
+
end
|
3335
|
+
def to_csv
|
3336
|
+
t = ""
|
3337
|
+
(1..@order.a(0)).to_a.each{|a|
|
3338
|
+
(1..@order.at(1)).to_a.each{|b|
|
3339
|
+
t << eval("at_#{a}_#{b}_1").to_s
|
3340
|
+
unless b == @order.at(1) then t << 44 end
|
3341
|
+
}
|
3342
|
+
t << 10
|
3343
|
+
}
|
3344
|
+
t
|
3000
3345
|
end
|
3001
3346
|
def to_sgml
|
3002
3347
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: M500
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mark ingram
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: ''
|
14
14
|
email:
|
@@ -17,7 +17,8 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
-
- lib/
|
20
|
+
- lib/M500_containers.rb
|
21
|
+
- lib/m500.rb
|
21
22
|
homepage:
|
22
23
|
licenses:
|
23
24
|
- Ruby
|