M500 0.9.4 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/m500.rb +761 -102
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f5712b1b8c783196668e0058380a93dcf4e38c7
4
- data.tar.gz: 61a9838b536b5ee65683ed2fc6e510b341521284
3
+ metadata.gz: ac4623172c8c3593148e5d41021c7e6af22b5cde
4
+ data.tar.gz: 81508c65134aac2effd6d6c26c7d16254dc53cf9
5
5
  SHA512:
6
- metadata.gz: 747f694ce51b80cc3e3ccd4b744384671aa2bba86119518413635bc29174c1590518c199e6e7ec7d5dc2a0269de8d252e2d82b875c059779cc2eec9f902fc1b0
7
- data.tar.gz: 2cdc5150485980d5a43af6e7ecc84f9820f3ce45c7809f7ad8dca16e19431865961f49621262b79e5f8d6d12cf235a1f12f56109e47ce4bc2c458e6bdb014627
6
+ metadata.gz: '0903c099d74d1148920d289fc9710e061f05200546e74b1b680bbff5c477f978e2f2dea898848b14a1c6add45469bf747f838edfa7960615ef2483a75ef69c73'
7
+ data.tar.gz: 7e3912857a7f424725749fe6bcb1ad14df71334e53f537e6e65a58321dba1f3488d4794a7dde99ecf8d155a3235350cfab6bfd2ee65caf6c28c0327e17bb3684
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # M500.rb -
3
3
  # $Release Version: 0.9 $
4
- # $Revision: 1.46 $
4
+ # $Revision: 1.47 $
5
5
  # by mark ingram
6
6
  #
7
7
  # --
@@ -36,6 +36,20 @@ class Array
36
36
  end
37
37
  end
38
38
  class String
39
+ def is_Q?
40
+ t = true
41
+ re = /(\d+)\/(\d+)/
42
+ md = re.match(self)
43
+ if md.nil? then
44
+ t = is_Z?
45
+ else
46
+ t = false if md[1].nil? && md[2].nil? && md[3].nil? && md[4].nil?
47
+ end
48
+ t
49
+ end
50
+ def is_r?
51
+ Rational(self).kind_of?(Rational)
52
+ end
39
53
  def is_f?
40
54
  t = true
41
55
  re = /(\-*\d+).(\d+)e([-|+])(\d+)/
@@ -43,25 +57,56 @@ class String
43
57
  t = false if md[1].nil? && md[2].nil? && md[3].nil? && md[4].nil?
44
58
  t
45
59
  end
46
- def is_Frac?
60
+ def is_N?
61
+ re = /(^[0-9]+)$/
62
+ md = re.match(self.to_s)
63
+ t = emptySet
64
+ t = md[1].to_i.to_N unless md.nil?
65
+ end
66
+ def is_N0?
67
+ re = /(^[0-9]+)$/
68
+ md = re.match(self.to_s)
69
+ t = emptySet
70
+ t = md[1].to_i.to_N unless md.nil?
71
+ end
72
+ def is_Z?
73
+ re = /(^-?[0-9]+)$/
74
+ md = re.match(self.to_s)
75
+ t = emptySet
76
+ t = Zahlen(md[1].to_i) unless md.nil?
77
+ end
78
+ def is_Q?
47
79
  t = true
48
- re = /(\d+) (\d+)\/(\d+)/
80
+ re = /(^-?[0-9]+)\/([0-9]+)/
49
81
  md = re.match(self)
50
- t = false if md[1].nil? && md[2].nil? && md[3].nil? && md[4].nil?
82
+ if md.nil?
83
+ t = false
84
+ else
85
+ t = false if md[1].nil? && md[2].nil? && md[3].nil? && md[4].nil?
86
+ end
51
87
  t
52
88
  end
53
- def is_Q?
89
+ def is_Frac?
54
90
  t = true
55
- re = /(\d+)\/(\d+)/
91
+ re = /(^-?[0-9]+) ([0-9]+)\/([0-9]+)/
56
92
  md = re.match(self)
57
- t = false if md[1].nil? && md[2].nil? && md[3].nil? && md[4].nil?
93
+ if md.nil?
94
+ t = false
95
+ else
96
+ t = false if md[1].nil? && md[2].nil? && md[3].nil? && md[4].nil?
97
+ end
58
98
  t
59
99
  end
60
100
  def is_Dec?
61
101
  t = true
62
- re = /(\d+)#{Decimal::decimalSeparator}(\d+)/
63
- md = re.match(self)
64
- t = false if md[1].nil? && md[2].nil?
102
+ re = /(^-?[0-9]+)\\#{Decimal::decimalSeparator}([0-9]+)/
103
+ re = /(^-?[0-9]+)\.([0-9]+)/
104
+ md = re.match(self.to_s)
105
+ if md.nil?
106
+ t = false
107
+ else
108
+ t = false if md[1].nil? && md[2].nil? && md[3].nil?
109
+ end
65
110
  t
66
111
  end
67
112
  def is_Sig?
@@ -69,55 +114,26 @@ class String
69
114
  def is_R?
70
115
  false
71
116
  end
72
- def to_N
73
- re = /(^\d+)/
117
+ def to_N
118
+ re = /(^[0-9]+)/
74
119
  md = re.match(self.to_s)
75
120
  t = emptySet
76
121
  t = md[1].to_i.to_N unless md.nil?
77
122
  end
78
- def to_Z
79
- re = /(^\d+)/
80
- md = re.match(self.to_s)
81
- t = emptySet
82
- if not md.nil? then
83
- t = Zahlen(md[1].to_i)
84
- else
85
- re = /(^-\d+)/
86
- md = re.match(self.to_s)
87
- t = Zahlen((md[1].to_i)) unless md.nil?
88
- end
89
- t
90
- end
91
123
  def to_N0
92
- re = /(\d+)/
124
+ re = /(^[0-9]+)/
93
125
  md = re.match(self.to_s)
94
126
  t = emptySet
95
- t = Counting(md[1].to_i) unless md.nil?
127
+ t = md[1].to_i.to_N0 unless md.nil?
96
128
  end
97
- def to_Frac
98
- re = /(^\d+) (\d+)\/(\d+)/
129
+ def to_Z
130
+ re = /(^-?[0-9]+)/
99
131
  md = re.match(self.to_s)
100
- t = nil
101
- if not md.nil? then
102
- t = Fraction(Zahlen(md[1].to_i),Quotient(md[2].to_i, md[3].to_i))
103
- else
104
- re = /^-1\((\d+) (\d+)\/(\d+)\)/
105
- md = re.match(self.to_s)
106
- if not md.nil? then
107
- t = Fraction(Zahlen(md[1].to_i),Quotient(md[2].to_i, md[3].to_i),-1) unless md.nil?
108
- else
109
- re = /(\-*\d+)\/(\d+)/
110
- md = re.match(self.to_s)
111
- if not md.nil? then
112
- t = Fraction(Quotient(Zahlen(md[1].to_i),Natural(md[2].to_i)))
113
- else
114
- t=Fraction(Quotient(self.to_i,1))
115
- end
116
- end
117
- end
132
+ t = emptySet
133
+ t = Zahlen(md[1].to_i) unless md.nil?
118
134
  end
