M500 0.9.2 → 0.9.3
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 +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
         |