algebra 0.2.1

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.
Files changed (199) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +53 -0
  3. data/.travis.yml +7 -0
  4. data/CODE_OF_CONDUCT.md +49 -0
  5. data/Gemfile +7 -0
  6. data/Gemfile.lock +28 -0
  7. data/LICENSE.txt +21 -0
  8. data/README-ja.txt +60 -0
  9. data/README.md +61 -0
  10. data/Rakefile +43 -0
  11. data/algebra.gemspec +33 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/doc-ja/README-ja.html +69 -0
  15. data/doc-ja/README-ja.rd +60 -0
  16. data/doc-ja/README.html +0 -0
  17. data/doc-ja/README.rd +0 -0
  18. data/doc-ja/algebra-ja.html +66 -0
  19. data/doc-ja/algebra-ja.rd +60 -0
  20. data/doc-ja/algebraic-equation-ja.html +36 -0
  21. data/doc-ja/algebraic-equation-ja.rd +26 -0
  22. data/doc-ja/algebraic-extension-field-ja.html +122 -0
  23. data/doc-ja/algebraic-extension-field-ja.rd +118 -0
  24. data/doc-ja/algebraic-parser-ja.html +87 -0
  25. data/doc-ja/algebraic-parser-ja.rd +95 -0
  26. data/doc-ja/changes.html +161 -0
  27. data/doc-ja/changes.rd +119 -0
  28. data/doc-ja/elementary-divisor-ja.html +56 -0
  29. data/doc-ja/elementary-divisor-ja.rd +45 -0
  30. data/doc-ja/euclidian-ring-ja.html +78 -0
  31. data/doc-ja/euclidian-ring-ja.rd +69 -0
  32. data/doc-ja/finite-group-ja.html +285 -0
  33. data/doc-ja/finite-group-ja.rd +276 -0
  34. data/doc-ja/finite-map-ja.html +224 -0
  35. data/doc-ja/finite-map-ja.rd +227 -0
  36. data/doc-ja/finite-set-ja.html +393 -0
  37. data/doc-ja/finite-set-ja.rd +408 -0
  38. data/doc-ja/index-ja.html +113 -0
  39. data/doc-ja/index-ja.rd +112 -0
  40. data/doc-ja/jordan-form-ja.html +106 -0
  41. data/doc-ja/jordan-form-ja.rd +99 -0
  42. data/doc-ja/localized-ring-ja.html +121 -0
  43. data/doc-ja/localized-ring-ja.rd +131 -0
  44. data/doc-ja/m-polynomial-ja.html +542 -0
  45. data/doc-ja/m-polynomial-ja.rd +596 -0
  46. data/doc-ja/matrix-algebra-ja.html +686 -0
  47. data/doc-ja/matrix-algebra-ja.rd +727 -0
  48. data/doc-ja/matrix-algebra-triplet-ja.html +124 -0
  49. data/doc-ja/matrix-algebra-triplet-ja.rd +129 -0
  50. data/doc-ja/permutation-group-ja.html +159 -0
  51. data/doc-ja/permutation-group-ja.rd +151 -0
  52. data/doc-ja/polynomial-converter-ja.html +64 -0
  53. data/doc-ja/polynomial-converter-ja.rd +54 -0
  54. data/doc-ja/polynomial-ja.html +446 -0
  55. data/doc-ja/polynomial-ja.rd +473 -0
  56. data/doc-ja/residue-class-ring-ja.html +112 -0
  57. data/doc-ja/residue-class-ring-ja.rd +113 -0
  58. data/doc-ja/sample-algebraic-equation01.rb.v.rd +11 -0
  59. data/doc-ja/sample-algebraic-equation02.rb.v.rd +11 -0
  60. data/doc-ja/sample-algebraic-root01.rb.v.rd +20 -0
  61. data/doc-ja/sample-algebraicfield01.rb.v.rd +26 -0
  62. data/doc-ja/sample-algebraicfield02.rb.v.rd +15 -0
  63. data/doc-ja/sample-cayleyhamilton01.rb.v.rd +14 -0
  64. data/doc-ja/sample-diagonalization01.rb.v.rd +48 -0
  65. data/doc-ja/sample-divmod01.rb.v.rd +17 -0
  66. data/doc-ja/sample-elementary-divisor01.rb.v.rd +48 -0
  67. data/doc-ja/sample-factorize01.rb.v.rd +11 -0
  68. data/doc-ja/sample-factorize02.rb.v.rd +13 -0
  69. data/doc-ja/sample-factorize03.rb.v.rd +14 -0
  70. data/doc-ja/sample-factorize04.rb.v.rd +14 -0
  71. data/doc-ja/sample-factorize05.rb.v.rd +53 -0
  72. data/doc-ja/sample-galois-group01.rb.v.rd +27 -0
  73. data/doc-ja/sample-gaussian-elimination01.rb.v.rd +19 -0
  74. data/doc-ja/sample-geometry01.rb.v.rd +33 -0
  75. data/doc-ja/sample-geometry02.rb.v.rd +34 -0
  76. data/doc-ja/sample-geometry03.rb.v.rd +45 -0
  77. data/doc-ja/sample-geometry04.rb.v.rd +33 -0
  78. data/doc-ja/sample-geometry07.rb.v.rd +62 -0
  79. data/doc-ja/sample-groebner01.rb.v.rd +13 -0
  80. data/doc-ja/sample-groebner02.rb.v.rd +18 -0
  81. data/doc-ja/sample-groebner03.rb.v.rd +19 -0
  82. data/doc-ja/sample-group01.rb.v.rd +21 -0
  83. data/doc-ja/sample-jordan-form01.rb.v.rd +56 -0
  84. data/doc-ja/sample-jordanform01.rb.v.rd +55 -0
  85. data/doc-ja/sample-lagrange-multiplier01.rb.v.rd +35 -0
  86. data/doc-ja/sample-m-factorize01.rb.v.rd +15 -0
  87. data/doc-ja/sample-m-factorize02.rb.v.rd +12 -0
  88. data/doc-ja/sample-m-polynomial01.rb.v.rd +10 -0
  89. data/doc-ja/sample-map01.rb.v.rd +9 -0
  90. data/doc-ja/sample-polynomial01.rb.v.rd +9 -0
  91. data/doc-ja/sample-polynomial02.rb.v.rd +11 -0
  92. data/doc-ja/sample-primefield01.rb.v.rd +13 -0
  93. data/doc-ja/sample-quotientfield01.rb.v.rd +11 -0
  94. data/doc-ja/sample-quotientfield02.rb.v.rd +18 -0
  95. data/doc-ja/sample-quotientfield03.rb.v.rd +16 -0
  96. data/doc-ja/sample-quotientfield04.rb.v.rd +16 -0
  97. data/doc-ja/sample-set01.rb.v.rd +18 -0
  98. data/doc-ja/sample-splitting-field01.rb.v.rd +19 -0
  99. data/doc-ja/samples-ja.html +885 -0
  100. data/doc-ja/samples-ja.rd +221 -0
  101. data/doc-ja/style.css +85 -0
  102. data/doc-ja/todo.html +20 -0
  103. data/doc-ja/todo.rd +9 -0
  104. data/lib/algebra.rb +36 -0
  105. data/lib/algebra/algebraic-equation.rb +56 -0
  106. data/lib/algebra/algebraic-extension-field.rb +135 -0
  107. data/lib/algebra/algebraic-parser.rb +160 -0
  108. data/lib/algebra/algebraic-system.rb +224 -0
  109. data/lib/algebra/annihilate.rb +52 -0
  110. data/lib/algebra/array-supplement.rb +53 -0
  111. data/lib/algebra/auto-require.rb +84 -0
  112. data/lib/algebra/chinese-rem-th.rb +135 -0
  113. data/lib/algebra/combinatorial.rb +145 -0
  114. data/lib/algebra/elementary-divisor.rb +193 -0
  115. data/lib/algebra/euclidian-ring.rb +161 -0
  116. data/lib/algebra/factors.rb +305 -0
  117. data/lib/algebra/finite-group.rb +374 -0
  118. data/lib/algebra/finite-map.rb +201 -0
  119. data/lib/algebra/finite-set.rb +456 -0
  120. data/lib/algebra/galois-group.rb +129 -0
  121. data/lib/algebra/gaussian-elimination.rb +385 -0
  122. data/lib/algebra/groebner-basis-coeff.rb +228 -0
  123. data/lib/algebra/groebner-basis.rb +197 -0
  124. data/lib/algebra/import-module-single-thread.rb +86 -0
  125. data/lib/algebra/import-module.rb +491 -0
  126. data/lib/algebra/jordan-form.rb +114 -0
  127. data/lib/algebra/linear-algebra.rb +143 -0
  128. data/lib/algebra/localized-ring.rb +294 -0
  129. data/lib/algebra/m-index.rb +282 -0
  130. data/lib/algebra/m-polynomial-factor-int.rb +186 -0
  131. data/lib/algebra/m-polynomial-factor-zp.rb +114 -0
  132. data/lib/algebra/m-polynomial-factor.rb +315 -0
  133. data/lib/algebra/m-polynomial-gcd.rb +40 -0
  134. data/lib/algebra/m-polynomial.rb +875 -0
  135. data/lib/algebra/matrix-algebra-triplet.rb +292 -0
  136. data/lib/algebra/matrix-algebra.rb +929 -0
  137. data/lib/algebra/numeric-supplement.rb +123 -0
  138. data/lib/algebra/permutation-group.rb +257 -0
  139. data/lib/algebra/polynomial-converter.rb +193 -0
  140. data/lib/algebra/polynomial-factor-alg.rb +148 -0
  141. data/lib/algebra/polynomial-factor-int.rb +252 -0
  142. data/lib/algebra/polynomial-factor-zp.rb +165 -0
  143. data/lib/algebra/polynomial-factor.rb +140 -0
  144. data/lib/algebra/polynomial.rb +592 -0
  145. data/lib/algebra/powers.rb +31 -0
  146. data/lib/algebra/prime-gen.rb +32 -0
  147. data/lib/algebra/rational.rb +81 -0
  148. data/lib/algebra/residue-class-ring.rb +219 -0
  149. data/lib/algebra/sets-system.rb +43 -0
  150. data/lib/algebra/splitting-field.rb +103 -0
  151. data/lib/algebra/version.rb +3 -0
  152. data/sample/Makefile +10 -0
  153. data/sample/do-testscripts.rb +100 -0
  154. data/sample/sample-algebraic-equation01.rb +6 -0
  155. data/sample/sample-algebraic-equation02.rb +6 -0
  156. data/sample/sample-algebraic-root01.rb +15 -0
  157. data/sample/sample-algebraicfield01.rb +21 -0
  158. data/sample/sample-algebraicfield02.rb +10 -0
  159. data/sample/sample-cayleyhamilton01.rb +9 -0
  160. data/sample/sample-diagonalization01.rb +43 -0
  161. data/sample/sample-divmod01.rb +12 -0
  162. data/sample/sample-elementary-divisor01.rb +43 -0
  163. data/sample/sample-factorize01.rb +6 -0
  164. data/sample/sample-factorize02.rb +8 -0
  165. data/sample/sample-factorize03.rb +9 -0
  166. data/sample/sample-factorize04.rb +9 -0
  167. data/sample/sample-factorize05.rb +48 -0
  168. data/sample/sample-galois-group01.rb +22 -0
  169. data/sample/sample-gaussian-elimination01.rb +14 -0
  170. data/sample/sample-geometry01.rb +28 -0
  171. data/sample/sample-geometry02.rb +29 -0
  172. data/sample/sample-geometry03.rb +40 -0
  173. data/sample/sample-geometry04.rb +28 -0
  174. data/sample/sample-geometry07.rb +58 -0
  175. data/sample/sample-groebner01.rb +8 -0
  176. data/sample/sample-groebner02.rb +13 -0
  177. data/sample/sample-groebner03.rb +14 -0
  178. data/sample/sample-group01.rb +16 -0
  179. data/sample/sample-jordan-form01.rb +51 -0
  180. data/sample/sample-lagrange-multiplier01.rb +30 -0
  181. data/sample/sample-m-factorize01.rb +10 -0
  182. data/sample/sample-m-factorize02.rb +7 -0
  183. data/sample/sample-m-polynomial01.rb +5 -0
  184. data/sample/sample-map01.rb +4 -0
  185. data/sample/sample-polynomial01.rb +4 -0
  186. data/sample/sample-polynomial02.rb +6 -0
  187. data/sample/sample-primefield01.rb +8 -0
  188. data/sample/sample-quotientfield01.rb +6 -0
  189. data/sample/sample-quotientfield02.rb +13 -0
  190. data/sample/sample-quotientfield03.rb +11 -0
  191. data/sample/sample-quotientfield04.rb +11 -0
  192. data/sample/sample-set01.rb +13 -0
  193. data/sample/sample-splitting-field01.rb +14 -0
  194. data/sample/test-00-cayley-hamilton.rb +76 -0
  195. data/sample/test-00-groebner-basis.rb +274 -0
  196. data/sample/test-00-polynomial-factor-alg.rb +89 -0
  197. data/sample/test-00.list +4 -0
  198. data/sample/time-trial.rb +65 -0
  199. metadata +373 -0
