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,221 @@
1
+ =begin
2
+ [((<index-ja|URL:index-ja.html>))]
3
+
4
+ = 練習帖
5
+
6
+ == CONTENTS
7
+ * ((<有限集合>))
8
+ * ((<集合>))
9
+ * ((<写像>))
10
+ * ((<群>))
11
+ * ((<多項式の計算>))
12
+ * ((<多変数多項式の計算>))
13
+ * ((<多変数多項式の計算その2>))
14
+ * ((<多項式を複数の多項式で割った余りを求める>))
15
+ * ((<多項式のグレブナ基底を求める>))
16
+ * ((<素体を作る>))
17
+ * ((<代数体を作る>))
18
+ * ((<商体の生成>))
19
+ * ((<整数環の商体を取って有理数を作る>))
20
+ * ((<有理関数体の生成>))
21
+ * ((<代数拡大体上の有理式の計算>))
22
+ * ((<代数関数体>))
23
+ * ((<線形代数>))
24
+ * ((<連立1次方程式を解く>))
25
+ * ((<正方行列の対角化>))
26
+ * ((<行列の単因子を求める>))
27
+ * ((<行列の Jordan 標準形を求める>))
28
+ * ((<Cayley-Hamilton の定理の(次元毎の)証明>))
29
+ * ((<グレブナ基底を元の基底で表現する>))
30
+ * ((<任意の基底で割った商と余りを求める(余り=0に意味がある)>))
31
+ * ((<因数分解>))
32
+ * ((<整数係数多項式の因数分解>))
33
+ * ((<Zp 係数多項式の因数分解>))
34
+ * ((<有理数の代数拡大上の多項式の因数分解>))
35
+ * ((<有理数の代数拡大の代数拡大上の多項式の因数分解>))
36
+ * ((<x^4 + 10x^2 + 1 の因数分解>))
37
+ * ((<整数、有理係数多変数多項式の因数分解>))
38
+ * ((<Zp 係数多変数多項式の因数分解>))
39
+ * ((<代数方程式>))
40
+ * ((<最小多項式>))
41
+ * ((<最小分解体>))
42
+ * ((<多項式のガロア群>))
43
+ * ((<初等幾何>))
44
+ * ((<重心の存在>))
45
+ * ((<外心の存在>))
46
+ * ((<垂心の存在>))
47
+ * ((<4 つの等面積>))
48
+ * ((<解析>))
49
+ * ((<ラグランジュの乗数法>))
50
+
51
+ == 有限集合
52
+
53
+ === 集合
54
+
55
+ <<< sample-set01.rb.v.rd
56
+
57
+ === 写像
58
+
59
+ <<< sample-map01.rb.v.rd
60
+
61
+ === 群
62
+
63
+ <<< sample-group01.rb.v.rd
64
+
65
+ == 多項式の計算
66
+
67
+ <<< sample-polynomial01.rb.v.rd
68
+
69
+ == 多変数多項式の計算
70
+
71
+ <<< sample-polynomial02.rb.v.rd
72
+
73
+ == 多変数多項式の計算その2
74
+
75
+ <<< sample-m-polynomial01.rb.v.rd
76
+
77
+ == 多項式を複数の多項式で割った余りを求める
78
+
79
+ <<< sample-divmod01.rb.v.rd
80
+
81
+ == 多項式のグレブナ基底を求める
82
+
83
+ <<< sample-groebner01.rb.v.rd
84
+
85
+ == 素体を作る
86
+
87
+ <<< sample-primefield01.rb.v.rd
88
+
89
+ == 代数体を作る
90
+
91
+ <<< sample-algebraicfield01.rb.v.rd
92
+
93
+ === これと同じものが次の様に書ける。
94
+
95
+ <<< sample-algebraicfield02.rb.v.rd
96
+
97
+ === ルートの計算
98
+
99
+ <<< sample-algebraic-root01.rb.v.rd
100
+
101
+ == 商体の生成
102
+
103
+ === 整数環の商体を取って有理数を作る
104
+
105
+ <<< sample-quotientfield01.rb.v.rd
106
+
107
+ === 有理関数体の生成
108
+
109
+ <<< sample-quotientfield02.rb.v.rd
110
+
111
+ === 代数拡大体上の有理式の計算
112
+
113
+ <<< sample-quotientfield03.rb.v.rd
114
+
115
+ === 代数関数体
116
+
117
+ <<< sample-quotientfield04.rb.v.rd
118
+
119
+ == 線形代数
120
+
121
+ === 連立1次方程式を解く
122
+
123
+ <<< sample-gaussian-elimination01.rb.v.rd
124
+
125
+ === 正方行列の対角化
126
+
127
+ <<< sample-diagonalization01.rb.v.rd >>>
128
+
129
+ === 行列の単因子を求める
130
+
131
+ <<< sample-elementary-divisor01.rb.v.rd
132
+
133
+ === 行列の Jordan 標準形を求める
134
+
135
+ <<< sample-jordan-form01.rb.v.rd
136
+
137
+ === Cayley-Hamilton の定理の(次元毎の)証明
138
+
139
+ <<< sample-cayleyhamilton01.rb.v.rd
140
+
141
+ == グレブナ基底を元の基底で表現する
142
+
143
+ <<< sample-groebner02.rb.v.rd
144
+
145
+ == 任意の基底で割った商と余りを求める(余り=0に意味がある)
146
+
147
+ <<< sample-groebner03.rb.v.rd
148
+
149
+ == 因数分解
150
+
151
+ === 整数係数多項式の因数分解
152
+
153
+ <<< sample-factorize01.rb.v.rd
154
+
155
+ === Zp 係数多項式の因数分解
156
+
157
+ <<< sample-factorize02.rb.v.rd
158
+
159
+ === 有理数の代数拡大上の多項式の因数分解
160
+
161
+ <<< sample-factorize03.rb.v.rd
162
+
163
+ === 有理数の代数拡大の代数拡大上の多項式の因数分解
164
+
165
+ <<< sample-factorize04.rb.v.rd
166
+
167
+ === x^4 + 10x^2 + 1 の因数分解
168
+
169
+ <<< sample-factorize05.rb.v.rd
170
+
171
+ === 整数、有理係数多変数多項式の因数分解
172
+
173
+ <<< sample-m-factorize01.rb.v.rd
174
+
175
+ === Zp 係数多変数多項式の因数分解
176
+
177
+ <<< sample-m-factorize02.rb.v.rd
178
+
179
+ == 代数方程式
180
+
181
+ === 最小多項式
182
+
183
+ <<< sample-algebraic-equation01.rb.v.rd
184
+
185
+ === 最小分解体
186
+
187
+ <<< sample-splitting-field01.rb.v.rd
188
+
189
+ === 多項式のガロア群
190
+
191
+ <<< sample-galois-group01.rb.v.rd
192
+
193
+ == 初等幾何
194
+
195
+ === 重心の存在
196
+
197
+ <<< sample-geometry01.rb.v.rd
198
+
199
+ === 外心の存在
200
+
201
+ <<< sample-geometry02.rb.v.rd
202
+
203
+ #=== 内心の存在
204
+
205
+ #<<< sample-geometry03.rb.v.rd
206
+
207
+ === 垂心の存在
208
+
209
+ <<< sample-geometry04.rb.v.rd
210
+
211
+
212
+ === 4 つの等面積
213
+ see ((<URL:http://www1.odn.ne.jp/drinkcat/topic/column/quest/quest_2/quest_2.html>)) Question 3.
214
+
215
+ <<< sample-geometry07.rb.v.rd
216
+
217
+ == 解析
218
+ === ラグランジュの乗数法
219
+ <<< sample-lagrange-multiplier01.rb.v.rd
220
+
221
+ =end
@@ -0,0 +1,85 @@
1
+ /*
2
+ * style.css: CSS style definition file for `Rubyavailable'.
3
+ * (<URL:http://www.jin.gr.jp/~nahi/Ruby/*>)
4
+ */
5
+
6
+ body {
7
+ background: #EEEEEE;
8
+ color: black;
9
+ margin-left: 2%;
10
+ margin-right: 2%;
11
+ font-size: 10.5pt;
12
+ font-family: verdana, arial, helvetica, Sans-Serif;
13
+ }
14
+
15
+ h1 {
16
+ font-family: "comic sans ms", verdana, sans-serif;
17
+ # text-align: right;
18
+ margin-top: 5%;
19
+ margin-right: 10%;
20
+ }
21
+
22
+ h2, h3, h4, h5, h6 {
23
+ font-family: verdana, arial, helvetica, Sans-Serif;
24
+ }
25
+
26
+ h2 {
27
+ color: #FFFFFF;
28
+ # background: #CC3333;
29
+ background: #33CCAA;
30
+ }
31
+
32
+ div.header p.status { text-align: right; }
33
+ div.header p.last-modified { text-align: left; }
34
+
35
+ /*
36
+ li p {
37
+ margin-top: -1ex;
38
+ }
39
+ */
40
+
41
+ dt {
42
+ font-weight: bold;
43
+ margin-top: 2ex;
44
+ margin-left: 1em;
45
+ }
46
+
47
+ address {
48
+ color: gray;
49
+ background: #EEEEEE;
50
+ text-align: right;
51
+ font-family: Times, serif;
52
+ font-style: normal;
53
+ font-variant: normal;
54
+ font-weight: normal;
55
+ }
56
+
57
+ pre {
58
+ border-right: #646464 1px solid;
59
+ padding-right: 0.5em;
60
+ border-top: #646464 1px solid;
61
+ padding-top: 0.5em;
62
+ border-left: #646464 1px solid;
63
+ padding-left: 0.5em;
64
+ border-bottom: #646464 1px solid;
65
+ padding-bottom: 0.5em;
66
+ margin-left: 1em;
67
+ margin-right: 2em;
68
+ white-space: pre;
69
+ background-color: #e6e6e6;
70
+ color: black;
71
+ }
72
+
73
+ span.download {
74
+ font-weight: normal;
75
+ color: blue;
76
+ background: #EEEEEE;
77
+ }
78
+
79
+ .path {
80
+ font-family: Verdana, Arial, Helvetica, sans-serif;
81
+ }
82
+
83
+ .navi {
84
+ text-align: right;
85
+ }
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml">
6
+ <head>
7
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
8
+ <title>doc-ja/todo.rd</title>
9
+ <link href="style.css" type="text/css" rel="stylesheet" />
10
+ </head>
11
+ <body>
12
+ <h1><a name="label-0" id="label-0">ToDo</a></h1><!-- RDLabel: "ToDo" -->
13
+ <ul>
14
+ <li>Factorization of multi-variate polynomials over algebraic field</li>
15
+ <li>Factorization over polynomial ring over Euclidian ring</li>
16
+ <li>Geometry</li>
17
+ </ul>
18
+
19
+ </body>
20
+ </html>
@@ -0,0 +1,9 @@
1
+ =begin
2
+
3
+ = ToDo
4
+
5
+ * Factorization of multi-variate polynomials over algebraic field
6
+ * Factorization over polynomial ring over Euclidian ring
7
+ * Geometry
8
+ =end
9
+
@@ -0,0 +1,36 @@
1
+ #
2
+ # algebra
3
+ # by Shin-ichiro HARA
4
+ #
5
+ # Version 0.04 (2003.06.19)
6
+ #
7
+
8
+ require 'algebra/auto-require'
9
+ require 'algebra/rational'
10
+ require 'algebra/version'
11
+
12
+ module Algebra
13
+ require 'algebra/algebraic-equation'
14
+ require 'algebra/polynomial' # class Polynomial
15
+ require 'algebra/m-polynomial'
16
+ require 'algebra/residue-class-ring'
17
+ require 'algebra/algebraic-extension-field'
18
+ require 'algebra/localized-ring'
19
+ require 'algebra/matrix-algebra'
20
+
21
+ require 'algebra/finite-set'
22
+ require 'algebra/finite-map'
23
+ require 'algebra/permutation-group'
24
+ end
25
+ include Algebra
26
+
27
+ require 'algebra/polynomial' # function Polyomial
28
+ require 'algebra/m-polynomial'
29
+
30
+ require 'algebra/residue-class-ring'
31
+ require 'algebra/algebraic-extension-field'
32
+ require 'algebra/localized-ring'
33
+ require 'algebra/matrix-algebra'
34
+
35
+ # for backward compatibility
36
+ require 'algebra/splitting-field'
@@ -0,0 +1,56 @@
1
+ # Utility for Algebraic Equations
2
+ #
3
+ # by Shin-ichiro Hara
4
+ #
5
+ # Version 1.11 (2002.02.23)
6
+
7
+ require 'algebra/polynomial'
8
+ require 'algebra/polynomial-factor'
9
+ require 'algebra/m-polynomial'
10
+ require 'algebra/groebner-basis'
11
+ require 'algebra/residue-class-ring'
12
+ require 'algebra/splitting-field'
13
+
14
+ module Algebra
15
+ module AlgebraicEquation
16
+ def symmetric_product(objs)
17
+ a = [1]
18
+ objs.each do |x|
19
+ ax = a.collect { |t| t * x }
20
+ a.each_index do |i|
21
+ a[i] = a[i] + ax[i - 1] if i > 0 && i < a.size
22
+ end
23
+ a.push ax.last
24
+ end
25
+ a
26
+ end
27
+
28
+ def minimal_polynomial(e, *fs)
29
+ raise 'too many polys' if fs.size > 'x'.ord - 'a'.ord # ("a"..."x").size
30
+ require 'algebra/groebner-basis'
31
+ (mpring = e.class).vars('x')
32
+ x = mpring.var('x')
33
+ gb = mpring.with_ord(:lex) do
34
+ Algebra::Groebner.basis([x - e, * fs])
35
+ end
36
+ gb.last
37
+ end
38
+
39
+ module_function :minimal_polynomial
40
+ module_function :symmetric_product
41
+ end
42
+ end
43
+
44
+ if __FILE__ == $PROGRAM_NAME
45
+ include Algebra::AlgebraicEquation
46
+ require 'algebra/rational'
47
+ PQ = Algebra.MPolynomial(Rational)
48
+ a, b, c, _d = PQ.vars('abcd')
49
+ p minimal_polynomial(a + b, a**3 - 2, b**2 + b + 1)
50
+ p minimal_polynomial(a + b + c, a**2 - 2, b**2 - 3, c**2 - 5)
51
+ # p minimal_polynomial(a + b, a**5-2, b**4+b**3+b**2+b+1)
52
+ # x^20 + 5x^19 + 15x^18 + 35x^17 + 70x^16 + 113x^15 + 155x^14 + 215x^13 + 410x^12 + 1095x^11 + 1929x^10 + 2185x^9 + 1180x^8 - 905x^7 - 835x^6 + 17x^5 + 40x^4 - 255x^3 - 45x^2 + 135x + 81
53
+
54
+ # too difficult, deg == 16
55
+ # p minimal_polynomial(a+b+c+d, a**2-2, b**2-3, c**2-5, d**2-7)
56
+ end
@@ -0,0 +1,135 @@
1
+ # Algebraic Extension Field
2
+ #
3
+ # by Shin-ichiro Hara
4
+ #
5
+ # Version 1.00 (2002.02.27)
6
+
7
+ require 'algebra/polynomial'
8
+ # require "algebra/m-polynomial"
9
+ require 'algebra/residue-class-ring'
10
+
11
+ module Algebra
12
+ def AlgebraicExtensionField(field, var = 'x', &b)
13
+ AlgebraicExtensionField.create(field, var, &b)
14
+ end
15
+ module_function :AlgebraicExtensionField
16
+
17
+ class AlgebraicExtensionField < ResidueClassRing
18
+ def self.create(field, var_obj)
19
+ poly_ring = Algebra.Polynomial(field, var_obj)
20
+
21
+ modulus = yield(poly_ring.var)
22
+ klass = super(poly_ring, modulus)
23
+
24
+ # def klass.var; self[ground.var]; end
25
+ klass.sysvar :var, klass[klass.ground.var]
26
+ klass.sysvar :base, field
27
+
28
+ if Algebra::AlgebraicExtensionField >= field
29
+ env_ring = Algebra.Polynomial(field.env_ring, var_obj)
30
+ klass.sysvar :def_polys, field.def_polys + [modulus]
31
+ else
32
+ env_ring = poly_ring
33
+ klass.sysvar :def_polys, [modulus]
34
+ end
35
+
36
+ poly_ring.class_eval <<-__DEF__
37
+ def abs_lift
38
+ if Algebra::AlgebraicExtensionField >= ground
39
+ project(self.class.env_ring) {|c, n| c.abs_lift }
40
+ else
41
+ project(self.class.env_ring) {|c, n| c }
42
+ end
43
+ end
44
+ __DEF__
45
+ poly_ring.sysvar :env_ring, env_ring
46
+ klass.sysvar :env_ring, env_ring
47
+
48
+ klass
49
+ end
50
+
51
+ def [](n)
52
+ lift[n]
53
+ end
54
+
55
+ def abs_lift
56
+ Algebra::AlgebraicExtensionField >= self.class.base ? lift.abs_lift : lift
57
+ end
58
+
59
+ def self.to_ary
60
+ [self, var]
61
+ end
62
+ end
63
+
64
+ ################# experimental ###################
65
+
66
+ def QuadraticExtensionField(field, var_obj = nil)
67
+ poly_ring = Algebra.Polynomial(field, 'x')
68
+ modulus = yield(poly_ring.var)
69
+ unless modulus.deg == 2
70
+ raise 'give deg 2 polynomial to QuadraticicExtensionField.'
71
+ end
72
+
73
+ fact = modulus.factorize
74
+ if o = fact.find { |x| x[0].deg == 1 }
75
+ b = o[0][0]
76
+ a = o[0][1]
77
+ c = b / a
78
+ return [field, - c, c]
79
+ end
80
+
81
+ c = modulus[0]
82
+ b = modulus[1]
83
+ a = modulus[2]
84
+ a2 = a * 2
85
+ b0 = a2.zero? ? b : (b / a2)
86
+ c1 = c / a - b0**2
87
+ cs = (-c1).to_s
88
+ r = 'r'
89
+ var_obj ||= r + (/^\d+$/ !~ cs ? '(' + cs + ')' : cs)
90
+
91
+ klass, v = AlgebraicExtensionField(field, var_obj) { |x| x**2 + c1 }
92
+
93
+ r1 = v - b0
94
+ r2 = - v - b0
95
+ [klass, r1, r2]
96
+ end
97
+ module_function :QuadraticExtensionField
98
+
99
+ def Sqrt(field, a, _name = nil)
100
+ QuadraticExtensionField(field, nil) { |x| x**2 - a }
101
+ end
102
+
103
+ module_function :Sqrt
104
+
105
+ def Root(field, a = nil, deg = 2, cs = nil, &b)
106
+ r, x = Polynomial(field)
107
+ if b
108
+ f = yield(x)
109
+ as = a ? a.to_s : f.to_s
110
+ else
111
+ f = x**deg - a
112
+ as = a.to_s
113
+ end
114
+
115
+ r = deg == 2 ? 'r' : "r[#{deg}]"
116
+ cs ||= r + (/^\d+$/ !~ as ? '(' + as + ')' : as)
117
+ k = f.splitting_field(nil, cs)
118
+ [k.field, *k.roots]
119
+ end
120
+
121
+ module_function :Root
122
+ end
123
+
124
+ if $PROGRAM_NAME == __FILE__
125
+ R2, r2, _r2_ = Root(Rational, 2)
126
+ R3, r3, _r3_ = Root(R2, 3)
127
+ R6, r6, _r6_ = Root(R3, 6)
128
+
129
+ p r6
130
+ p (r6 + r2 + r3) * (r6 + r2 - r3)
131
+
132
+ P, x = Polynomial(R6, x)
133
+ p (x**4 - 60 * x**2 + 36).factorize
134
+ #=> (x - 2r3 - 3r2)(x + 2r3 - 3r2)(x - 2r3 + 3r2)(x + 2r3 + 3r2)
135
+ end