119
135
  def to_Q
120
- re = /(\-*\d+)\/(\d+)/
136
+ re = /(-?[0-9]+)\/([0-9]+)/
121
137
  md = re.match(self.to_s)
122
138
  ret = naught
123
139
  if md then
@@ -128,9 +144,6 @@ class String
128
144
  end
129
145
  ret
130
146
  end
131
- def to_ST
132
- ST.new(self)
133
- end
134
147
  def to_Dec
135
148
  re = /^-/
136
149
  md = re.match(self.to_s)
@@ -141,16 +154,19 @@ class String
141
154
  t1 = '0'
142
155
  t2 = nil
143
156
  t3 = nil
144
- re = /(\d+)\.(\d+)\[(\d+)\]/
157
+ re = /([0-9]+)#{Decimal::decimalSeparator}([0-9]+)\[([0-9]+)\]/
158
+ re = /([0-9]+)\.([0-9]+)\[([0-9]+)\]/
145
159
  md = re.match(self.to_s)
146
160
  if md.to_a.empty? then
147
- re = /(\d+)\.(\d+)/
161
+ re = /([0-9]+)#{Decimal::decimalSeparator}([0-9]+)/
162
+ re = /([0-9]+)\.([0-9]+)/
148
163
  md = re.match(self.to_s)
149
164
  if md.to_a.empty? then
150
- re = /(\d+)\.\[(\d+)\]/
165
+ re = /([0-9]+)#{Decimal::decimalSeparator}\[([0-9]+)\]/
166
+ re = /([0-9]+)\.\[([0-9]+)\]/
151
167
  md = re.match(self.to_s)
152
168
  if md.to_a.empty? then
153
- re = /(\d+)/
169
+ re = /([0-9]+)/
154
170
  md = re.match(self.to_s)
155
171
  t0 = 0
156
172
  t1 = '0'
@@ -176,6 +192,31 @@ class String
176
192
  end
177
193
  Decimal(t3,t2,t1,t0,e)
178
194
  end
195
+ def to_Frac
196
+ re = /(^[0-9]+) ([0-9]+)\/([0-9]+)/
197
+ md = re.match(self.to_s)
198
+ t = nil
199
+ if not md.nil? then
200
+ t = Fraction(Zahlen(md[1].to_i),Quotient(md[2].to_i, md[3].to_i))
201
+ else
202
+ re = /^-1\(([0-9]+) ([0-9]+)\/([0-9]+)\)/
203
+ md = re.match(self.to_s)
204
+ if not md.nil? then
205
+ t = Fraction(Zahlen(md[1].to_i),Quotient(md[2].to_i, md[3].to_i),-1) unless md.nil?
206
+ else
207
+ re = /(\-*[0-9]+)\/([0-9]+)/
208
+ md = re.match(self.to_s)
209
+ if not md.nil? then
210
+ t = Fraction(Quotient(Zahlen(md[1].to_i),Natural(md[2].to_i)))
211
+ else
212
+ t=Fraction(Quotient(self.to_i,1))
213
+ end
214
+ end
215
+ end
216
+ end
217
+ def to_ST
218
+ ST.new(self)
219
+ end
179
220
  def is_K?
180
221
  t = true
181
222
  re = /(\d+)#{Kettenbruch::Separator}(\d+)/
@@ -192,7 +233,6 @@ class String
192
233
  end
193
234
  def append_K(a)
194
235
  a = a.to_Frac
195
- # "Fraction(Zahlen(#{a.integer.to_s}),Quotient(Zahlen(#{a.properfraction.numerator.to_s}),Zahlen(#{a.properfraction.denominator.to_s})))"
196
236
  self.gsub!("&&&&","Fraction(Zahlen(#{a.integer.to_s}),Quotient(Zahlen(#{a.properfraction.numerator.to_s}),Zahlen(#{a.properfraction.denominator.to_s})))")
197
237
  end
198
238
  def to_K
@@ -205,8 +245,29 @@ class String
205
245
  end
206
246
  def to_Sig
207
247
  end
208
- def to_R
209
- self.to_i
248
+ end
249
+ def Real(a,&block)
250
+ if a.kind_of?(Real)
251
+ a
252
+ elsif a.kind_of?(Array)
253
+ rez = Real.new!(Quotient(0,1),block)
254
+ rez.continuedFraction = a.to_s
255
+ rez.update_eval = proc{|k0,k,ret,irrat| (k0..k).to_a.each{|n| n==k0 ? ret << irrat.call(n): ret << ","+ irrat.call(n)}; ret = "[" + ret + "]";eval(Real::gcontinuedFractionFactory(eval(ret)))}
256
+ rez.updateApprox{
257
+ @k0 = 1
258
+ @k = 12
259
+ @rat += update_eval.call(@k0,@k,@continuedFraction,@irrat).to_Q
260
+ }
261
+ elsif a.kind_of?(Quotient)
262
+ Real.new!(a,block)
263
+ 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)
264
+ elsif
265
+ Real.new!(a.to_Q,block)
266
+ elsif a.kind_of?(NaughtClass) or a.kind_of?(EmptySetClass) or a.kind_of?(NilClass)
267
+ a unless b
268
+ new(Quotinet(0,1),block)
269
+ elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
270
+ a
210
271
  end
211
272
  end
212
273
  class Numeric
@@ -437,7 +498,6 @@ class Rational
437
498
  end
438
499
  end
439
500
  class ST<Numeric
440
- #class SymbolicTerm<Numeric
441
501
  def initialize(a,b=0,c='t') # a*(c) + b
442
502
  if a.kind_of?(String)
443
503
  regex = /(\d+[a-z])*(\+)?(\d+)?/
@@ -608,8 +668,6 @@ def Fraction(a,b=Quotient(0,1),c=1)
608
668
  else
609
669
  (a+b).to_Frac
610
670
  end
611
- # elsif a.kind_of?(Zahlen) && b.kind_of?(Fraction)
612
- # Fraction(a,b.to_Q)
613
671
  elsif Integer === a && b.kind_of?(Quotient)
614
672
  if a>0 then
615
673
  Fraction.new!(Zahlen(a),b,c)
@@ -678,12 +736,15 @@ def Decimal(a,b=nil,c='0',d=0,e=1)
678
736
  end
679
737
  def Kettenbruch(a,b='',c=1,leicht=true)
680
738
  if a.kind_of?(Kettenbruch)
681
- a
739
+ a
740
+ elsif a.kind_of?(Array)
741
+ b = a.shift
742
+ b<0 ? Kettenbruch.new!(-1*b,a) : Kettenbruch.new!(b,a)
682
743
  elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
683
744
  a
684
745
  elsif a.kind_of?(String)
685
- a.to_a.to_K
686
- elsif a.kind_of?(Proc) or a.kind_of?()
746
+ a.to_K
747
+ elsif a.kind_of?(Proc)
687
748
  a
