algebra 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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,56 @@
1
+ =begin
2
+ # sample-jordan-form01.rb
3
+
4
+ require "algebra"
5
+
6
+ M4 = SquareMatrix(Rational, 4)
7
+ m = M4[
8
+ [-1, 1, 2, -1],
9
+ [-5, 3, 4, -2],
10
+ [3, -1, 0, 1],
11
+ [5, -2, -2, 3]
12
+ ]
13
+ m.jordan_form.display; #=>
14
+ # 2, 0, 0, 0
15
+ # 0, 1, 1, 0
16
+ # 0, 0, 1, 1
17
+ # 0, 0, 0, 1
18
+ puts
19
+
20
+ #-----------------------------------
21
+ m = M4[
22
+ [3, 1, -1, 1],
23
+ [-3, -1, 3, -1],
24
+ [-2, -2, 0, 0],
25
+ [0, 0, -4, 2]
26
+ ]
27
+ jf, pt, qt, field, modulus = m.jordan_form_info
28
+ p modulus #=> [a^2 + 4]
29
+ jf.display; puts #=>
30
+ # 2, 1, 0, 0
31
+ # 0, 2, 0, 0
32
+ # 0, 0, a, 0
33
+ # 0, 0, 0, -a
34
+
35
+ m = m.convert_to(jf.class)
36
+ p jf == pt * m * qt #=> true
37
+
38
+ #-----------------------------------
39
+ m = M4[
40
+ [-1, 1, 2, -1],
41
+ [-5, 3, 4, -2],
42
+ [3, -1, 0, 1],
43
+ [5, -2, -2, 0]
44
+ ]
45
+ jf, pt, qt, field, modulus = m.jordan_form_info
46
+ p modulus #=> [a^3 + 3a - 1, b^2 + ab + a^2 + 3]
47
+ jf.display; puts #=>
48
+ # 2, 0, 0, 0
49
+ # 0, a, 0, 0
50
+ # 0, 0, b, 0
51
+ # 0, 0, 0, -b - a
52
+
53
+ m = m.convert_to(jf.class)
54
+ p jf == pt * m * qt #=> true
55
+ ((<_|CONTENTS>))
56
+ =end
@@ -0,0 +1,55 @@
1
+ =begin
2
+ ----------^ sample-jordanform01.rb
3
+ require "algebra"
4
+
5
+ M4 = SquareMatrix(Rational, 4)
6
+ m = M4[
7
+ [-1, 1, 2, -1],
8
+ [-5, 3, 4, -2],
9
+ [3, -1, 0, 1],
10
+ [5, -2, -2, 3]
11
+ ]
12
+ m.jordan_form.display; #=>
13
+ # 2, 0, 0, 0
14
+ # 0, 1, 1, 0
15
+ # 0, 0, 1, 1
16
+ # 0, 0, 0, 1
17
+ puts
18
+
19
+ #------------------------------------------------------------
20
+ m = M4[
21
+ [3, 1, -1, 1],
22
+ [-3, -1, 3, -1],
23
+ [-2, -2, 0, 0],
24
+ [0, 0, -4, 2]
25
+ ]
26
+ jf, pt, qt, field, modulus = m.jordan_form_info
27
+ print "extention = "; p modulus #=> [a^2 + 4]
28
+ jf.display; puts #=>
29
+ # 2, 1, 0, 0
30
+ # 0, 2, 0, 0
31
+ # 0, 0, a, 0
32
+ # 0, 0, 0, -a
33
+
34
+ m = m.convert_to(jf.type)
35
+ p jf == pt * m * qt #=> true
36
+
37
+ #------------------------------------------------------------
38
+ m = M4[
39
+ [-1, 1, 2, -1],
40
+ [-5, 3, 4, -2],
41
+ [3, -1, 0, 1],
42
+ [5, -2, -2, 0]
43
+ ]
44
+ jf, pt, qt, field, modulus = m.jordan_form_info
45
+ print "extention = "; p modulus #=> [a^3 + 3a - 1, b^2 + ab + a^2 + 3]
46
+ jf.display; puts #=>
47
+ # 2, 0, 0, 0
48
+ # 0, a, 0, 0
49
+ # 0, 0, b, 0
50
+ # 0, 0, 0, -b - a
51
+
52
+ m = m.convert_to(jf.type)
53
+ p jf == pt * m * qt #=> true
54
+ ----------$ sample-jordanform01.rb
55
+ =end
@@ -0,0 +1,35 @@
1
+ =begin
2
+ # sample-lagrange-multiplier01.rb
3
+
4
+ require 'algebra'
5
+ P = MPolynomial(Rational)
6
+ t, x, y, z = P.vars('txyz')
7
+ f = x**3+2*x*y*z - z**2
8
+ g = x**2 + y**2 + z**2 - 1
9
+
10
+ fx = f.derivate(x)
11
+ fy = f.derivate(y)
12
+ fz = f.derivate(z)
13
+
14
+ gx = g.derivate(x)
15
+ gy = g.derivate(y)
16
+ gz = g.derivate(z)
17
+
18
+ F = [fx - t * gx, fy - t * gy, fz - t * gz, g]
19
+
20
+ Groebner.basis(F).each do |h|
21
+ p h.factorize
22
+ end
23
+
24
+ #(1/7670)(7670t - 11505x - 11505yz - 335232z^6 + 477321z^4 - 134419z^2)
25
+ #x^2 + y^2 + z^2 - 1
26
+ #(1/3835)(3835xy - 19584z^5 + 25987z^3 - 6403z)
27
+ #(1/3835)(3835x + 3835yz - 1152z^4 - 1404z^2 + 2556)(z)
28
+ #(1/3835)(3835y^3 + 3835yz^2 - 3835y - 9216z^5 + 11778z^3 - 2562z)
29
+ #(1/3835)(3835y^2 - 6912z^4 + 10751z^2 - 3839)(z)
30
+ #(1/118)(118y - 1152z^3 + 453z)(z)(z - 1)(z + 1)
31
+ #(1/1152)(z)(z - 1)(3z - 2)(3z + 2)(z + 1)(128z^2 - 11)
32
+
33
+
34
+ ((<_|CONTENTS>))
35
+ =end
@@ -0,0 +1,15 @@
1
+ =begin
2
+ # sample-m-factorize01.rb
3
+
4
+ require "algebra"
5
+ P = MPolynomial(Integer)
6
+ x, y, z = P.vars("xyz")
7
+ f = x**3 + y**3 + z**3 - 3*x*y*z
8
+ p f.factorize #=> (x + y + z)(x^2 - xy - xz + y^2 - yz + z^2)
9
+
10
+ PQ = MPolynomial(Rational)
11
+ x, y, z = PQ.vars("xyz")
12
+ f = x**3 + y**3/8 + z**3 - 3*x*y*z/2
13
+ p f.factorize #=> (1/8)(2x + y + 2z)(4x^2 - 2xy - 4xz + y^2 - 2yz + 4z^2)
14
+ ((<_|CONTENTS>))
15
+ =end
@@ -0,0 +1,12 @@
1
+ =begin
2
+ # sample-m-factorize02.rb
3
+
4
+ require "algebra"
5
+
6
+ Z7 = ResidueClassRing(Integer, 7)
7
+ P = MPolynomial(Z7)
8
+ x, y, z = P.vars("xyz")
9
+ f = x**3 + y**3 + z**3 - 3*x*y*z
10
+ p f.factorize #=> (x + 4y + 2z)(x + 2y + 4z)(x + y + z)
11
+ ((<_|CONTENTS>))
12
+ =end
@@ -0,0 +1,10 @@
1
+ =begin
2
+ # sample-m-polynomial01.rb
3
+
4
+ require "algebra"
5
+ P = MPolynomial(Integer)
6
+ x, y, z, w = P.vars("xyz")
7
+ p((-x + y + z)*(x + y - z)*(x - y + z))
8
+ #=> -x^3 + x^2y + x^2z + xy^2 - 2xyz + xz^2 - y^3 + y^2z + yz^2 - z^3
9
+ ((<_|CONTENTS>))
10
+ =end
@@ -0,0 +1,9 @@
1
+ =begin
2
+ # sample-map01.rb
3
+
4
+ require "algebra"
5
+ a = Map[0=>2, 1=>2, 2=>0]
6
+ b = Map[0=>1, 1=>1, 2=>1]
7
+ p a * b #=> {0=>2, 1=>2, 2=>2}
8
+ ((<_|CONTENTS>))
9
+ =end
@@ -0,0 +1,9 @@
1
+ =begin
2
+ # sample-polynomial01.rb
3
+
4
+ require "algebra"
5
+ P = Polynomial.create(Integer, "x")
6
+ x = P.var
7
+ p((x + 1)**100) #=> x^100 + 100x^99 + ... + 100x + 1
8
+ ((<_|CONTENTS>))
9
+ =end
@@ -0,0 +1,11 @@
1
+ =begin
2
+ # sample-polynomial02.rb
3
+
4
+ require "algebra"
5
+ P = Polynomial(Integer, "x", "y", "z")
6
+ x, y, z = P.vars
7
+ p((-x + y + z)*(x + y - z)*(x - y + z))
8
+ #=> -z^3 + (y + x)z^2 + (y^2 - 2xy + x^2)z - y^3 + xy^2 + x^2y - x^3
9
+
10
+ ((<_|CONTENTS>))
11
+ =end
@@ -0,0 +1,13 @@
1
+ =begin
2
+ # sample-primefield01.rb
3
+
4
+ require "algebra"
5
+ Z13 = ResidueClassRing(Integer, 13)
6
+
7
+ a, b, c, d, e, f, g = Z13
8
+ p [e + c, e - c, e * c, e * 2001, 3 + c, 1/c, 1/c * c, d / d, b * 1 / b]
9
+ #=> [6, 2, 8, 9, 5, 7, 1, 1, 1]
10
+ p( (1...13).collect{|i| Z13[i]**12} )
11
+ #=> [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
12
+ ((<_|CONTENTS>))
13
+ =end
@@ -0,0 +1,11 @@
1
+ =begin
2
+ # sample-quotientfield01.rb
3
+
4
+ require "algebra"
5
+ Q = LocalizedRing(Integer)
6
+ a = Q.new(3, 5)
7
+ b = Q.new(5, 3)
8
+ p [a + b, a - b, a * b, a / b, a + 3, 1 + a]
9
+ #=> [34/15, -16/15, 15/15, 9/25, 18/5, 8/5]
10
+ ((<_|CONTENTS>))
11
+ =end
@@ -0,0 +1,18 @@
1
+ =begin
2
+ # sample-quotientfield02.rb
3
+
4
+ require "algebra"
5
+
6
+ F13 = ResidueClassRing(Integer, 13)
7
+
8
+ P = Polynomial(F13, "x")
9
+ Q = LocalizedRing(P)
10
+ x = Q[P.var]
11
+ p ( 1 / (x**2 - 1) - 1 / (x**3 - 1) )
12
+
13
+ #This is equivalent to the following
14
+ F = RationalFunctionField(F13, "x")
15
+ x = F.var
16
+ p ( 1 / (x**2 - 1) - 1 / (x**3 - 1) )
17
+ ((<_|CONTENTS>))
18
+ =end
@@ -0,0 +1,16 @@
1
+ =begin
2
+ # sample-quotientfield03.rb
3
+
4
+ require "algebra"
5
+
6
+ F13 = ResidueClassRing(Integer, 13)
7
+ F = AlgebraicExtensionField(F13, "a") {|a| a**2 - 2}
8
+ a = F.var
9
+ RF = RationalFunctionField(F, "x")
10
+ x = RF.var
11
+
12
+ p( (a/4*x + RF.unity/2)/(x**2 + a*x + 1) +
13
+ (-a/4*x + RF.unity/2)/(x**2 - a*x + 1) )
14
+ #=> 1/(x**4 + 1)
15
+ ((<_|CONTENTS>))
16
+ =end
@@ -0,0 +1,16 @@
1
+ =begin
2
+ # sample-quotientfield04.rb
3
+
4
+ require "algebra"
5
+
6
+ F13 = ResidueClassRing(Integer, 13)
7
+ F = RationalFunctionField(F13, "x")
8
+ x = F.var
9
+ AF = AlgebraicExtensionField(F, "a") {|a| a**2 - 2*x}
10
+ a = AF.var
11
+
12
+ p( (a/4*x + AF.unity/2)/(x**2 + a*x + 1) +
13
+ (-a/4*x + AF.unity/2)/(x**2 - a*x + 1) )
14
+ #=> (-x^3 + x^2 + 1)/(x^4 + 11x^3 + 2x^2 + 1)
15
+ ((<_|CONTENTS>))
16
+ =end
@@ -0,0 +1,18 @@
1
+ =begin
2
+ # sample-set01.rb
3
+
4
+ require "algebra"
5
+ #intersection
6
+ p Set[0, 1, 2, 4] & Set[1, 3, 5] == Set[1]
7
+ p Set[0, 1, 2, 4] & Set[7, 3, 5] == Set.phi
8
+
9
+ #union
10
+ p Set[0, 1, 2, 4] | Set[1, 3, 5] == Set[0, 1, 2, 3, 4, 5]
11
+
12
+ #membership
13
+ p Set[1, 3, 2].has?(1)
14
+
15
+ #inclusion
16
+ p Set[3, 2, 1, 3] < Set[3, 1, 4, 2, 0]
17
+ ((<_|CONTENTS>))
18
+ =end
@@ -0,0 +1,19 @@
1
+ =begin
2
+ # sample-splitting-field01.rb
3
+
4
+ require "algebra"
5
+
6
+ PQ = Polynomial(Rational, "x")
7
+ x = PQ.var
8
+ f = x**4 + 2
9
+ p f #=> x^4 + 2
10
+ field, modulus, facts = f.decompose
11
+ p modulus #=> [a^4 + 2, b^2 + a^2]
12
+ p facts #=> (x - a)(x + a)(x - b)(x + b)
13
+
14
+ fp = Polynomial(field, "x")
15
+ x = fp.var
16
+ facts = Factors.new(facts.collect{|g, n| [g.evaluate(x), n]})
17
+ p facts.pi == f.convert_to(fp) #=> true
18
+ ((<_|CONTENTS>))
19
+ =end
@@ -0,0 +1,885 @@
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/samples-ja.rd</title>
9
+ <link href="style.css" type="text/css" rel="stylesheet" />
10
+ </head>
11
+ <body>
12
+ <p>[<a href="index-ja.html">index-ja</a>] </p>
13
+ <h1><a name="label-0" id="label-0">練習帖</a></h1><!-- RDLabel: "練習帖" -->
14
+ <h2><a name="label-1" id="label-1">CONTENTS</a></h2><!-- RDLabel: "CONTENTS" -->
15
+ <ul>
16
+ <li><a href="#label-2">有限集合</a>
17
+ <ul>
18
+ <li><a href="#label-3">集合</a></li>
19
+ <li><a href="#label-4">写像</a></li>
20
+ <li><a href="#label-5">群</a></li>
21
+ </ul></li>
22
+ <li><a href="#label-6">多項式の計算</a></li>
23
+ <li><a href="#label-7">多変数多項式の計算</a></li>
24
+ <li><a href="#label-8">多変数多項式の計算その2</a></li>
25
+ <li><a href="#label-9">多項式を複数の多項式で割った余りを求める</a></li>
26
+ <li><a href="#label-10">多項式のグレブナ基底を求める</a></li>
27
+ <li><a href="#label-11">素体を作る</a></li>
28
+ <li><a href="#label-12">代数体を作る</a></li>
29
+ <li><a href="#label-15">商体の生成</a>
30
+ <ul>
31
+ <li><a href="#label-16">整数環の商体を取って有理数を作る</a></li>
32
+ <li><a href="#label-17">有理関数体の生成</a></li>
33
+ <li><a href="#label-18">代数拡大体上の有理式の計算</a></li>
34
+ <li><a href="#label-19">代数関数体</a></li>
35
+ </ul></li>
36
+ <li><a href="#label-20">線形代数</a>
37
+ <ul>
38
+ <li><a href="#label-21">連立1次方程式を解く</a></li>
39
+ <li><a href="#label-22">正方行列の対角化</a></li>
40
+ <li><a href="#label-23">行列の単因子を求める</a></li>
41
+ <li><a href="#label-24">行列の Jordan 標準形を求める</a></li>
42
+ <li><a href="#label-25">Cayley-Hamilton の定理の(次元毎の)証明</a></li>
43
+ </ul></li>
44
+ <li><a href="#label-26">グレブナ基底を元の基底で表現する</a></li>
45
+ <li><a href="#label-27">任意の基底で割った商と余りを求める(余り=0に意味がある)</a></li>
46
+ <li><a href="#label-28">因数分解</a>
47
+ <ul>
48
+ <li><a href="#label-29">整数係数多項式の因数分解</a></li>
49
+ <li><a href="#label-30">Zp 係数多項式の因数分解</a></li>
50
+ <li><a href="#label-31">有理数の代数拡大上の多項式の因数分解</a></li>
51
+ <li><a href="#label-32">有理数の代数拡大の代数拡大上の多項式の因数分解</a></li>
52
+ <li><a href="#label-33">x^4 + 10x^2 + 1 の因数分解</a></li>
53
+ <li><a href="#label-34">整数、有理係数多変数多項式の因数分解</a></li>
54
+ <li><a href="#label-35">Zp 係数多変数多項式の因数分解</a></li>
55
+ </ul></li>
56
+ <li><a href="#label-36">代数方程式</a>
57
+ <ul>
58
+ <li><a href="#label-37">最小多項式</a></li>
59
+ <li><a href="#label-38">最小分解体</a></li>
60
+ <li><a href="#label-39">多項式のガロア群</a></li>
61
+ </ul></li>
62
+ <li><a href="#label-40">初等幾何</a>
63
+ <ul>
64
+ <li><a href="#label-41">重心の存在</a></li>
65
+ <li><a href="#label-42">外心の存在</a></li>
66
+ <li><a href="#label-43">垂心の存在</a></li>
67
+ <li><a href="#label-44">4 つの等面積</a></li>
68
+ </ul></li>
69
+ <li><a href="#label-45">解析</a>
70
+ <ul>
71
+ <li><a href="#label-46">ラグランジュの乗数法</a></li>
72
+ </ul></li>
73
+ </ul>
74
+ <h2><a name="label-2" id="label-2">有限集合</a></h2><!-- RDLabel: "有限集合" -->
75
+ <h3><a name="label-3" id="label-3">集合</a></h3><!-- RDLabel: "集合" -->
76
+ <pre># sample-set01.rb
77
+
78
+ require "algebra"
79
+ #intersection
80
+ p Set[0, 1, 2, 4] &amp; Set[1, 3, 5] == Set[1]
81
+ p Set[0, 1, 2, 4] &amp; Set[7, 3, 5] == Set.phi
82
+
83
+ #union
84
+ p Set[0, 1, 2, 4] | Set[1, 3, 5] == Set[0, 1, 2, 3, 4, 5]
85
+
86
+ #membership
87
+ p Set[1, 3, 2].has?(1)
88
+
89
+ #inclusion
90
+ p Set[3, 2, 1, 3] &lt; Set[3, 1, 4, 2, 0]</pre>
91
+ <p><a href="#label-1">_</a></p>
92
+ <h3><a name="label-4" id="label-4">写像</a></h3><!-- RDLabel: "写像" -->
93
+ <pre># sample-map01.rb
94
+
95
+ require "algebra"
96
+ a = Map[0=&gt;2, 1=&gt;2, 2=&gt;0]
97
+ b = Map[0=&gt;1, 1=&gt;1, 2=&gt;1]
98
+ p a * b #=&gt; {0=&gt;2, 1=&gt;2, 2=&gt;2}</pre>
99
+ <p><a href="#label-1">_</a></p>
100
+ <h3><a name="label-5" id="label-5">群</a></h3><!-- RDLabel: "群" -->
101
+ <pre># sample-group01.rb
102
+
103
+ require "algebra"
104
+ e = Permutation[0, 1, 2, 3, 4]
105
+ a = Permutation[1, 0, 3, 4, 2]
106
+ b = Permutation[0, 2, 1, 3, 4]
107
+ p a * b #=&gt; [2, 0, 3, 4, 1]
108
+
109
+ g = Group.new(e, a, b)
110
+ g.complete!
111
+ p g == PermutationGroup.symmetric(5) #=&gt; true</pre>
112
+ <p><a href="#label-1">_</a></p>
113
+ <h2><a name="label-6" id="label-6">多項式の計算</a></h2><!-- RDLabel: "多項式の計算" -->
114
+ <pre># sample-polynomial01.rb
115
+
116
+ require "algebra"
117
+ P = Polynomial.create(Integer, "x")
118
+ x = P.var
119
+ p((x + 1)**100) #=&gt; x^100 + 100x^99 + ... + 100x + 1</pre>
120
+ <p><a href="#label-1">_</a></p>
121
+ <h2><a name="label-7" id="label-7">多変数多項式の計算</a></h2><!-- RDLabel: "多変数多項式の計算" -->
122
+ <pre># sample-polynomial02.rb
123
+
124
+ require "algebra"
125
+ P = Polynomial(Integer, "x", "y", "z")
126
+ x, y, z = P.vars
127
+ p((-x + y + z)*(x + y - z)*(x - y + z))
128
+ #=&gt; -z^3 + (y + x)z^2 + (y^2 - 2xy + x^2)z - y^3 + xy^2 + x^2y - x^3</pre>
129
+ <p><a href="#label-1">_</a></p>
130
+ <h2><a name="label-8" id="label-8">多変数多項式の計算その2</a></h2><!-- RDLabel: "多変数多項式の計算その2" -->
131
+ <pre># sample-m-polynomial01.rb
132
+
133
+ require "algebra"
134
+ P = MPolynomial(Integer)
135
+ x, y, z, w = P.vars("xyz")
136
+ p((-x + y + z)*(x + y - z)*(x - y + z))
137
+ #=&gt; -x^3 + x^2y + x^2z + xy^2 - 2xyz + xz^2 - y^3 + y^2z + yz^2 - z^3</pre>
138
+ <p><a href="#label-1">_</a></p>
139
+ <h2><a name="label-9" id="label-9">多項式を複数の多項式で割った余りを求める</a></h2><!-- RDLabel: "多項式を複数の多項式で割った余りを求める" -->
140
+ <pre># sample-divmod01.rb
141
+
142
+ require "algebra"
143
+ P = MPolynomial(Rational)
144
+ x, y, z = P.vars("xyz")
145
+ f = x**2*y + x*y**2 + y*2 + z**3
146
+ g = x*y-z**3
147
+ h = y*2-6*z
148
+
149
+ P.set_ord(:lex) # lex, grlex, grevlex
150
+ puts "(#{f}).divmod([#{g}, #{h}]) =&gt;", "#{f.divmod(g, h).inspect}"
151
+ #=&gt; (x^2y + xy^2 + 2y + z^3).divmod([xy - z^3, 2y - 6z]) =&gt;
152
+ # [[x + y, 1/2z^3 + 1], xz^3 + 3z^4 + z^3 + 6z]
153
+ # = [[Quotient1,Quotient2], Remainder]</pre>
154
+ <p><a href="#label-1">_</a></p>
155
+ <h2><a name="label-10" id="label-10">多項式のグレブナ基底を求める</a></h2><!-- RDLabel: "多項式のグレブナ基底を求める" -->
156
+ <pre># sample-groebner01.rb
157
+
158
+ require "algebra"
159
+ P = MPolynomial(Rational, "xyz")
160
+ x, y, z = P.vars("xyz")
161
+ f1 = x**2 + y**2 + z**2 -1
162
+ f2 = x**2 + z**2 - y
163
+ f3 = x - z
164
+ p Groebner.basis([f1, f2, f3])
165
+ #=&gt; [x - z, y - 2z^2, z^4 + 1/2z^2 - 1/4]</pre>
166
+ <p><a href="#label-1">_</a></p>
167
+ <h2><a name="label-11" id="label-11">素体を作る</a></h2><!-- RDLabel: "素体を作る" -->
168
+ <pre># sample-primefield01.rb
169
+
170
+ require "algebra"
171
+ Z13 = ResidueClassRing(Integer, 13)
172
+
173
+ a, b, c, d, e, f, g = Z13
174
+ p [e + c, e - c, e * c, e * 2001, 3 + c, 1/c, 1/c * c, d / d, b * 1 / b]
175
+ #=&gt; [6, 2, 8, 9, 5, 7, 1, 1, 1]
176
+ p( (1...13).collect{|i| Z13[i]**12} )
177
+ #=&gt; [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]</pre>
178
+ <p><a href="#label-1">_</a></p>
179
+ <h2><a name="label-12" id="label-12">代数体を作る</a></h2><!-- RDLabel: "代数体を作る" -->
180
+ <pre># sample-algebraicfield01.rb
181
+
182
+ require "algebra"
183
+
184
+ Px = Polynomial(Rational, "x")
185
+ x = Px.var
186
+ F = ResidueClassRing(Px, x**2 + x + 1)
187
+ x = F[x]
188
+ p( (x + 1)**100 )
189
+ #=&gt; -x - 1
190
+ p( (x-1)** 3 / (x**2 - 1) )
191
+ #=&gt; -3x - 3
192
+
193
+ G = Polynomial(F, "y")
194
+ y = G.var
195
+ p( (x + y + 1)** 7 )
196
+ #=&gt; y^7 + (7x + 7)y^6 + 8xy^5 + 4y^4 + (4x + 4)y^3 + 5xy^2 + 7y + x + 1
197
+
198
+ H = ResidueClassRing(G, y**5 + x*y + 1)
199
+ y = H[y]
200
+ p( 1/(x + y + 1)**7 )
201
+ #=&gt; (1798/3x + 1825/9)y^4 + (-74x + 5176/9)y^3 +
202
+ # (-6886/9x - 5917/9)y^2 + (1826/3x - 3101/9)y + 2146/9x + 4702/9</pre>
203
+ <p><a href="#label-1">_</a></p>
204
+ <h3><a name="label-13" id="label-13">これと同じものが次の様に書ける。</a></h3><!-- RDLabel: "これと同じものが次の様に書ける。" -->
205
+ <pre># sample-algebraicfield02.rb
206
+
207
+ require "algebra"
208
+
209
+ F = AlgebraicExtensionField(Rational, "x") {|x| x**2 + x + 1}
210
+ x = F.var
211
+ p( (x + 1)**100 )
212
+ p( (x-1)** 3 / (x**2 - 1) )
213
+
214
+ H = AlgebraicExtensionField(F, "y") {|y| y**5 + x*y + 1}
215
+ y = H.var
216
+ p( 1/(x + y + 1)**7 )</pre>
217
+ <p><a href="#label-1">_</a></p>
218
+ <h3><a name="label-14" id="label-14">ルートの計算</a></h3><!-- RDLabel: "ルートの計算" -->
219
+ <pre># sample-algebraic-root01.rb
220
+
221
+ require "algebra"
222
+
223
+ R2, r2, r2_ = Root(Rational, 2) # r2 = sqrt(2), -sqrt(2)
224
+ p r2 #=&gt; sqrt(2)
225
+ R3, r3, r3_ = Root(R2, 3) # r3 = sqrt(3), -sqrt(3)
226
+ p r3 #=&gt; sqrt(3)
227
+ R6, r6, r6_ = Root(R3, 6) # R6 = R3, r6 = sqrt(6), -sqrt(6)
228
+ p r6 #=&gt; -r2r3
229
+ p( (r6 + r2)*(r6 - r2) ) #=&gt; 4
230
+
231
+ F, a, b = QuadraticExtensionField(Rational){|x| x**2 - x - 1}
232
+ # fibonacci numbers
233
+ (0..100).each do |n|
234
+ puts( (a**n - b**n)/(a - b) )
235
+ end</pre>
236
+ <p><a href="#label-1">_</a></p>
237
+ <h2><a name="label-15" id="label-15">商体の生成</a></h2><!-- RDLabel: "商体の生成" -->
238
+ <h3><a name="label-16" id="label-16">整数環の商体を取って有理数を作る</a></h3><!-- RDLabel: "整数環の商体を取って有理数を作る" -->
239
+ <pre># sample-quotientfield01.rb
240
+
241
+ require "algebra"
242
+ Q = LocalizedRing(Integer)
243
+ a = Q.new(3, 5)
244
+ b = Q.new(5, 3)
245
+ p [a + b, a - b, a * b, a / b, a + 3, 1 + a]
246
+ #=&gt; [34/15, -16/15, 15/15, 9/25, 18/5, 8/5]</pre>
247
+ <p><a href="#label-1">_</a></p>
248
+ <h3><a name="label-17" id="label-17">有理関数体の生成</a></h3><!-- RDLabel: "有理関数体の生成" -->
249
+ <pre># sample-quotientfield02.rb
250
+
251
+ require "algebra"
252
+
253
+ F13 = ResidueClassRing(Integer, 13)
254
+
255
+ P = Polynomial(F13, "x")
256
+ Q = LocalizedRing(P)
257
+ x = Q[P.var]
258
+ p ( 1 / (x**2 - 1) - 1 / (x**3 - 1) )
259
+
260
+ #This is equivalent to the following
261
+ F = RationalFunctionField(F13, "x")
262
+ x = F.var
263
+ p ( 1 / (x**2 - 1) - 1 / (x**3 - 1) )</pre>
264
+ <p><a href="#label-1">_</a></p>
265
+ <h3><a name="label-18" id="label-18">代数拡大体上の有理式の計算</a></h3><!-- RDLabel: "代数拡大体上の有理式の計算" -->
266
+ <pre># sample-quotientfield03.rb
267
+
268
+ require "algebra"
269
+
270
+ F13 = ResidueClassRing(Integer, 13)
271
+ F = AlgebraicExtensionField(F13, "a") {|a| a**2 - 2}
272
+ a = F.var
273
+ RF = RationalFunctionField(F, "x")
274
+ x = RF.var
275
+
276
+ p( (a/4*x + RF.unity/2)/(x**2 + a*x + 1) +
277
+ (-a/4*x + RF.unity/2)/(x**2 - a*x + 1) )
278
+ #=&gt; 1/(x**4 + 1)</pre>
279
+ <p><a href="#label-1">_</a></p>
280
+ <h3><a name="label-19" id="label-19">代数関数体</a></h3><!-- RDLabel: "代数関数体" -->
281
+ <pre># sample-quotientfield04.rb
282
+
283
+ require "algebra"
284
+
285
+ F13 = ResidueClassRing(Integer, 13)
286
+ F = RationalFunctionField(F13, "x")
287
+ x = F.var
288
+ AF = AlgebraicExtensionField(F, "a") {|a| a**2 - 2*x}
289
+ a = AF.var
290
+
291
+ p( (a/4*x + AF.unity/2)/(x**2 + a*x + 1) +
292
+ (-a/4*x + AF.unity/2)/(x**2 - a*x + 1) )
293
+ #=&gt; (-x^3 + x^2 + 1)/(x^4 + 11x^3 + 2x^2 + 1)</pre>
294
+ <p><a href="#label-1">_</a></p>
295
+ <h2><a name="label-20" id="label-20">線形代数</a></h2><!-- RDLabel: "線形代数" -->
296
+ <h3><a name="label-21" id="label-21">連立1次方程式を解く</a></h3><!-- RDLabel: "連立1次方程式を解く" -->
297
+ <pre># sample-gaussian-elimination01.rb
298
+
299
+ require "algebra"
300
+ M = MatrixAlgebra(Rational, 5, 4)
301
+ a = M.matrix{|i, j| i + j}
302
+ a.display #=&gt;
303
+ #[0, 1, 2, 3]
304
+ #[1, 2, 3, 4]
305
+ #[2, 3, 4, 5]
306
+ #[3, 4, 5, 6]
307
+ #[4, 5, 6, 7]
308
+ a.kernel_basis.each do |v|
309
+ puts "a * #{v} = #{a * v}"
310
+ #=&gt; a * [1, -2, 1, 0] = [0, 0, 0, 0, 0]
311
+ #=&gt; a * [2, -3, 0, 1] = [0, 0, 0, 0, 0]
312
+ end</pre>
313
+ <p><a href="#label-1">_</a></p>
314
+ <h3><a name="label-22" id="label-22">正方行列の対角化</a></h3><!-- RDLabel: "正方行列の対角化" -->
315
+ <pre># sample-diagonalization01.rb
316
+
317
+ require "algebra"
318
+ M = SquareMatrix(Rational, 3)
319
+ a = M[[1,-1,-1], [-1,1,-1], [2,1,-1]]
320
+ puts "A = "; a.display; puts
321
+ #A =
322
+ # 1, -1, -1
323
+ # -1, 1, -1
324
+ # 2, 1, -1
325
+
326
+ e = a.diagonalize
327
+
328
+ puts "Charactoristic Poly.: #{e.chpoly} =&gt; #{e.facts}";puts
329
+ #Charactoristic Poly.: t^3 - t^2 + t - 6 =&gt; (t - 2)(t^2 + t + 3)
330
+
331
+ puts "Algebraic Numbers:"
332
+ e.roots.each do |po, rs|
333
+ puts "#{rs.join(', ')} : roots of #{po} == 0"
334
+ end; puts
335
+ #Algebraic Numbers:
336
+ #a, -a - 1 : roots of t^2 + t + 3 == 0
337
+
338
+ puts "EigenSpaces: "
339
+ e.evalues.uniq.each do |ev|
340
+ puts "W_{#{ev}} = &lt;#{e.espaces[ev].join(', ')}&gt;"
341
+ end; puts
342
+ #EigenSpaces:
343
+ #W_{2} = &lt;[4, -5, 1]&gt;
344
+ #W_{a} = &lt;[1/3a + 1/3, 1/3a + 1/3, 1]&gt;
345
+ #W_{-a - 1} = &lt;[-1/3a, -1/3a, 1]&gt;
346
+
347
+ puts "Trans. Matrix:"
348
+ puts "P ="
349
+ e.tmatrix.display; puts
350
+ puts "P^-1 * A * P = "; (e.tmatrix.inverse * a * e.tmatrix).display; puts
351
+ #P =
352
+ # 4, 1/3a + 1/3, -1/3a
353
+ # -5, 1/3a + 1/3, -1/3a
354
+ # 1, 1, 1
355
+ #
356
+ #P^-1 * A * P =
357
+ # 2, 0, 0
358
+ # 0, a, 0
359
+ # 0, 0, -a - 1</pre>
360
+ <p><a href="#label-1">_</a></p>
361
+ <h3><a name="label-23" id="label-23">行列の単因子を求める</a></h3><!-- RDLabel: "行列の単因子を求める" -->
362
+ <pre># sample-elementary-divisor01.rb
363
+
364
+ require "algebra"
365
+
366
+ M = SquareMatrix(Rational, 4)
367
+ a = M[
368
+ [2, 0, 0, 0],
369
+ [0, 2, 0, 0],
370
+ [0, 0, 2, 0],
371
+ [5, 0, 0, 2]
372
+ ]
373
+ P = Polynomial(Rational, "x")
374
+ MP = SquareMatrix(P, 4)
375
+
376
+ ac = a._char_matrix(MP)
377
+ ac.display; puts #=&gt;
378
+ #x - 2, 0, 0, 0
379
+ # 0, x - 2, 0, 0
380
+ # 0, 0, x - 2, 0
381
+ # -5, 0, 0, x - 2
382
+
383
+ p ac.elementary_divisor #=&gt; [1, x - 2, x - 2, x^2 - 4x + 4]
384
+
385
+ require "algebra/matrix-algebra-triplet"
386
+ at = ac.to_triplet.e_diagonalize
387
+
388
+ at.body.display; puts #=&gt;
389
+ # 1, 0, 0, 0
390
+ # 0, x - 2, 0, 0
391
+ # 0, 0, x - 2, 0
392
+ # 0, 0, 0, x^2 - 4x + 4
393
+
394
+ at.left.display; puts #=&gt;
395
+ # 0, 0, 0, -1/5
396
+ # 0, 1, 0, 0
397
+ # 0, 0, 1, 0
398
+ # 5, 0, 0, x - 2
399
+
400
+ at.right.display; puts #=&gt;
401
+ # 1, 0, 0, 1/5x - 2/5
402
+ # 0, 1, 0, 0
403
+ # 0, 0, 1, 0
404
+ # 0, 0, 0, 1
405
+
406
+ p at.left * ac * at.right == at.body #=&gt; true</pre>
407
+ <p><a href="#label-1">_</a></p>
408
+ <h3><a name="label-24" id="label-24">行列の Jordan 標準形を求める</a></h3><!-- RDLabel: "行列の Jordan 標準形を求める" -->
409
+ <pre># sample-jordan-form01.rb
410
+
411
+ require "algebra"
412
+
413
+ M4 = SquareMatrix(Rational, 4)
414
+ m = M4[
415
+ [-1, 1, 2, -1],
416
+ [-5, 3, 4, -2],
417
+ [3, -1, 0, 1],
418
+ [5, -2, -2, 3]
419
+ ]
420
+ m.jordan_form.display; #=&gt;
421
+ # 2, 0, 0, 0
422
+ # 0, 1, 1, 0
423
+ # 0, 0, 1, 1
424
+ # 0, 0, 0, 1
425
+ puts
426
+
427
+ #-----------------------------------
428
+ m = M4[
429
+ [3, 1, -1, 1],
430
+ [-3, -1, 3, -1],
431
+ [-2, -2, 0, 0],
432
+ [0, 0, -4, 2]
433
+ ]
434
+ jf, pt, qt, field, modulus = m.jordan_form_info
435
+ p modulus #=&gt; [a^2 + 4]
436
+ jf.display; puts #=&gt;
437
+ # 2, 1, 0, 0
438
+ # 0, 2, 0, 0
439
+ # 0, 0, a, 0
440
+ # 0, 0, 0, -a
441
+
442
+ m = m.convert_to(jf.class)
443
+ p jf == pt * m * qt #=&gt; true
444
+
445
+ #-----------------------------------
446
+ m = M4[
447
+ [-1, 1, 2, -1],
448
+ [-5, 3, 4, -2],
449
+ [3, -1, 0, 1],
450
+ [5, -2, -2, 0]
451
+ ]
452
+ jf, pt, qt, field, modulus = m.jordan_form_info
453
+ p modulus #=&gt; [a^3 + 3a - 1, b^2 + ab + a^2 + 3]
454
+ jf.display; puts #=&gt;
455
+ # 2, 0, 0, 0
456
+ # 0, a, 0, 0
457
+ # 0, 0, b, 0
458
+ # 0, 0, 0, -b - a
459
+
460
+ m = m.convert_to(jf.class)
461
+ p jf == pt * m * qt #=&gt; true</pre>
462
+ <p><a href="#label-1">_</a></p>
463
+ <h3><a name="label-25" id="label-25">Cayley-Hamilton の定理の(次元毎の)証明</a></h3><!-- RDLabel: "Cayley-Hamilton の定理の(次元毎の)証明" -->
464
+ <pre># sample-cayleyhamilton01.rb
465
+
466
+ require "algebra"
467
+
468
+ n = 4
469
+ R = MPolynomial(Integer)
470
+ MR = SquareMatrix(R, n)
471
+ m = MR.matrix{|i, j| R.var("x#{i}#{j}") }
472
+ Rx = Polynomial(R, "x")
473
+ ch = m.char_polynomial(Rx)
474
+ p ch.evaluate(m) #=&gt; 0</pre>
475
+ <p><a href="#label-1">_</a></p>
476
+ <h2><a name="label-26" id="label-26">グレブナ基底を元の基底で表現する</a></h2><!-- RDLabel: "グレブナ基底を元の基底で表現する" -->
477
+ <pre># sample-groebner02.rb
478
+
479
+ require "algebra"
480
+
481
+ P = MPolynomial(Rational)
482
+ x, y, z = P.vars "xyz"
483
+ f1 = x**2 + y**2 + z**2 -1
484
+ f2 = x**2 + z**2 - y
485
+ f3 = x - z
486
+
487
+ coeff, basis = Groebner.basis_coeff([f1, f2, f3])
488
+ basis.each_with_index do |b, i|
489
+ p [coeff[i].inner_product([f1, f2, f3]), b]
490
+ p coeff[i].inner_product([f1, f2, f3]) == b #=&gt; true
491
+ end</pre>
492
+ <p><a href="#label-1">_</a></p>
493
+ <h2><a name="label-27" id="label-27">任意の基底で割った商と余りを求める(余り=0に意味がある)</a></h2><!-- RDLabel: "任意の基底で割った商と余りを求める(余り=0に意味がある)" -->
494
+ <pre># sample-groebner03.rb
495
+
496
+ require "algebra"
497
+ F5 = ResidueClassRing(Integer, 2)
498
+ F = AlgebraicExtensionField(F5, "a") {|a| a**3 + a + 1}
499
+ a = F.var
500
+ P = MPolynomial(F)
501
+
502
+ x, y, z = P.vars("xyz")
503
+ f1 = x + y**2 + z**2 - 1
504
+ f2 = x**2 + z**2 - y * a
505
+ f3 = x - z - a
506
+
507
+ f = x**3 + y**3 + z**3
508
+ q, r = f.divmod_s(f1, f2, f3)
509
+ p f == q.inner_product([f1, f2, f3]) + r #=&gt; true</pre>
510
+ <p><a href="#label-1">_</a></p>
511
+ <h2><a name="label-28" id="label-28">因数分解</a></h2><!-- RDLabel: "因数分解" -->
512
+ <h3><a name="label-29" id="label-29">整数係数多項式の因数分解</a></h3><!-- RDLabel: "整数係数多項式の因数分解" -->
513
+ <pre># sample-factorize01.rb
514
+
515
+ require "algebra"
516
+
517
+ P = Polynomial(Integer, "x")
518
+ x = P.var
519
+ f = 8*x**7 - 20*x**6 + 6*x**5 - 11*x**4 + 44*x**3 - 9*x**2 - 27
520
+ p f.factorize #=&gt; (2x - 3)^3(x^2 + x + 1)^2</pre>
521
+ <p><a href="#label-1">_</a></p>
522
+ <h3><a name="label-30" id="label-30">Zp 係数多項式の因数分解</a></h3><!-- RDLabel: "Zp 係数多項式の因数分解" -->
523
+ <pre># sample-factorize02.rb
524
+
525
+ require "algebra"
526
+
527
+ Z7 = ResidueClassRing(Integer, 7)
528
+ P = Polynomial(Z7, "x")
529
+ x = P.var
530
+ f = 8*x**7 - 20*x**6 + 6*x**5 - 11*x**4 + 44*x**3 - 9*x**2 - 27
531
+ p f.factorize #=&gt; (x + 5)^2(x + 3)^2(x + 2)^3</pre>
532
+ <p><a href="#label-1">_</a></p>
533
+ <h3><a name="label-31" id="label-31">有理数の代数拡大上の多項式の因数分解</a></h3><!-- RDLabel: "有理数の代数拡大上の多項式の因数分解" -->
534
+ <pre># sample-factorize03.rb
535
+
536
+ require "algebra"
537
+
538
+ A = AlgebraicExtensionField(Rational, "a") {|a| a**2 + a + 1}
539
+ a = A.var
540
+ P = Polynomial(A, "x")
541
+ x = P.var
542
+ f = x**4 + (2*a + 1)*x**3 + 3*a*x**2 + (-3*a - 5)*x - a + 1
543
+ p f.factorize #=&gt; (x + a)^3(x - a + 1)</pre>
544
+ <p><a href="#label-1">_</a></p>
545
+ <h3><a name="label-32" id="label-32">有理数の代数拡大の代数拡大上の多項式の因数分解</a></h3><!-- RDLabel: "有理数の代数拡大の代数拡大上の多項式の因数分解" -->
546
+ <pre># sample-factorize04.rb
547
+
548
+ require "algebra"
549
+
550
+ A = AlgebraicExtensionField(Rational, "a") {|a| a**2 - 2}
551
+ B = AlgebraicExtensionField(A, "b"){|b| b**2 + 1}
552
+ P = Polynomial(B, "x")
553
+ x = P.var
554
+ f = x**4 + 1
555
+ p f.factorize
556
+ #=&gt; (x - 1/2ab - 1/2a)(x + 1/2ab - 1/2a)(x + 1/2ab + 1/2a)(x - 1/2ab + 1/2a)</pre>
557
+ <p><a href="#label-1">_</a></p>
558
+ <h3><a name="label-33" id="label-33">x^4 + 10x^2 + 1 の因数分解</a></h3><!-- RDLabel: "x^4 + 10x^2 + 1 の因数分解" -->
559
+ <pre># sample-factorize05.rb
560
+
561
+ require "algebra"
562
+
563
+ def show(f, mod = 0)
564
+ if mod &gt; 0
565
+ zp = ResidueClassRing(Integer, mod)
566
+ pzp = Polynomial(zp, f.variable)
567
+ f = f.convert_to(pzp)
568
+ end
569
+ fact = f.factorize
570
+ printf "mod %2d: %-15s =&gt; %s\n", mod, f, fact
571
+ end
572
+
573
+ Px = Polynomial(Integer, "x")
574
+ x = Px.var
575
+ f = x**4 + 10*x**2 + 1
576
+ #f = x**4 - 10*x**2 + 1
577
+ show(f)
578
+ Primes.new.each do |mod|
579
+ break if mod &gt; 100
580
+ show(f, mod)
581
+ end
582
+
583
+ #mod 0: x^4 + 10x^2 + 1 =&gt; x^4 + 10x^2 + 1
584
+ #mod 2: x^4 + 1 =&gt; (x + 1)^4
585
+ #mod 3: x^4 + x^2 + 1 =&gt; (x + 2)^2(x + 1)^2
586
+ #mod 5: x^4 + 1 =&gt; (x^2 + 3)(x^2 + 2)
587
+ #mod 7: x^4 + 3x^2 + 1 =&gt; (x^2 + 4x + 6)(x^2 + 3x + 6)
588
+ #mod 11: x^4 - x^2 + 1 =&gt; (x^2 + 5x + 1)(x^2 + 6x + 1)
589
+ #mod 13: x^4 + 10x^2 + 1 =&gt; (x^2 - x + 12)(x^2 + x + 12)
590
+ #mod 17: x^4 + 10x^2 + 1 =&gt; (x^2 + 3x + 1)(x^2 + 14x + 1)
591
+ #mod 19: x^4 + 10x^2 + 1 =&gt; (x + 17)(x + 10)(x + 9)(x + 2)
592
+ #mod 23: x^4 + 10x^2 + 1 =&gt; (x^2 + 6)(x^2 + 4)
593
+ #mod 29: x^4 + 10x^2 + 1 =&gt; (x^2 + 21)(x^2 + 18)
594
+ #mod 31: x^4 + 10x^2 + 1 =&gt; (x^2 + 22x + 30)(x^2 + 9x + 30)
595
+ #mod 37: x^4 + 10x^2 + 1 =&gt; (x^2 + 32x + 36)(x^2 + 5x + 36)
596
+ #mod 41: x^4 + 10x^2 + 1 =&gt; (x^2 + 19x + 1)(x^2 + 22x + 1)
597
+ #mod 43: x^4 + 10x^2 + 1 =&gt; (x + 40)(x + 29)(x + 14)(x + 3)
598
+ #mod 47: x^4 + 10x^2 + 1 =&gt; (x^2 + 32)(x^2 + 25)
599
+ #mod 53: x^4 + 10x^2 + 1 =&gt; (x^2 + 41)(x^2 + 22)
600
+ #mod 59: x^4 + 10x^2 + 1 =&gt; (x^2 + 13x + 1)(x^2 + 46x + 1)
601
+ #mod 61: x^4 + 10x^2 + 1 =&gt; (x^2 + 54x + 60)(x^2 + 7x + 60)
602
+ #mod 67: x^4 + 10x^2 + 1 =&gt; (x + 55)(x + 39)(x + 28)(x + 12)
603
+ #mod 71: x^4 + 10x^2 + 1 =&gt; (x^2 + 43)(x^2 + 38)
604
+ #mod 73: x^4 + 10x^2 + 1 =&gt; (x + 68)(x + 44)(x + 29)(x + 5)
605
+ #mod 79: x^4 + 10x^2 + 1 =&gt; (x^2 + 64x + 78)(x^2 + 15x + 78)
606
+ #mod 83: x^4 + 10x^2 + 1 =&gt; (x^2 + 18x + 1)(x^2 + 65x + 1)
607
+ #mod 89: x^4 + 10x^2 + 1 =&gt; (x^2 + 9x + 1)(x^2 + 80x + 1)
608
+ #mod 97: x^4 + 10x^2 + 1 =&gt; (x + 88)(x + 54)(x + 43)(x + 9)</pre>
609
+ <p><a href="#label-1">_</a></p>
610
+ <h3><a name="label-34" id="label-34">整数、有理係数多変数多項式の因数分解</a></h3><!-- RDLabel: "整数、有理係数多変数多項式の因数分解" -->
611
+ <pre># sample-m-factorize01.rb
612
+
613
+ require "algebra"
614
+ P = MPolynomial(Integer)
615
+ x, y, z = P.vars("xyz")
616
+ f = x**3 + y**3 + z**3 - 3*x*y*z
617
+ p f.factorize #=&gt; (x + y + z)(x^2 - xy - xz + y^2 - yz + z^2)
618
+
619
+ PQ = MPolynomial(Rational)
620
+ x, y, z = PQ.vars("xyz")
621
+ f = x**3 + y**3/8 + z**3 - 3*x*y*z/2
622
+ p f.factorize #=&gt; (1/8)(2x + y + 2z)(4x^2 - 2xy - 4xz + y^2 - 2yz + 4z^2)</pre>
623
+ <p><a href="#label-1">_</a></p>
624
+ <h3><a name="label-35" id="label-35">Zp 係数多変数多項式の因数分解</a></h3><!-- RDLabel: "Zp 係数多変数多項式の因数分解" -->
625
+ <pre># sample-m-factorize02.rb
626
+
627
+ require "algebra"
628
+
629
+ Z7 = ResidueClassRing(Integer, 7)
630
+ P = MPolynomial(Z7)
631
+ x, y, z = P.vars("xyz")
632
+ f = x**3 + y**3 + z**3 - 3*x*y*z
633
+ p f.factorize #=&gt; (x + 4y + 2z)(x + 2y + 4z)(x + y + z)</pre>
634
+ <p><a href="#label-1">_</a></p>
635
+ <h2><a name="label-36" id="label-36">代数方程式</a></h2><!-- RDLabel: "代数方程式" -->
636
+ <h3><a name="label-37" id="label-37">最小多項式</a></h3><!-- RDLabel: "最小多項式" -->
637
+ <pre># sample-algebraic-equation01.rb
638
+
639
+ require "algebra"
640
+
641
+ PQ = MPolynomial(Rational)
642
+ a, b, c = PQ.vars("abc")
643
+ p AlgebraicEquation.minimal_polynomial(a + b + c, a**2-2, b**2-3, c**2-5)
644
+ #=&gt; x^8 - 40x^6 + 352x^4 - 960x^2 + 576</pre>
645
+ <p><a href="#label-1">_</a></p>
646
+ <h3><a name="label-38" id="label-38">最小分解体</a></h3><!-- RDLabel: "最小分解体" -->
647
+ <pre># sample-splitting-field01.rb
648
+
649
+ require "algebra"
650
+
651
+ PQ = Polynomial(Rational, "x")
652
+ x = PQ.var
653
+ f = x**4 + 2
654
+ p f #=&gt; x^4 + 2
655
+ field, modulus, facts = f.decompose
656
+ p modulus #=&gt; [a^4 + 2, b^2 + a^2]
657
+ p facts #=&gt; (x - a)(x + a)(x - b)(x + b)
658
+
659
+ fp = Polynomial(field, "x")
660
+ x = fp.var
661
+ facts = Factors.new(facts.collect{|g, n| [g.evaluate(x), n]})
662
+ p facts.pi == f.convert_to(fp) #=&gt; true</pre>
663
+ <p><a href="#label-1">_</a></p>
664
+ <h3><a name="label-39" id="label-39">多項式のガロア群</a></h3><!-- RDLabel: "多項式のガロア群" -->
665
+ <pre># sample-galois-group01.rb
666
+
667
+ require "algebra/rational"
668
+ require "algebra/polynomial"
669
+
670
+ P = Algebra.Polynomial(Rational, "x")
671
+ x = P.var
672
+
673
+ (x**3 - 3*x + 1).galois_group.each do |g|
674
+ p g
675
+ end
676
+ #=&gt; [0, 1, 2]
677
+ # [1, 2, 0]
678
+ # [2, 0, 1]]
679
+
680
+ (x**3 - x + 1).galois_group.each do |g|
681
+ p g
682
+ end
683
+ #=&gt; [0, 1, 2]
684
+ # [1, 0, 2]
685
+ # [2, 0, 1]
686
+ # [0, 2, 1]
687
+ # [1, 2, 0]
688
+ # [2, 1, 0]</pre>
689
+ <p><a href="#label-1">_</a></p>
690
+ <h2><a name="label-40" id="label-40">初等幾何</a></h2><!-- RDLabel: "初等幾何" -->
691
+ <h3><a name="label-41" id="label-41">重心の存在</a></h3><!-- RDLabel: "重心の存在" -->
692
+ <pre># sample-geometry01.rb
693
+
694
+ require 'algebra'
695
+ R = MPolynomial(Rational)
696
+ x,y,a1,a2,b1,b2,c1,c2 = R.vars('xya1a2b1b2c1c2')
697
+
698
+ V = Vector(R, 2)
699
+ X, A, B, C = V[x,y], V[a1,a2], V[b1,b2], V[c1,c2]
700
+
701
+ D = (B + C) /2
702
+ E = (C + A) /2
703
+ F = (A + B) /2
704
+
705
+ def line(p1, p2, p3)
706
+ SquareMatrix.det([[1, *p1], [1, *p2], [1, *p3]])
707
+ end
708
+
709
+ l1 = line(X, A, D)
710
+ l2 = line(X, B, E)
711
+ l3 = line(X, C, F)
712
+ s = line(A, B, C)
713
+
714
+ g = Groebner.basis [l1, l2, l3, s-1] #s-1 means non degeneracy
715
+
716
+ g.each_with_index do |f, i|
717
+ p f
718
+ end
719
+ #x - 1/3a1 - 1/3b1 - 1/3c1
720
+ #y - 1/3a2 - 1/3b2 - 1/3c2
721
+ #a1b2 - a1c2 - a2b1 + a2c1 + b1c2 - b2c1 - 1</pre>
722
+ <p><a href="#label-1">_</a></p>
723
+ <h3><a name="label-42" id="label-42">外心の存在</a></h3><!-- RDLabel: "外心の存在" -->
724
+ <pre># sample-geometry02.rb
725
+
726
+ require 'algebra'
727
+ R = MPolynomial(Rational)
728
+ x,y,a1,a2,b1,b2,c1,c2 = R.vars('xya1a2b1b2c1c2')
729
+
730
+ V = Vector(R, 2)
731
+ X, A, B, C = V[x,y], V[a1,a2], V[b1,b2], V[c1,c2]
732
+
733
+ def line(p1, p2, p3)
734
+ SquareMatrix.det([[1, *p1], [1, *p2], [1, *p3]])
735
+ end
736
+
737
+ def vline(p1, p2, p3)
738
+ (p1-p2).norm2 - (p1-p3).norm2
739
+ end
740
+
741
+ l1 = vline(X, A, B)
742
+ l2 = vline(X, B, C)
743
+ l3 = vline(X, C, A)
744
+
745
+ s = line(A, B, C)
746
+
747
+ g = Groebner.basis [l1, l2, l3, s-1] #s-1 means non degeneracy
748
+
749
+ g.each do |f|
750
+ p f
751
+ end
752
+ #x - 1/2a1a2b1 + 1/2a1a2c1 + 1/2a1b1c2 - 1/2a1c1c2 - 1/2a1 - 1/2a2^2b2 + 1/2a2^2c2 + 1/2a2b1^2 - 1/2a2b1c1 + 1/2a2b2^2 - 1/2a2c2^2 - 1/2b1^2c2 + 1/2b1c1c2 - 1/2b2^2c2 + 1/2b2c2^2 - 1/2c1
753
+ #y + 1/2a1^2b1 - 1/2a1^2c1 - 1/2a1b1^2 + 1/2a1c1^2 + 1/2a2^2b1 - 1/2a2^2c1 - 1/2a2b1b2 - 1/2a2b1c2 + 1/2a2b2c1 + 1/2a2c1c2 + 1/2b1^2c1 + 1/2b1b2c2 - 1/2b1c1^2 -1/2b2c1c2 - 1/2b2 - 1/2c2
754
+ #a1b2 - a1c2 - a2b1 + a2c1 + b1c2 - b2c1 - 1</pre>
755
+ <p><a href="#label-1">_</a></p>
756
+ <h3><a name="label-43" id="label-43">垂心の存在</a></h3><!-- RDLabel: "垂心の存在" -->
757
+ <pre># sample-geometry04.rb
758
+
759
+ require 'algebra'
760
+
761
+ R = MPolynomial(Rational)
762
+ x,y,a1,a2,b1,b2,c1,c2 = R.vars('xya1a2b1b2c1c2')
763
+ V = Vector(R, 2)
764
+ X, A, B, C = V[x,y], V[a1,a2], V[b1,b2], V[c1,c2]
765
+
766
+ def perpendicular(p0, p1, p2, p3)
767
+ (p0-p1).inner_product(p2-p3)
768
+ end
769
+
770
+ def line(p1, p2, p3)
771
+ SquareMatrix.det([[1, *p1], [1, *p2], [1, *p3]])
772
+ end
773
+
774
+ l1 = perpendicular(X, A, B, C)
775
+ l2 = perpendicular(X, B, C, A)
776
+ l3 = perpendicular(X, C, A, B)
777
+
778
+ s = line(A, B, C)
779
+ g = Groebner.basis [l1, l2, l3, s-1] #s-1 means non degeneracy
780
+
781
+ g.each do |f|
782
+ p f
783
+ end
784
+ #x + a1a2b1 - a1a2c1 - a1b1c2 + a1c1c2 + a2^2b2 - a2^2c2 - a2b1^2 + a2b1c1 - a2b2^2 + a2c2^2 + b1^2c2 - b1c1c2 - b1 + b2^2c2 - b2c2^2
785
+ #y - a1^2b1 + a1^2c1 + a1b1^2 - a1c1^2 - a2^2b1 + a2^2c1 + a2b1b2 + a2b1c2 - a2b2c1 - a2c1c2 - a2 - b1^2c1 - b1b2c2 + b1c1^2 + b2c1c2
786
+ #a1b2 - a1c2 - a2b1 + a2c1 + b1c2 - b2c1 - 1</pre>
787
+ <p><a href="#label-1">_</a></p>
788
+ <h3><a name="label-44" id="label-44">4 つの等面積</a></h3><!-- RDLabel: "4 つの等面積" -->
789
+ <p>see <a href="http://www1.odn.ne.jp/drinkcat/topic/column/quest/quest_2/quest_2.html">&lt;URL:http://www1.odn.ne.jp/drinkcat/topic/column/quest/quest_2/quest_2.html&gt;</a> Question 3.</p>
790
+ <pre># sample-geometry07.rb
791
+
792
+ require "algebra"
793
+ R = MPolynomial(Rational)
794
+ m, b, a = R.vars("mba")
795
+ K = LocalizedRing(R)
796
+ a0, b0, m0 = K[a], K[b], K[m]
797
+
798
+ M = SquareMatrix(K, 3)
799
+ l0, l1, l2 = M[[0, 1, 0], [1, 1, -1], [1, 0, 0]]
800
+ m4 = M[[a0, 1, -a0], [1, b0, -b0], [m0, -1, 0]]
801
+ m40 = m4.dup; m40.set_row(0, l0)
802
+ m41 = m4.dup; m41.set_row(1, l1)
803
+ m42 = m4.dup; m42.set_row(2, l2)
804
+
805
+ def mdet(m, i)
806
+ i = i % 3
807
+ m.minor(i, 2).determinant * (-1) ** i
808
+ end
809
+
810
+ def tris(m, i)
811
+ pts = [0, 1, 2] - [i]
812
+ (m.determinant)**2 / mdet(m, pts[0]) / mdet(m, pts[1])
813
+ end
814
+
815
+ u0 = (tris(m4, 0) - tris(m40, 0)).numerator
816
+ u1 = (tris(m4, 1) - tris(m41, 1)).numerator
817
+ u2 = (tris(m4, 2) - tris(m42, 2)).numerator
818
+
819
+ puts [u0, u1, u2]
820
+ puts
821
+
822
+ [u0, u1, u2].each do |um|
823
+ p um.factorize
824
+ end
825
+ puts
826
+
827
+ x = u0 / a / (m*b+1)
828
+ y = u1 / (m+a) / (b-1)
829
+ z = u2 / (-b*a+1)
830
+
831
+ p x
832
+ p y
833
+ p z
834
+ puts
835
+
836
+ gb = Groebner.basis([x, y, z])
837
+ puts gb
838
+ puts
839
+
840
+ gb.each do |v|
841
+ p v.factorize
842
+ end
843
+ #(-1)(-mb + m + ba^3 + ba^2 - ba - a^2)
844
+ #(-1)(-ma + m + ba^2 - a^2)
845
+ #(-1)(b + a - 1)(-ba + 1)(a)
846
+ #(-1)(-ba + 1)(a)(a^2 + a - 1)
847
+
848
+ # =&gt; a = -1/2 + \sqrt{5}/2</pre>
849
+ <p><a href="#label-1">_</a></p>
850
+ <h2><a name="label-45" id="label-45">解析</a></h2><!-- RDLabel: "解析" -->
851
+ <h3><a name="label-46" id="label-46">ラグランジュの乗数法</a></h3><!-- RDLabel: "ラグランジュの乗数法" -->
852
+ <pre># sample-lagrange-multiplier01.rb
853
+
854
+ require 'algebra'
855
+ P = MPolynomial(Rational)
856
+ t, x, y, z = P.vars('txyz')
857
+ f = x**3+2*x*y*z - z**2
858
+ g = x**2 + y**2 + z**2 - 1
859
+
860
+ fx = f.derivate(x)
861
+ fy = f.derivate(y)
862
+ fz = f.derivate(z)
863
+
864
+ gx = g.derivate(x)
865
+ gy = g.derivate(y)
866
+ gz = g.derivate(z)
867
+
868
+ F = [fx - t * gx, fy - t * gy, fz - t * gz, g]
869
+
870
+ Groebner.basis(F).each do |h|
871
+ p h.factorize
872
+ end
873
+
874
+ #(1/7670)(7670t - 11505x - 11505yz - 335232z^6 + 477321z^4 - 134419z^2)
875
+ #x^2 + y^2 + z^2 - 1
876
+ #(1/3835)(3835xy - 19584z^5 + 25987z^3 - 6403z)
877
+ #(1/3835)(3835x + 3835yz - 1152z^4 - 1404z^2 + 2556)(z)
878
+ #(1/3835)(3835y^3 + 3835yz^2 - 3835y - 9216z^5 + 11778z^3 - 2562z)
879
+ #(1/3835)(3835y^2 - 6912z^4 + 10751z^2 - 3839)(z)
880
+ #(1/118)(118y - 1152z^3 + 453z)(z)(z - 1)(z + 1)
881
+ #(1/1152)(z)(z - 1)(3z - 2)(3z + 2)(z + 1)(128z^2 - 11)</pre>
882
+ <p><a href="#label-1">_</a></p>
883
+
884
+ </body>
885
+ </html>