@@ -0,0 +1,228 @@
1
+ # Groebner basis module (with coeffitients)
2
+ #
3
+ # by Shin-ichiro Hara
4
+ #
5
+ # Version 1.2 (2001.04.03)
6
+
7
+ module Algebra
8
+ module Groebner
9
+ def S_pair_coeff(other)
10
+ x = lm.lcm(other.lm)
11
+ a = x / lt
12
+ b = x / other.lt
13
+ y = a * rt - b * other.rt
14
+ [y, a, -b]
15
+ end
16
+
17
+ def self.basis_coeff_132D(g)
18
+ gbasis = g.dup
19
+ n0 = g.size
20
+ # coeff = (0...n0).collect{|k| [0]*k+[1]+[0]*(n0-k-1)}
21
+ zero = f.first.zero
22
+ unity = f.first.unity
23
+ coeff = (0...n0).collect { |k| [zero] * k + [unity] + [zero] * (n0 - k - 1) }
24
+ pairs = []
25
+ g.each_pair_with_index do |x, y, i, j|
26
+ pairs.push [x, y, i, j]
27
+ end
28
+ while pair = pairs.shift
29
+ x, y, i, j = pair
30
+ t, a, b = x.S_pair_coeff(y)
31
+ q, s = t.divmod(*gbasis)
32
+ next if s.zero?
33
+ n1 = gbasis.size
34
+ gbasis.each_with_index { |z, k| pairs.push([z, s, k, n1]) }
35
+ u = (0...n0).collect do |k|
36
+ sum = 0
37
+ (0...gbasis.size).each do |m|
38
+ sum += (m == i ? a - q[m] : (m == j ? b - q[m] : -q[m])) * coeff[m][k]
39
+ end
40
+ sum
41
+ end
42
+ coeff.push u
43
+ gbasis.push s
44
+ end
45
+ [coeff, gbasis]
46
+ end
47
+
48
+ def self.basis_coeff_159A(f)
49
+ n0 = f.size
50
+ glm = f.collect(&:lm)
51
+ # fc = (0...n0).collect{|k| [0]*k+[1]+[0]*(n0-k-1)}
52
+ zero = f.first.zero
53
+ unity = f.first.unity
54
+ fc = (0...n0).collect { |k| [zero] * k + [unity] + [zero] * (n0 - k - 1) }
55
+
56
+ indexes = (0...n0).sort { |i, j| glm[i] <=> glm[j] }
57
+ glm = glm.values_at(*indexes)
58
+ gbasis = f.values_at(*indexes)
59
+ coeff = fc.values_at(*indexes)
60
+
61
+ pairs = []
62
+ (0...n0).to_a.each_pair do |i, j|
63
+ pairs.push [i, j]
64
+ end
65
+
66
+ until pairs.empty?
67
+ i, j = pairs.first
68
+ if !glm[i].prime_to?(glm[j]) && !_ct(glm, pairs, i, j)
69
+ t, a, b = gbasis[i].S_pair_coeff(gbasis[j])
70
+ q, s = t.divmod(*gbasis)
71
+ unless s.zero?
72
+ 0.upto glm.size - 1 do |k|
73
+ pairs.push [k, glm.size]
74
+ end
75
+ u = (0...n0).collect do |k|
76
+ sum = 0
77
+ (0...gbasis.size).each do |m|
78
+ sum += (m == i ? a - q[m] : (m == j ? b - q[m] : -q[m])) * coeff[m][k]
79
+ end
80
+ sum
81
+ end
82
+ coeff.push u
83
+ gbasis.push s
84
+ glm.push s.lm
85
+ end
86
+ end
87
+ pairs.shift
88
+ end
89
+
90
+ [coeff, gbasis]
91
+ end
92
+
93
+ def self.minimal_basis_coeff(coeff, gbasis)
94
+ glm = gbasis.collect(&:lm)
95
+ indexes = (0...gbasis.size).sort { |i, j| glm[j] <=> glm[i] }
96
+ indexes.each_with_index do |i, s|
97
+ (s + 1).upto indexes.size - 1 do |k|
98
+ j = indexes[k]
99
+ if glm[j].divide? glm[i]
100
+ indexes[s] = nil
101
+ break
102
+ end
103
+ end
104
+ end
105
+ indexes.compact!
106
+ b = gbasis.values_at(*indexes)
107
+ c = coeff.values_at(*indexes)
108
+ [c, b]
109
+ end
110
+
111
+ def self.reduced_basis_coeff(coeff, gbasis)
112
+ gbasis.each_with_index do |x, i|
113
+ (g = gbasis.dup).delete_at(i)
114
+ q, gbasis[i] = x.divmod(*g)
115
+ coeff[i] = (0...coeff[i].size).collect do |k|
116
+ sum = 0
117
+ (0...gbasis.size).each do |m|
118
+ d = (m < i ? -q[m] : m == i ? 1 : -q[m - 1])
119
+ sum += d * coeff[m][k]
120
+ end
121
+ sum
122
+ end
123
+ end
124
+ gbasis.each_with_index do |x, i|
125
+ c = x.lc
126
+ coeff[i].collect! { |v| v / c }
127
+ gbasis[i] = x / c
128
+ end
129
+ [coeff, gbasis]
130
+ end
131
+
132
+ def self.basis_coeff(g)
133
+ # coeff, gbasis = basis_coeff_132D(g)
134
+ coeff, gbasis = basis_coeff_159A(g)
135
+ coeff, gbasis = minimal_basis_coeff(coeff, gbasis)
136
+ coeff, gbasis = reduced_basis_coeff(coeff, gbasis)
137
+ ind = (0...gbasis.size).to_a
138
+ ind.sort! { |i, j| gbasis[j] <=> gbasis[i] }
139
+ [coeff.values_at(*ind), gbasis.values_at(*ind)]
140
+ end
141
+
142
+ def divmod_s0(*f)
143
+ coeff, gbasis = Groebner.basis_coeff(f)
144
+ q, r = divmod(*gbasis)
145
+ q0 = (0...f.size).collect do |i|
146
+ sum = 0
147
+ (0...q.size).each do |j|
148
+ sum += q[j] * coeff[j][i]
149
+ end
150
+ sum
151
+ end
152
+ [q0, r]
153
+ end
154
+
155
+ def divmod_s(*f)
156
+ cg = Groebner.basis_coeff(f)
157
+ div_cg(f, cg)
158
+ end
159
+
160
+ def div_cg(f, cg = nil)
161
+ cg = Groebner.basis_coeff(f) unless cg
162
+ coeff, gbasis = cg
163
+ q, r = divmod(*gbasis)
164
+ q0 = (0...f.size).collect do |i|
165
+ sum = 0
166
+ (0...q.size).each do |j|
167
+ sum += q[j] * coeff[j][i]
168
+ end
169
+ sum
170
+ end
171
+ [q0, r]
172
+ end
173
+ end
174
+ end
175
+
176
+ if $PROGRAM_NAME == __FILE__
177
+ require 'algebra/m-polynomial'
178
+ require 'algebra/groebner-basis'
179
+ require 'algebra/algebraic-parser'
180
+ # include Algebra
181
+
182
+ def gbc(f)
183
+ f0 = f.first
184
+ print 'Basis of: '
185
+ puts(f.join(', '))
186
+ c, g = Algebra::Groebner.basis_coeff(f)
187
+ print 'is: '
188
+ puts(g.join(', '))
189
+ puts 'Coeefitients are: '
190
+ c.each do |x|
191
+ puts x.join(', ')
192
+ end
193
+ p 3333
194
+ p g
195
+ p c.collect { |x| f.inner_product x }
196
+
197
+ if g == c.collect { |x| f.inner_product x }
198
+ puts 'Success!'
199
+ else
200
+ puts 'Fail.'
201
+ end
202
+ puts
203
+ end
204
+
205
+ # require "algebra/residue-class-ring"
206
+ # Z5 = ResidueClassRing(Integer, 5)
207
+ # P = MPolynomial(Z5)
208
+ require 'algebra/rational'
209
+ P = Algebra.MPolynomial(Rational)
210
+
211
+ x, y, z = P.vars('xyz')
212
+
213
+ f1 = x**2 + y**2 + z**2 - 1
214
+ f2 = x**2 + z**2 - y
215
+ f3 = x - z
216
+
217
+ gbc([f1, f2, f3])
218
+
219
+ g = x**3 + y**3 + z**3
220
+ q, r = g.divmod_s(f1, f2, f3)
221
+ p q
222
+ p r
223
+ if g == q.inner_product([f1, f2, f3]) + r
224
+ puts 'Success!'
225
+ else
226
+ puts 'Fail.'
227
+ end
228
+ end
@@ -0,0 +1,197 @@
1
+ # Groebner basis module
2
+ #
3
+ # by Shin-ichiro Hara
4
+ #
5
+ # Version 1.3 (2001.04.03)
6
+ #
7
+ # Example:
8
+ # x, y, z = MPolynomial.vars "xyz"
9
+ # require "algebra/mathn"
10
+ # p Groebner.basis([x**2 + y**2 + z**2 -1, x**2 + z**2 - y, x - z])
11
+
12
+ # require "algebra/ruby-version"
13
+ require "algebra/array-supplement"
14
+ require "algebra/groebner-basis-coeff"
15
+ #require "algebra/work/old-basis"
16
+
17
+ module Algebra
18
+ module Groebner
19
+ def S_pair(other)
20
+ x = lm.lcm(other.lm)
21
+ x / lt * rt - x / other.lt * other.rt
22
+ end
23
+
24
+ alias | S_pair
25
+
26
+ def self.basis?(f)
27
+ f.each_pair do |x, y|
28
+ unless ((x|y) % f).zero?
29
+ return false
30
+ end
31
+ end
32
+ true
33
+ end
34
+
35
+ def self.minimal_basis?(f)
36
+ return false unless basis?(f)
37
+ indexes = (0...f.size).to_a
38
+ indexes.each do |i|
39
+ others = f.values_at(*(indexes-[i])).collect{|x| x.lt}
40
+ if (f[i].lt % others).zero?
41
+ return false
42
+ end
43
+ end
44
+ true
45
+ end
46
+
47
+ def self.reduced_basis?(f)
48
+ return false unless basis?(f)
49
+ indexes = (0...f.size).to_a
50
+ indexes.each do |i|
51
+ others = f.values_at(*(indexes-[i])).collect{|x| x.lt}
52
+ f[i].each_term do |t|
53
+ if (t % others).zero?
54
+ return false
55
+ end
56
+ end
57
+ end
58
+ true
59
+ end
60
+
61
+ def self.basis_132D(f)
62
+ gbasis = f.dup
63
+ pairs = []
64
+ gbasis.each_pair do |x, y|
65
+ pairs.push [x, y]
66
+ end
67
+ while pair = pairs.shift
68
+ x, y = pair
69
+ s = (x|y) % gbasis
70
+ unless s.zero?
71
+ gbasis.each do |z| pairs.push([z, s]) end
72
+ gbasis.push s
73
+ end
74
+ end
75
+ gbasis
76
+ end
77
+
78
+ def self.basis_159A(f)
79
+ gbasis = f.sort # little effort
80
+ glm = gbasis.collect{|x| x.lm}
81
+ pairs = []
82
+ (0...glm.size).to_a.each_pair do |i, j|
83
+ pairs.push [i, j]
84
+ end
85
+
86
+ until pairs.empty?
87
+ i, j = pairs.first
88
+ if !glm[i].prime_to?(glm[j]) && !_ct(glm, pairs, i, j)
89
+ s = (gbasis[i]|gbasis[j]) % gbasis
90
+ unless s.zero?
91
+ 0.upto glm.size-1 do |k|
92
+ pairs.push [k, glm.size]
93
+ end
94
+ gbasis.push s
95
+ glm.push s.lm
96
+ end
97
+ end
98
+ pairs.shift
99
+ end
100
+ gbasis
101
+ end
102
+
103
+ def self._ct(fm, b, i, j)
104
+ 0.upto fm.size-1 do |k|
105
+ next if k == i or
106
+ k == j or
107
+ i < k ? b.include?([i, k]) : b.include?([k, i]) or
108
+ j < k ? b.include?([j, k]) : b.include?([k, j])
109
+ return true if fm[k].divide_or?(fm[i], fm[j])
110
+ end
111
+ false
112
+ end
113
+
114
+ def self.minimal_basis(gbasis)
115
+ # p [200, gbasis]
116
+ glm = gbasis.collect{|x| x.lm}
117
+ indexes = (0...gbasis.size).sort{|i, j| glm[j] <=> glm[i]}
118
+ indexes.each_with_index do |i, s|
119
+ (s+1).upto indexes.size-1 do |k| j = indexes[k]
120
+ # p [glm[j], glm[i], glm[j].divide? glm[i]]
121
+ if glm[j].divide? glm[i]
122
+ indexes[s] = nil
123
+ break
124
+ end
125
+ end
126
+ end
127
+ indexes.compact!
128
+ gbasis.values_at(*indexes)
129
+ end
130
+
131
+ def self.reduced_basis(gbasis)
132
+ gbasis.each_with_index do |x, i|
133
+ (g = gbasis.dup).delete_at(i)
134
+ gbasis[i] = x % g
135
+ end
136
+ gbasis.collect{|t| t / t.lc}
137
+ end
138
+
139
+ def self.basis(g)
140
+ gbasis = nil
141
+
142
+ # gbasis = basis_132D(g)
143
+ gbasis = basis_159A(g)
144
+
145
+ gbasis = minimal_basis(gbasis)
146
+ gbasis = reduced_basis(gbasis)
147
+ gbasis.sort!{|x, y| y <=> x}
148
+ gbasis
149
+ end
150
+ end
151
+
152
+ class MPolynomial
153
+ include Algebra::Groebner
154
+ end
155
+
156
+ end
157
+
158
+ if $0 == __FILE__
159
+ require "algebra/m-polynomial"
160
+ # include Algebra
161
+
162
+ def gb(f, sw = false)
163
+ f0 = f.first
164
+ print "Basis of: "
165
+ sw ? puts('', *f) : puts(f.join(", "))
166
+ gbase = Algebra::Groebner.reduced_basis(f)
167
+ print "Is: "
168
+ sw ? puts('', *gbase) : puts(gbase.join(", "))
169
+ puts
170
+ end
171
+
172
+ puts "rational"
173
+ require "algebra/rational"
174
+ x, y, z = Algebra.MPolynomial(Rational).vars "xyz"
175
+ f1 = x**2 + y**2 + z**2 -1
176
+ f2 = x**2 + z**2 - y
177
+ f3 = x - z
178
+ gb([f1, f2, f3])
179
+
180
+
181
+ puts "mod 5"
182
+ require "algebra/residue-class-ring"
183
+ F5 = Algebra.ResidueClassRing(Integer, 5)
184
+ x, y, z = Algebra.MPolynomial(F5).vars "xyz"
185
+ f1 = x**2 + y**2 + z**2 -1
186
+ f2 = x**2 + z**2 - y
187
+ f3 = x - z
188
+ gb([f1, f2, f3])
189
+
190
+ puts "require 'algebra/mathn'"
191
+ require "algebra/mathn"
192
+ x, y, z = Algebra.MPolynomial(Integer).vars "xyz"
193
+ f1 = x**2 + y**2 + z**2 -1
194
+ f2 = x**2 + z**2 - y
195
+ f3 = x - z
196
+ gb([f1, f2, f3])
197
+ end
@@ -0,0 +1,86 @@
1
+ # $IMPORT_MODULE_debug = true
2
+ require 'algebra/import-module'
3
+ module Import_Module
4
+ class Scope
5
+ def set_methods
6
+ meths = @target.get_orig_methods(@source)
7
+ @target.def_orig_methods meths
8
+ # def_methods
9
+ mod = @mod
10
+ @klass.class_eval { include mod }
11
+ end
12
+
13
+ def push
14
+ def_methods
15
+ c = @target.stack.current
16
+ @target.stack.push(update(c))
17
+ end
18
+
19
+ def pop
20
+ c = @target.stack.pop
21
+ recov_methods(c)
22
+ end
23
+
24
+ private
25
+
26
+ def update(c)
27
+ d = c.dup
28
+ @source.methods.__each__ do |meth|
29
+ d[meth] = @mod
30
+ end
31
+ d
32
+ end
33
+
34
+ def def_methods
35
+ mod = @mod
36
+ target = @target
37
+ @source.methods.__each__ do |meth|
38
+ @klass.module_eval do
39
+ alias_method meth, Import_Module.name(meth, mod)
40
+ protected(meth) if target.protecteds.include?(meth)
41
+ private(meth) if target.privates.include?(meth)
42
+ end
43
+ end
44
+ end
45
+
46
+ def recov_methods(c)
47
+ orig_methods = @target.orig_methods
48
+ d = @target.stack.current
49
+ c.__each__ do |meth, _mod|
50
+ @klass.module_eval do
51
+ if m = d[meth] || orig_methods[meth] && :orig
52
+ alias_method meth, Import_Module.name(meth, m)
53
+ else
54
+ undef_method meth
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ class Target
62
+ def initialize(klass)
63
+ @scopes = {}
64
+ @klass = klass
65
+ @publics = @klass.public_instance_methods(true) # .find_all{|m| @klass.public_method_defined? m}
66
+ @privates = @klass.private_instance_methods(true) # .find_all{|m| @klass.private_method_defined? m}
67
+ @protecteds = @klass.protected_instance_methods(true) # .find_all{|m| @klass.protected_method_defined? m}
68
+ @orig_methods = {}
69
+ @saved_methods = {}
70
+ resist_orig_methods
71
+ @stack = Stack.new([{}]) # diff
72
+ end
73
+ end
74
+
75
+ class Stack
76
+ private
77
+
78
+ def export_current; end
79
+ end
80
+ end
81
+
82
+ class << Thread
83
+ alias new new_org
84
+ alias start new_org
85
+ alias fork new_org
86
+ end