688
749
  elsif (a.kind_of?(Fixnum) or a.kind_of?(Bignum)) and b.kind_of?(String)
689
750
  if (a>0 and c<0) or (a<0 and c>0) then
@@ -691,9 +752,21 @@ def Kettenbruch(a,b='',c=1,leicht=true)
691
752
  else
692
753
  Kettenbruch.new!(a,b,1)
693
754
  end
755
+ elsif a.kind_of?(Quotient) and b==''
756
+ if a.to_Z == emptySet then
757
+ (a>0 and c<0) or (a<0 and c>0) ? Kettenbruch.new!(a.abs,b,-1): Kettenbruch.new!(a.abs,b,1)
758
+ else
759
+ Kettenbruch(a.to_Z,b,c)
760
+ end
761
+ elsif (a.kind_of?(Zahlen) or a.kind_of?(Counting) or a.kind_of?(Natural))and b==''
762
+ (a>0 and c<0) or (a<0 and c>0) ? Kettenbruch.new!(a.abs,[],-1): Kettenbruch.new!(a.abs,[],1)
694
763
  end
695
764
  end
696
- def Real()
765
+ def Symbolic_Term(a,b)
766
+ Symbolic_Term.new(a,b)
767
+ end
768
+ def Symbolic_Prod(a,b)
769
+ Symbolic_Prod.new(a,b)
697
770
  end
698
771
  def Matrix(m,n)
699
772
  Matrix.instanciate(m,n)
@@ -734,11 +807,8 @@ class Natural < Numeric
734
807
  end
735
808
  def - (a)
736
809
  if a.kind_of?(Zahlen) or a.kind_of?(Counting) or a.kind_of?(Natural) or a.kind_of?(Bignum) or a.kind_of?(Fixnum)
737
- z = @a.to_i - a.to_i
738
- p z
739
- p z<=0
810
+ z = @a.to_i - a.to_i
740
811
  z <= 0 ? emptySet : Natural(z)
741
-
742
812
  elsif a.kind_of?(NaughtClass) or a.kind_of?(EmptySetClass)
743
813
  self
744
814
  elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
@@ -1711,16 +1781,19 @@ class Quotient < Numeric
1711
1781
  def to_K
1712
1782
  Kettenbruch(self.to_Frac)
1713
1783
  end
1784
+ def to_Z
1785
+ self.denominator == 1 ? Zahlen(self.numerator) : emptySet
1786
+ end
1714
1787
  def q2Dec(remainder)
1715
1788
  maxcount =1000
1716
1789
  kmcount = 0
1717
1790
  ret = nil
1718
- until (@remainders.member?(remainder) and @remainders.index(remainder)!= 0) or (kmcount > maxcount + 100) do # =8= KM
1791
+ until (@remainders.member?(remainder) and @remainders.index(remainder)!= 0) or (kmcount > maxcount + 100) do
1719
1792
  break if remainder == 0
1720
1793
  @remainders << remainder
1721
1794
  @reg2 << remainder.div(@denominator.to_i)
1722
1795
  remainder = remainder.remainder(@denominator.to_i)*10
1723
- kmcount += 1 # =8= KM
1796
+ kmcount += 1
1724
1797
  end
1725
1798
  @reg2.shift
1726
1799
  if remainder == 0
@@ -1730,14 +1803,13 @@ class Quotient < Numeric
1730
1803
  ret = "Decimal('-#{@numerator.div(@denominator)}#{Decimal::decimalSeparator}#{@reg2.join}')"
1731
1804
  end
1732
1805
  else
1733
- # @reg2.insert(@remainders.find_index(remainder)-1,"[")
1734
1806
  @reg2.insert(@remainders.find_index(remainder)-1,"[") unless (kmcount > maxcount + 100)
1735
1807
  if @abs1 ==1 then
1736
1808
  ret = "Decimal('#{@numerator.div(@denominator)}#{Decimal::decimalSeparator}#{@reg2.join}]')" unless (kmcount > maxcount + 100)
1737
- ret = "Decimal('#{@numerator.div(@denominator)}#{Decimal::decimalSeparator}#{@reg2.join}[0]')" if (kmcount > maxcount + 100) # =8= KM
1809
+ ret = "Decimal('#{@numerator.div(@denominator)}#{Decimal::decimalSeparator}#{@reg2.join}[0]')" if (kmcount > maxcount + 100)
1738
1810
  elsif @abs1 == -1
1739
1811
  ret = "Decimal('-#{@numerator.div(@denominator)}#{Decimal::decimalSeparator}#{@reg2.join}]')" unless (kmcount > maxcount + 100)
1740
- ret = "Decimal('#{@numerator.div(@denominator)}#{Decimal::decimalSeparator}#{@reg2.join}[0]')" if (kmcount > maxcount + 100) # =8= KM
1812
+ ret = "Decimal('#{@numerator.div(@denominator)}#{Decimal::decimalSeparator}#{@reg2.join}[0]')" if (kmcount > maxcount + 100)
1741
1813
  end
1742
1814
  end
1743
1815
  eval(ret)
@@ -1918,7 +1990,7 @@ class Decimal < Numeric
1918
1990
  end
1919
1991
  ret.to_Dec
1920
1992
  end
1921
- def minus(a) #forces Decimal class subtraction NOT working
1993
+ def minus(a)
1922
1994
  ret = nil
1923
1995
  pat = nil
1924
1996
  if a.kind_of?(Decimal)
@@ -2042,7 +2114,7 @@ class Decimal < Numeric
2042
2114
  ) or (self.decimalfraction == other.decimalfraction_1
2043
2115
  )
2044
2116
  )
2045
- elsif other.kind_of?(Float) or other.kind_of?(Quotient) or other.kind_of?(Fraction) # =8= cr
2117
+ elsif other.kind_of?(Float) or other.kind_of?(Quotient) or other.kind_of?(Fraction)
2046
2118
  self == other.to_Dec
2047
2119
  else
2048
2120
  other.to_i == self.to_i
@@ -2079,12 +2151,9 @@ class Decimal < Numeric
2079
2151
  def d2Frac
2080
2152
  t0 = Quotient(0,1)
2081
2153
  s = @decimalfraction.to_s.length > 0 ? @decimalfraction.to_s.length - 1 : 0
2082
- #p "decimal fraction part"
2083
2154
  s == 0 ? t0 = Quotient(@decimalfraction.nil? ? 0 : @decimalfraction,("1" + ("0"*@decimalExponent)).to_i) : t0 = Quotient(@decimalfraction.nil? ? 0 : @decimalfraction,("1" +("0"* (@decimalfraction.to_s.length)) + ("0"*@decimalExponent)).to_i)
2084
- #p "repetend part"
2085
2155
  t1 = Quotient(Zahlen(@repetend.call.to_i),Zahlen((("9"*@repetend.call.length)+("0"* s)+("0"*@decimalExponent)).to_i))
2086
2156
  Fraction(Zahlen(@integraldecimal),(t0 + Fraction(Zahlen(0),t1)),@absolute)
2087
- #Fraction(Zahlen(@integraldecimal),(t0 + Quotient(Zahlen(0),t1)),@absolute)
2088
2157
  end
2089
2158
  def to_Frac
2090
2159
  @to_Frac ||= d2Frac
@@ -2398,9 +2467,8 @@ class Kettenbruch<Numeric
2398
2467
  p "raise error" unless a.kind_of?(Array)
2399
2468
  init=true
2400
2469
  b = a.pop(2) if y
2401
- # y=="" ? tmp1 = "Fraction(Zahlen(#{b.at(0)}),Quotient(Zahlen(1),#{b.at(1)}))" : tmp1 = "Fraction(Zahlen(\#{y.integer.to_s}),Quotient(Zahlen(#{\y.properfracti#on.numerator.to_s}),Zahlen(#{y.properfraction.denominator.to_s})))"
2402
2470
  y ? tmp1 = "Fraction(Zahlen(#{b.at(0)}),Quotient(Zahlen(1),#{b.at(1)}))" : tmp1 = "&&&&"
2403
- tmp0 = ""
2471
+ tmp0 = ""
2404
2472
  a.reverse.each{|x|
2405
2473
  break if x.nil?
2406
2474
  tmp0 = "Fraction(Zahlen(#{x}),Quotient(Zahlen(1),(#{tmp1})))"
@@ -2413,7 +2481,6 @@ tmp0 = ""
2413
2481
  p "raise error" unless a.kind_of?(Array)
2414
2482
  init=true
2415
2483
  b = a.pop if y == ''
2416
- # y=='' ? tmp1 = "Fraction(Zahlen(#{b.at(0)}),Quotient(Zahlen(0),Zahlen(#{b.at(1)})))" : tmp1 = "Fraction(Zahlen(#{y.integer.to_s}),Quotient(Zahlen(#{y.properfraction.numerator.to_s}),Zahlen(#{y.properfraction.denominator.to_s})))"
2417
2484
  y ? tmp1 = "Fraction(Zahlen(#{b.at(0)}),Quotient(#{b.at(1)},#{b.at(2)}))" : tmp1 = "&&&&"
2418
2485
  tmp0 = ""
2419
2486
  a.reverse.each{|x|
@@ -2463,9 +2530,7 @@ tmp0 = ""
2463
2530
  c = cfra
2464
2531
  until tmp == 0
2465
2532
  b = Kettenbruch::euclid(c)
2466
- # p "#{c.denominator} = #{b.at(0)}.#{c.numerator} + #{b.at(1)}" #=8=
2467
2533
  @fractionalK << b.at(0)
2468
- #if @fractionalK.length.is_even? then @fractionalK_ << b.at(0) remove last add last - 1 then + [1]
2469
2534
  tmp = b.at(1)
2470
2535
  c = Quotient(tmp,c.numerator)
2471
2536
  end
@@ -2476,7 +2541,6 @@ tmp0 = ""
2476
2541
  attr_accessor :integralK, :fractionalK, :continuedFraction, :patt_succ, :absolute, :canonical, :longfracK, :leicht
2477
2542
  private_class_method :new
2478
2543
  def partition(size=9,length=100)
2479
- # stop if ref
2480
2544
  e = ""
2481
2545
  e = "-" if @absolute == -1
2482
2546
  rep = @repetend
@@ -2497,14 +2561,12 @@ tmp0 = ""
2497
2561
  res.gsub!("[, ","[").gsub(",]","]").gsub(",[]","]")
2498
2562
  t = eval(res + "]")
2499
2563
  t.delete_at(t.length - 1)
2500
- p zz = t.delete_at(t.length - 1)
2564
+ zz = t.delete_at(t.length - 1)
2501
2565
  zz = Kettenbruch::leichtfactory(zz)
2502
2566
  t.map!{|x|
2503
2567
  Kettenbruch::leichtfactory(x,false)
2504
- # leicht? ? ret = Kettenbruch::leichtfactory(n) : ret = Kettenbruch::factory(n)
2505
-
2506
2568
  }
2507
- t << zz
2569
+ t << zz
2508
2570
  end
2509
2571
  def convergents
2510
2572
  ret = []
@@ -2663,21 +2725,14 @@ t << zz
2663
2725
  end
2664
2726
  tmp = 0
2665
2727
  self.to_pix(a0,b0,c0,d0,e0,f0,g0,h0)
2666
- p "init"
2667
2728
  while tmp <19 #true # size of k_res is less than epsilon
2668
2729
  eggs = true
2669
2730
  if e0 == 0 or f0 == 0 or g0 == 0 or h0 == 0 then
2670
2731
  eggs = false if f0 == 0
2671
2732
  else # all are positive
2672
- p "positive"
2673
- #p a0.div(e0).at(0)
2674
2733
  eggs = false if a0.divmod(e0).at(0) == c0.divmod(g0).at(0)
2675
2734
  end
2676
- #p (f > 0 and e > 0 and g > 0 )? (b/f-a/e).abs : f,e,g
2677
- #p (f > 0 and e > 0 and g > 0 ) ? (c/g-a/e).abs : f,e,g
2678
- p "### #{eggs}"
2679
- if eggs then
2680
- p "to the right"
2735
+ if eggs then # "to the right"
2681
2736
  x = sa.shift
2682
2737
  a1 = (a0*x)+c0
2683
2738
  b1 = (b0*x)+d0
@@ -2688,8 +2743,7 @@ t << zz
2688
2743
  g1 = e0
2689
2744
  h1 = f0
2690
2745
  self.to_pix(a1,b1,c1,d1,e1,f1,g1,h1)
2691
- else
2692
- p "downwards"
2746
+ else # "downwards"
2693
2747
  y = oa.shift
2694
2748
  a1 = (a0*y)+b0
2695
2749
  b1 = a0
@@ -2707,7 +2761,6 @@ t << zz
2707
2761
  test = eucint == b0.divmod(f0).at(0) and eucint == c0.divmod(g0).at(0) and eucint == d0.divmod(h0).at(0) and eucint > 0
2708
2762
  end
2709
2763
  if test then
2710
- p "here"
2711
2764
  res_a << eucint
2712
2765
  a0 = e1
2713
2766
  b0 = f1
@@ -2868,7 +2921,613 @@ t << zz
2868
2921
  end
2869
2922
  end
2870
2923
  end
2871
- class Real < Numeric
2924
+ class Real< Numeric
2925
+ include SGML
2926
+ @@threebareqs = "\u2261"
2927
+ def to_sgml
2928
+ "<mn #{sgml_id}class='Real'>#{@a}</mn>"
2929
+ end
2930
+ def Real.defines
2931
+ @@threebareqs.encode('utf-8')
2932
+ end
2933
+ def Real.new!(num,a,b)
2934
+ if a.kind_of?(Real)
2935
+ a
2936
+ elsif a.kind_of?(Array)
2937
+ z = eval(gcontinuedFractionFactory(a))
2938
+ new(z.to_Q,b)
2939
+ elsif a.kind_of?(Quotient)
2940
+ new(a,b)
2941
+ 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)
2942
+ elsif
2943
+ new(a.to_Q,b)
2944
+ elsif a.kind_of?(NaughtClass) or a.kind_of?(EmptySetClass) or a.kind_of?(NilClass)
2945
+ a unless b
2946
+ new(Quotinet(0,1),b) if b
2947
+ elsif a.kind_of?(NANClass) or a.kind_of?(InfinityClass)
2948
+ a
2949
+ end
2950
+ end
2951
+ def Real::epsilon(e)
2952
+ #on epsilon change flag for dirty and recalculate
2953
+ end
2954
+ private_class_method :new
2955
+ def initialize(lbl,definitn,irrat)
2956
+ @label = lbl
2957
+ @equality_by_definition_symbols = ["==",Real.defines]
2958
+ @definitn = definitn
2959
+ @rat = definitn
2960
+ @irrat = irrat
2961
+ @k = 5
2962
+ @k0 = 0
2963
+ @update_eval = proc{ ret = Quotient(0,1) ; (@k0..@k).to_a.each{|n| ret += @irrat.call(n)}; ret}
2964
+ @continuedfraction
2965
+ end
2966
+ def updateApprox(&block)
2967
+ instance_exec(&block)
2968
+ end
2969
+ def updateApprox1
2970
+ @rat += @update_eval.call
2971
+ # instance_eval(@update_eval.call)
2972
+ end
2973
+ private :initialize
2974
+ attr_accessor :update_eval, :continuedFraction
2975
+ private_class_method :new
2976
+ @@epsilon = Quotient(1,100000000000)
2977
+ @@upsilon = "a very large number ceiling to signal change to scientific format"
2978
+ def Real::continuedFractionFactory(a)
2979
+ init=true
2980
+ b = a.pop(2)
2981
+ tmp1 = "Fraction(Zahlen(#{b.at(0)}),Quotient(Zahlen(1),#{b.at(1)}))"
2982
+ tmp0 = ""
2983
+ a.reverse.each{|x|
2984
+ break if x.nil?
2985
+ tmp0 = "Fraction(Zahlen(#{x}),Quotient(Zahlen(1),(#{tmp1})))"
2986
+ tmp1 = tmp0
2987
+ tmp0 = ""
2988
+ }
2989
+ tmp1
2990
+ end
2991
+ def Real::gcontinuedFractionFactory(a,y=true)
2992
+ Kettenbruch::allseitigfactory(a,y)
2993
+ end
2994
+ def to_Ball
2995
+ rad = @@epsilon / Quotient(2,1)
2996
+ "(#{@rat - rad} .. #{@rat + rad})"
2997
+ end
2998
+ def to_Ball!
2999
+ rad = @@epsilon / Quotient(2,1)
3000
+ tmp = @rat - rad
3001
+ tmp.setdelta
3002
+ (tmp..(@rat + rad))
3003
+ end
3004
+ def to_a
3005
+ to_Ball!.to_a
3006
+ end
3007
+ def to_Frac
3008
+ @rat.to_Frac
3009
+ end
3010
+ def to_Dec
3011
+ @rat.to_Dec
3012
+ end
3013
+ def to_Q
3014
+ @rat.to_Q
3015
+ end
3016
+ def to_Z
3017
+ @rat.to_Z
3018
+ end
3019
+ def to_N0
3020
+ @rat.to_N0
3021
+ end
3022
+ def to_N
3023
+ @rat.to_N
3024
+ end
3025
+ def to_s
3026
+ "#{@label} #{Real.defines} #{@definitn}"
3027
+ end
3028
+ end
3029
+ class Symbolic_Term#<ST
3030
+ @@powersym = '\*\*'
3031
+ def initialize(a,b='',c='t') #a = PI,b = "32PI**4+31PI**3 + 30PI + Natural(29)
3032
+ @exponents ={}
3033
+ exponents_add(0,1)
3034
+ #p @exponents
3035
+ @symbolic_label = a
3036
+ @orig_statment = b
3037
+ @symbolic_expressions = []
3038
+ if b.kind_of?(String)
3039
+ b == '' ? add_exponent_accessor(1) : parse(b)
3040
+ else
3041
+ end
3042
+ end
3043
+ attr_accessor :symbolic_label
3044
+ # private_class_method :new
3045
+ def parse(b)
3046
+ reg0 = /([^\+]+)/
3047
+ reg1 = /(-?[0-9\(\)]+)(\/?[0-9]*)([a-zA-Z\(\)0-9]+)\*\*(-?[0-9\(\)]+)(\/?[0-9]*)/
3048
+ # md = b.match(reg0)
3049
+ md = ""
3050
+ frstrmneg = false
3051
+ frstrmneg = true if b.match(/^-/)
3052
+ if frstrmneg then
3053
+ b.gsub!(/^-/,'')
3054
+ b.gsub!('-','+-')
3055
+ md = b.split('+')
3056
+ md[0] = '-' + md[0]
3057
+ else
3058
+ b.gsub!('-','+-')
3059
+ md = b.split('+')
3060
+ end
3061
+ md.each{|re|
3062
+ ans = re.match(reg1)
3063
+ if ans
3064
+ #p ans[1],ans[2],ans[3],ans[4],ans[5]
3065
+ # exponents_add(instance_eval(ans[3]),instance_eval(ans[1]))
3066
+ if ans[2]=='' and ans[5]=='' then
3067
+ exponents_add(instance_eval(ans[4]),instance_eval(ans[1]))
3068
+ elsif ans[5]==''
3069
+ exponents_add(instance_eval(ans[4]),instance_eval("Quotient(#{ans[1]},#{ans[2].gsub('/','')})"))
3070
+ elsif ans[2]==''
3071
+ exponents_add(instance_eval("Quotient(#{ans[4]},#{ans[5].gsub('/','')})"),instance_eval("Quotient(#{ans[1]},#{ans[2].gsub('/','')})"))
3072
+ else
3073
+ exponents_add(instance_eval("Quotient(#{ans[4]},#{ans[5].gsub('/','')})"),instance_eval("Quotient(#{ans[1]},#{ans[2].gsub('/','')})"))
3074
+ end
3075
+ else
3076
+ ans1 = re.match(/#{@symbolic_label}/)
3077
+ if ans1 then
3078
+ #p "#{@symbolic_label}#{@@powersym.gsub('\\','')}1"
3079
+ re.gsub!(@symbolic_label,'')
3080
+ # exponents_add('1',instance_eval(re.strip!))
3081
+ exponents_add('1',re.strip!)
3082
+ else
3083
+ #p "constant?"
3084
+ re.strip!
3085
+ re.gsub!('-','Zahlen(-1)*')
3086
+ exponents_add('0',instance_eval(re))
3087
+ end
3088
+ end
3089
+ }
3090
+ end
3091
+ def exponent_list
3092
+ tmp = []
3093
+ @exponents.sort.map{|a,b| tmp << a}
3094
+ tmp
3095
+ end
3096
+ def exponents_add(a,b)
3097
+ a = a.to_s
3098
+ a.gsub!('/','_') if a.match('/')
3099
+ add_exponent_accessor(a) unless @exponents.has_key?(a)
3100
+ @exponents[a] = b
3101
+ end
3102
+ def add_exponent_accessor(a)
3103
+ if exponent_list.include?(a)then
3104
+ else
3105
+ z = " @exponent_#{a} = 1
3106
+ def exp_#{a}
3107
+ @exponents[\"#{a}\"]
3108
+ end
3109
+ def coef_at_#{a}
3110
+ @exponents[\"#{a}\"]
3111
+ end
3112
+ "
3113
+ instance_eval(z)
3114
+ @exponents[a.to_s] = '1'
3115
+ end
3116
+ end
3117
+ def +(o)
3118
+ tmp = Symbolic_Term.new(@symbolic_label)
3119
+ if o.kind_of?(Symbolic_Term) then
3120
+ exp_list = (exponent_list + o.exponent_list).uniq
3121
+ if @symbolic_label == o.symbolic_label then
3122
+ exp_list.each{|a|
3123
+ if respond_to?("coef_at_#{a}") then
3124
+ if o.respond_to?("coef_at_#{a}") then
3125
+ tmp.exponents_add(a,send("coef_at_#{a}") + o.send("coef_at_#{a}"))
3126
+ else
3127
+ tmp.exponents_add(a,send("coef_at_#{a}"))
3128
+ end
3129
+ else
3130
+ tmp.exponents_add(a,o.send("coef_at_#{a}")) if o.respond_to?("coef_at_#{a}")
3131
+ end
3132
+ }
3133
+ tmp
3134
+ else
3135
+ end
3136
+ elsif o.kind_of?(Quotient) or o.kind_of?(Zahlen) or o.kind_of?(Counting) or o.kind_of?(Natural)
3137
+ exponent_list.each{|a|
3138
+ a == '0' ? tmp.exponents_add(a,(o + coef_at_0 )) : tmp.exponents_add(a,send("coef_at_#{a}"))
3139
+
3140
+ }
3141
+ end
3142
+ tmp
3143
+ end
3144
+ def *(o)
3145
+ tmp = Symbolic_Term.new(@symbolic_label)
3146
+ if o.kind_of?(Quotient) or o.kind_of?(Zahlen) or o.kind_of?(Counting) or o.kind_of?(Natural)
3147
+ exponent_list.each{|a|
3148
+ tmp.exponents_add(a,(o.to_Q * send("coef_at_#{a}")))
3149
+ }
3150
+ elsif o.kind_of?(Symbolic_Term)
3151
+ if @symbolic_label == o.symbolic_label then
3152
+ exponent_list.each{|a|
3153
+ o.exponent_list.each{|b|
3154
+ tmp.exponents_add((a+b),( send("coef_at_#{a}") * o.send("coef_at_#{b}")))
3155
+ }
3156
+ }
3157
+ else
3158
+ empty_set
3159
+ #normally would return a SymbolicExpression, but should be ordered first
3160
+ end
3161
+ end
3162
+ tmp
3163
+ end
3164
+ def -(o)
3165
+ tmp = Symbolic_Term.new(@symbolic_label)
3166
+ if o.kind_of?(Symbolic_Term) then
3167
+ exp_list = (exponent_list + o.exponent_list).uniq
3168
+ if @symbolic_label == o.symbolic_label then
3169
+ exp_list.each{|a|
3170
+ if respond_to?("coef_at_#{a}") then
3171
+ if o.respond_to?("coef_at_#{a}") then
3172
+ tmp.exponents_add(a,send("coef_at_#{a}") - o.send("coef_at_#{a}"))
3173
+ else
3174
+ tmp.exponents_add(a,send("coef_at_#{a}"))
3175
+ end
3176
+ else
3177
+ tmp.exponents_add(a,(-1 * o.send("coef_at_#{a}"))) if o.respond_to?("coef_at_#{a}")
3178
+ end
3179
+ }
3180
+ tmp
3181
+ else
3182
+ end
3183
+ elsif o.kind_of?(Quotient) or o.kind_of?(Zahlen) or o.kind_of?(Counting) or o.kind_of?(Natural)
3184
+ exponent_list.each{|a|
3185
+ a == '0' ? tmp.exponents_add(a,(coef_at_0 - o )) : tmp.exponents_add(a,send("coef_at_#{a}"))
3186
+
3187
+ }
3188
+ end
3189
+ tmp
3190
+ end
3191
+ def /(o)
3192
+ if o.kind_of?(Quotient) or o.kind_of?(Zahlen) or o.kind_of?(Counting) or o.kind_of?(Natural)
3193
+ exponent_list.each{|a|
3194
+ tmp.exponents_add(a,(send("coef_at_#{a}")/o.to_Q))
3195
+ }
3196
+ end
3197
+ tmp
3198
+ end
3199
+ def to_statement
3200
+ tmp = ''
3201
+ first = true
3202
+ exponent_list.reverse.each{|a|
3203
+ a0 = instance_eval("coef_at_#{a}")
3204
+ a0 = instance_eval(a0) if a0.kind_of?(String)
3205
+ if a0<0 then
3206
+ first ? tmp += "-" : tmp += " - "
3207
+ if a == '0' or a=='1' then
3208
+ a=='1' ? tmp += (Zahlen(-1)*a0).to_s + @symbolic_label.to_s : tmp += (Zahlen(-1)*a0).to_s
3209
+ else
3210
+ tmp += (Zahlen(-1)*a0).to_s + @symbolic_label.to_s + @@powersym.to_s.gsub('\\','') + a.to_s
3211
+ end
3212
+ else
3213
+ tmp += " + " unless first
3214
+ if a == '0' or a=='1' then
3215
+ a=='1' ? tmp += a0.to_s + @symbolic_label.to_s : tmp += a0.to_s
3216
+ else
3217
+ tmp += a0.to_s + @symbolic_label.to_s + @@powersym.to_s.gsub('\\','') + a.to_s
3218
+ end
3219
+ end
3220
+ first = false
3221
+ }
3222
+ tmp
3223
+ end
3224
+ def coerce(o)
3225
+ [self, o]
3226
+ end
3227
+ def to_s
3228
+ # @orig_statment == '' ? to_statement : @orig_statment
3229
+ to_statement
3230
+ end
3231
+ def inspect
3232
+ "Symbolic_Term(#{@symbolic_label}#{@orig_statment})"
3233
+ end
3234
+ end
3235
+ class Symbolic_Prod
3236
+ @@powersym = '\*\*'
3237
+ def initialize(a,b='',c='t') #a = ['e','PI'],b = "32e**2PI**4+31e**5PI**3 + 30PI + Natural(29)
3238
+ @exponents ={}
3239
+ @symbolic_labels = a
3240
+ @orig_statement = b
3241
+ parse(b)
3242
+ if b.kind_of?(String)
3243
+ b == '' ? add_exponent_accessor(1) : parse(b)
3244
+ else
3245
+ end
3246
+ end
3247
+ attr_accessor :symbolic_labels, :orig_statement
3248
+ attr_accessor :exponents # mk private
3249
+ # private_class_method :new
3250
+ def arity
3251
+ @symbolic_labels.size
3252
+ end
3253
+ def parse(b)
3254
+ #scan + #32(e**2PI**4)+1(e**5.PI**3)+ 30PI
3255
+ reg0 = /(-?[0-9]+)\(([^\)]*)\)/ #32(e**2PI**4) => m[1] = 3 m[2]= (e**2PI**4)
3256
+ reg1 = /([a-zA-Z]+)\*\*([0-9]+)/
3257
+ md = ""
3258
+ frstrmneg = false
3259
+ frstrmneg = true if b.match(/^-/)
3260
+ if frstrmneg then
3261
+ b.gsub!(/^-/,'')
3262
+ b.gsub!('-','+-')
3263
+ md = b.split('+')
3264
+ md[0] = '-' + md[0]
3265
+ else
3266
+ b.gsub!('-','+-')
3267
+ md = b.split('+')
3268
+ end
3269
+ coeffc = ""
3270
+ labels = []
3271
+ expnts = []
3272
+ lbsort = []
3273
+ md.each{|re|
3274
+ re.strip!
3275
+ ans1 = re.split('.')
3276
+ if ans1.size < @symbolic_labels.size + 1 then # we have missing labels .. so all exponents are 0
3277
+ ansdup = ans1.dup
3278
+ missing_lbls = @symbolic_labels.dup
3279
+ poss_coeff = ansdup.shift
3280
+ if poss_coeff.match(reg1) then # then is not a number..ie no coeff.. ie implied coeff == one
3281
+ ans1.unshift("Natural(1)")
3282
+ ansdup.unshift(poss_coeff) # put back the label!
3283
+ elsif poss_coeff.match(/[0-9]/) # could be other numbers!
3284
+ ansdup.map!{|item| item.to_s + "**1"}
3285
+ ansdup.unshift(poss_coeff) # put back the label!
3286
+ ans1 = ansdup.dup
3287
+ ansdup.shift
3288
+ else
3289
+ poss_coeff += "**1" if poss_coeff.match(/\*\*/).nil? # no power
3290
+ end
3291
+
3292
+ ansdup.each{|t|
3293
+ tst2 = t.match(reg1)
3294
+ missing_lbls.delete(tst2[1]) if @symbolic_labels.include?(tst2[1])
3295
+ }
3296
+ missing_lbls.map!{|item| item.to_s + "**0"}
3297
+ ans1 += missing_lbls
3298
+ end
3299
+ ans1.each{|re1| # each labl
3300
+ re2 = re1.match(reg1)
3301
+ if re1.match(reg1)
3302
+ labels << re2[1]
3303
+ lbsort << re2[1]
3304
+ expnts << re2[2]
3305
+ else # "coeffiecient"
3306
+ coeffc = re1
3307
+ end
3308
+ }
3309
+ if labels.empty? and lbsort.empty? and expnts.empty? # "constant"
3310
+ labels = @symbolic_labels if labels.size == 0
3311
+ lbsort = @symbolic_labels if lbsort.size == 0
3312
+ expnts = Array.new(labels.size,'0') if expnts.size ==0
3313
+
3314
+ else # "coeff"
3315
+ end
3316
+ tmp = ""
3317
+ tmp0 = ""
3318
+ lbsort.sort!
3319
+ first = true
3320
+ lbsort.each_index{|i|
3321
+ first ? tmp += "#{labels.at(labels.index(lbsort.at(i)))}_#{expnts.at(labels.index(lbsort.at(i)))}" : tmp += ".#{labels.at(labels.index(lbsort.at(i)))}_#{expnts.at(labels.index(lbsort.at(i)))}"
3322
+ first ? tmp0 += "#{expnts.at(labels.index(lbsort.at(i)))}" : tmp0 += "_#{expnts.at(labels.index(lbsort.at(i)))}"
3323
+ first = false
3324
+ }
3325
+ labels = []
3326
+ expnts = []
3327
+ lbsort = []
3328
+ add_exponent_accessor(tmp0) unless @exponents.has_key?(tmp0)
3329
+ ncoef = instance_eval(coeffc)
3330
+ ncoef.kind_of?(Numeric) ? @exponents[tmp0] = ncoef.to_Q : @exponents[tmp0] = coeffc
3331
+ }
3332
+ end
3333
+ def exponent_full_sorted_list
3334
+ test = {}
3335
+ st1 = ""
3336
+ st2 = ""
3337
+ str2 = false
3338
+ exponent_sorted_list.each{|a|
3339
+ tmp = a.split('_')
3340
+ first = true
3341
+ symbolic_labels.each_index{|i|
3342
+ if tmp.at(i) == '0' then
3343
+ str2 = true
3344
+ first ? st2 += "1" : st2 += ".1"
3345
+ elsif tmp.at(i) == '1' then
3346
+ str2 = true
3347
+ first ? st2 += "#{symbolic_labels.at(i)}" : st2 += ".#{symbolic_labels.at(i)}"
3348
+ end
3349
+ first ? st1 += "#{symbolic_labels.at(i)}**#{tmp.at(i)}" : st1 += ".#{symbolic_labels.at(i)}**#{tmp.at(i)}"
3350
+ first = false
3351
+ }
3352
+ test[st1] = a
3353
+ test[st2] = a ; str2 = false if str2
3354
+ st1 = ""
3355
+ }
3356
+ test
3357
+ end
3358
+ def exponent_sorted_list #look like a = la1b3_lb2l34_lb3l45, b=coeff , {'la1b3_lb2l34_lb3l45'=>coeff}
3359
+ tmp = []
3360
+ @exponents.sort.map{|a,b| tmp << a}
3361
+ tmp
3362
+ end
3363
+ def exponents_add(a,b)
3364
+ a = a.to_s
3365
+ # b = b.to_s
3366
+ a.gsub!('/','_') if a.match('/')
3367
+ add_exponent_accessor(a) unless @exponents.has_key?(a)
3368
+ # @exponents[a] = b
3369
+ @exponents[a] = b.to_Q
3370
+ end
3371
+ def add_exponent_accessor(a)
3372
+ z = ""
3373
+ unless @exponents.has_key?(a)then
3374
+ z = "
3375
+ def coef_at_#{a}
3376
+ @exponents[\"#{a}\"]
3377
+ end
3378
+ "
3379
+ end
3380
+ instance_eval(z)
3381
+ @exponents[a] = '1'
3382
+ end
3383
+ def coef_methods
3384
+ tmp = []
3385
+ methods.each{|md|
3386
+ tmp << md if md.match(/coef_at_/)
3387
+ }
3388
+ tmp
3389
+ end
3390
+ def +(o)
3391
+ tmp = Symbolic_Prod.new(@symbolic_label)
3392
+ coeffs = public_methods.select{|i| i[/coef_at[_\d+]+$/] }
3393
+ tmp = self.dup
3394
+ str = ""
3395
+ tplt = '_0'
3396
+ first = true
3397
+ arity.times{
3398
+ first ? tplt = '1' : tplt = '_0'
3399
+ str += tplt
3400
+ first = false if first
3401
+ }
3402
+ if o.kind_of?(Symbolic_Prod) then
3403
+ sym_list = (symbolic_labels + o.symbolic_labels).uniq
3404
+ elsif o.kind_of?(Symbolic_Term) then
3405
+ if @symbolic_labels.contain(o.symbolic_label) then
3406
+ else
3407
+ end
3408
+ elsif o.kind_of?(Quotient) or o.kind_of?(Zahlen) or o.kind_of?(Counting) or o.kind_of?(Natural)
3409
+ p o.to_Q
3410
+ str = ""
3411
+ tplt = '_0'
3412
+ first = true
3413
+ arity.times{
3414
+ first ? tplt = '0' : tplt = '_0'
3415
+ str += tplt
3416
+ first = false
3417
+ }
3418
+ @exponents.has_key?(str) ? @exponents[str].to_Q += o.to_Q : tmp.add_exponent_accessor(str) ; @exponents[str] = o.to_Q
3419
+ tmp.orig_statement += " + #{@exponents[str]}"
3420
+ end
3421
+ tmp
3422
+ end
3423
+ def *(o)
3424
+
3425
+ end
3426
+ def -(o)
3427
+
3428
+ end
3429
+ def /(o)
3430
+
3431
+ end
3432
+ def to_statement
3433
+ tmp = ''
3434
+ first = true
3435
+ exponent_sorted_list.reverse.each{|a|
3436
+ a0 = instance_eval("coef_at_#{a}")
3437
+ a0 = instance_eval(a0) if a0.kind_of?(String)
3438
+ if a0<0 then
3439
+ first ? tmp += "-" : tmp += " - "
3440
+ if a == '0' or a=='1' then
3441
+ a=='1' ? tmp += (Quotient(-1,1)*a0).to_s + @symbolic_label.to_s : tmp += (Quotient(-1,1)*a0).to_s
3442
+ else
3443
+ tmp += (Quotient(-1,1)*a0).to_s + @symbolic_label.to_s + @@powersym.to_s.gsub('\\','') + a.to_s
3444
+ end
3445
+ else
3446
+ tmp += " + " unless first
3447
+ if a == '0' or a=='1' then
3448
+ a=='1' ? tmp += a0.to_s + @symbolic_label.to_s : tmp += a0.to_s
3449
+ else
3450
+ tmp += a0.to_s + @symbolic_label.to_s + @@powersym.to_s.gsub('\\','') + a.to_s
3451
+ end
3452
+ end
3453
+ first = false
3454
+ }
3455
+ tmp
3456
+ end
3457
+ def to_full_statement
3458
+ tmp = ''
3459
+ first = true
3460
+ exponent_sorted_list.reverse.each{|a|
3461
+ a0 = instance_eval("coef_at_#{a}")
3462
+ a0 = instance_eval(a0) if a0.kind_of?(String)
3463
+ if a0<0 then
3464
+ first ? tmp += "-" : tmp += " - "
3465
+ if a == '0' or a=='1' then
3466
+ a=='1' ? tmp += (Quotient(-1,1)*a0).to_s + @symbolic_label.to_s : tmp += (Quotient(-1,1)*a0).to_s
3467
+ else
3468
+ tmp += (Quotient(-1,1)*a0).to_s + @symbolic_label.to_s + @@powersym.to_s.gsub('\\','') + a.to_s
3469
+ end
3470
+ else
3471
+ tmp += " + " unless first
3472
+ if a == '0' or a=='1' then
3473
+ a=='1' ? tmp += a0.to_s + @symbolic_label.to_s : tmp += a0.to_s
3474
+ else
3475
+ tmp += a0.to_s + @symbolic_label.to_s + @@powersym.to_s.gsub('\\','') + a.to_s
3476
+ end
3477
+ end
3478
+ first = false
3479
+ }
3480
+ tmp
3481
+ end
3482
+ def coerce(o)
3483
+ [self, o]
3484
+ end
3485
+ def to_s
3486
+ to_full_statement
3487
+ end
3488
+ # def inspect
3489
+ # "Symbolic_Prod(#{@symbolic_labels},#{@orig_statment})"
3490
+ # end
3491
+ def cannonical_term_sorted_list
3492
+ cannonical_terms = {}
3493
+ complete_terms = {}
3494
+ st1 = ""
3495
+ st2 = ""
3496
+ st3 = ""
3497
+ str2 = false
3498
+ exponent_sorted_list.each{|a|
3499
+ tmp = a.split('_')
3500
+ first = true
3501
+ symbolic_labels.each_index{|i|
3502
+ if tmp.at(i) == '0' then
3503
+ str2 = true
3504
+ first ? st2 += "1" : st2 += ".1"
3505
+ st3 = "1"
3506
+ elsif tmp.at(i) == '1' then
3507
+ str2 = true
3508
+ first ? st2 += "#{symbolic_labels.at(i)}" : st2 += ".#{symbolic_labels.at(i)}"
3509
+ end
3510
+ (first ? st2 += "#{symbolic_labels.at(i)}**#{tmp.at(i)}" : st1 += ".#{symbolic_labels.at(i)}**#{tmp.at(i)}") unless str2
3511
+ str2 = false
3512
+ first ? st1 += "#{symbolic_labels.at(i)}**#{tmp.at(i)}" : st1 += ".#{symbolic_labels.at(i)}**#{tmp.at(i)}"
3513
+ first = false
3514
+ }
3515
+ cannonical_terms[st1] = a
3516
+ complete_terms[st2.gsub('.1','')] = a
3517
+ st1 = ""
3518
+ st2 = ""
3519
+ st3 = ""
3520
+ }
3521
+ complete_terms.merge!(cannonical_terms)
3522
+ complete_terms
3523
+ end
3524
+ end
3525
+ class Symbolic_statment
3526
+ def initialize
3527
+ @symbolic_product = nil
3528
+ @symbolic_terms = []
3529
+ @constants =[]
3530
+ end
2872
3531
  end
2873
3532
  class Matrix
2874
3533
  include SGML
@@ -3009,7 +3668,7 @@ attr_accessor :msize, :nsize
3009
3668
  end
3010
3669
  return a
3011
3670
  end
3012
- def -(nm)
3671
+ def -(nm)
3013
3672
  a = ""
3014
3673
  if not(nm.is_tr? or @tr) then
3015
3674
  if nm.msize == @msize and nm.nsize == @nsize then
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: M500
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - mark ingram
@@ -10,7 +10,7 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2018-01-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: ''
13
+ description: M500 contains easy to use classes that model modern mathematical concepts
14
14
  email:
15
15
  - m.ingram@computer.org
16
16
  executables: []
@@ -19,7 +19,7 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - lib/M500_containers.rb
21
21
  - lib/m500.rb
22
- homepage:
22
+ homepage: https://sites.google.com/site/m500numbers/
23
23
  licenses:
24
24
  - Ruby
25
25
  metadata: {}