2015年度 数式処理実習 [第6回] Maximaによる展開・因数分解 1 多項式

May 14, 2015
[p.1/5]
2015 年度 数式処理実習 [第 6 回] Maxima による展開・因数分解
前回は Maxima を使って,単純な計算をしました.しかし,数式処理ソフトの魅力は,変数を含んだ式の変形にあり
ます.
今週も Linux を使います.まずはいつも通り,端末を起動して,作業用のディレクトリ ˜/su-shiki に移動しましょう.
端末 kawakubo > cd⊔ ~/su-shiki
kawakubo > pwd
← ˜/su-shiki に移動
← su-shiki ディレクトリにいることを確認
次に,端末から,Maxima を起動しましょう.
kawakubo > maxima
で,端末内に Maxima が立ち上がります.
maxima
% maxima
Maxima 5.20.1 http://maxima.sourceforge.net
using Lisp SBCL 1.0.38
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1)
こんな画面が立ち上がったと思います.これで準備完了です.
多項式の操作
1
1.1
多項式の展開
まずは多項式の展開から始めましょう.展開には expand 関数を使います.
expand(多項式)
1.1.1
例題 1
(x2 + x + 1)(x2 − x + 1) を展開してみましょう.
maxima
(%i1) expand( (x^2+x+1)*(x^2-x+1) );
(%o1)
4
2
x + x + 1
これで,x4 + x2 + 1 と読みます.(x2 + x + 1)(x2 − x + 1) = x4 + x2 + 1 と展開できました.
1.1.2
例題 2
係数が文字でも構いません.(ax2 + bx + c)(dx2 − ex + f ) を展開してみましょう.なお,入力の際,掛け算
の記号「∗」を省略しないように!例えば bx なら,b*x と入力しなければいけません.もし,∗ を忘れて
bx と入力してしまうと,Maxima は「bx という名前の新たな変数が現れた」と解釈してしまいます.
(%i2) expand( (a*x^2+b*x+c)*(d*x^2-e*x+f) );
4
3
3
2
2
2
(%o2) a d x - a e x + b d x + a f x - b e x + c d x + b f x - c e x + c f
maxima
(ax2 + bx + c)(dx2 − ex + f ) = adx4 − aex3 + bdx3 + af x2 − bex2 + cdx2 + bf x − cex + cf と展開できました.なお,
上のように,答えの出力においては,掛け算記号「∗」は省略されます.ですが,入力においてはくれぐれも省略しない
2015 年度 数式処理実習 [第 6 回] Maxima による展開・因数分解
May 14, 2015
[p.2/5]
ようにして下さい.
1.2
任意の項の係数
特定の次数の項の係数を知りたいときには ratcoef を使います.
ratcoef(多項式,変数)
1.2.1
例題 3
先程の (ax2 + bx + c)(dx2 − ex + f ) を展開して,さらに x2 の係数を求めてみましょう.
maxima
(%i3) ratcoef(expand( (a*x^2+b*x+c)*(d*x^2-e*x+f) ),x^2);
(%o3)
a f -b e + c d
x2 の係数は af − be + cd となりました.上で展開したものと見比べてみると正しいことがわかります.
1.3
多項式の因数分解
多項式を因数分解するときには,factor 関数を使います.
factor(多項式)
1.3.1
例題 4
2x2 − 5x + 2 を因数分解してみます.
maxima
(%i4) factor(2*x^2-5*x+2);
(%o4)
(- 2 + x) (- 1 + 2 x)
2x2 − 5x + 2 = (−2 + x)(−1 + 2x) と因数分解されました.
1.3.2
例題 5
a − b6 はどうでしょう.
6
maxima
(%i5) factor(a^6-b^6);
(%o5)
2
2
2
2
(%o5)
(a - b) (a + b) (a - a b + b ) (a + a b + b )
a6 − b6 = (a − b)(a + b)(a2 − ab + b2 )(a2 + ab + b2 ) となります.
1.3.3
素因数分解
factor に自然数を与えると,素因数分解してくれます.
maxima
(%i6) factor(2520);
(%o6)
3 2
(%o6)
2 3 5 7
2520 = 23 × 32 × 5 × 7 となります.
2
方程式を解く
Maxima は,方程式や連立方程式や微分方程式を,ほぼすべて解いてくれます.しかも,文字変数が入ったままで何
も問題なく計算を進められます.方程式を解くには,solve を使います.
solve(方程式, 解かせる変数)
2015 年度 数式処理実習 [第 6 回] Maxima による展開・因数分解
2.1
May 14, 2015
[p.3/5]
例題
3次方程式には「カルダノの公式」と呼ばれている解の公式がありますが,少し複雑な公式です.そこで,Maxima に
3次方程式を解かせてみましょう.例えば,x3 + 2x2 + 3x + 4 = 0 を解いてみます.
maxima (%i7) solve(x^3+2*x^2+3*x+4=0,x);
← (方程式を x について解くので最後に,x をつけます)
sqrt(3) %i
1
5 (---------- - -)
2
2
5 sqrt(2)
35 1/3
sqrt(3) %i
1
(%o7) [x = - --------------------- + (--------- - --)
(- ---------- - -)
5 sqrt(2)
35 1/3
3/2
27
2
2
9 (--------- - --)
3
3/2
27
3
sqrt(3) %i
1
5 (- ---------- - -)
2
5 sqrt(2)
35 1/3 sqrt(3) %i
1
2
2
2
- -, x = (--------- - --)
(---------- - -) - --------------------- - -,
3
3/2
27
2
2
5 sqrt(2)
35 1/3
3
3
9 (--------- - --)
3/2
27
3
5 sqrt(2)
35 1/3
5
2
x = (--------- - --)
- --------------------- - -]
3/2
27
5 sqrt(2)
35 1/3
3
3
9 (--------- - --)
3/2
27
3
と解が求まりました.解は3つあるので,[x=…,x=…,x=…] という形で出力されています.別の回で詳しくやりますが,
このような複数のデータの組をリストと言います.
なお,%i は虚数単位でしたね.答えを見易く書くと,次の通りです.
)
(√
) 13 ( √
)
( √
3i
1
5
2 − 2
3i 1
2
5 2 35
−
− ,
x = − ( √
−
−
3
) 13 +
27
2
2
3
32
9 5 3 2 − 35
27
32
( √
)
) 13 ( √
)
( √
3i
1
5
−
−
2
2
2
5 2 35
3i 1
x =
−
−
− ( √
3
) 13 − 3 ,
27
2
2
2
3
35
9 5 3 2 − 27
x
=
( √
5 2
3
3
2
−
35
27
32
) 13
−
(
9
5
5
√
3
32
2
−
2
) 13 − 3
35
27
このように厳密な解を返してくれるのは嬉しいんですが,複雑すぎてあまり分かった気になりません.
そこで,前回にやった float を使って数値化してみましょう.
(%i8) float(solve(x^3+2*x^2+3*x+4=0,x));
(%o8) [x = - 1.385066430830463 (.8660254037844386 %i - 0.5)
+ .4011039060577433 (- .8660254037844386 %i - 0.5) - .6666666666666666,
x = .4011039060577433 (.8660254037844386 %i - 0.5)
- 1.385066430830463 (- .8660254037844386 %i - 0.5) - .6666666666666666,
x = - 1.650629191439386]
maxima
2015 年度 数式処理実習 [第 6 回] Maxima による展開・因数分解
May 14, 2015
[p.4/5]
x = −1.385066430830463 (0.8660254037844386 i − 0.5)
+ 0.4011039060577433 (−0.8660254037844386 i − 0.5) − 0.6666666666666666,
x = 0.4011039060577433 (0.8660254037844386 i − 0.5)
−
x =
1.385066430830463 (−0.8660254037844386 i − 0.5) − 0.6666666666666666,
−1.650629191439386
これで数値化されましたが,まだ括弧が残っていて,きれいな形ではありません.この括弧を外して,きっちり実部と
虚部に分けるには,expand を使います.
maxima (%i9) expand(float(solve(x^3+2*x^2+3*x+4=0,x)));
(%o9) [x = - 1.546868887231395 %i - 0.174685404280307,
x = 1.546868887231395 %i - 0.174685404280307, x = - 1.650629191439386]
x
x
x
= −1.546868887231395 i − 0.174685404280307,
= 1.546868887231395 i − 0.174685404280307,
= −1.650629191439386
これで,互いに複素共役な虚数解の組と1つの実数解(合計3つの解)が近似的に求まりました.ちなみに,前のペー
ジで求めた3つの厳密解の内,1つ目の x と2つ目の x をよくよく眺めて見て下さい.一見分かりにくいですが,この
2つはちゃんと複素共役になっていますね.
2.2
LATEX 形式への変換
前回は紹介しませんでしたが,実は Maxima は,答えを LATEX の形式に変換してくれます.それには,tex というコ
マンドを使います.
(なお,LATEX は TEX という言語を拡張してできたものです.
)これを使えば,LATEX で先程の複雑な
答えを書くのも簡単です.
maxima (%i10) tex(solve(x^3+2*x^2+3*x+4=0,x));
$$\left[ x=-{{5\,\left({{\sqrt{3}\,i}\over{2}}-{{1}\over{2}}\right)
}\over{9\,\left({{5\,\sqrt{2}}\over{3^{{{3}\over{2}}}}}-{{35}\over{
27}}\right)^{{{1}\over{3}}}}}+\left({{5\,\sqrt{2}}\over{3^{{{3
}\over{2}}}}}-{{35}\over{27}}\right)^{{{1}\over{3}}}\,\left(-{{
\sqrt{3}\,i}\over{2}}-{{1}\over{2}}\right)-{{2}\over{3}} , x=\left(
{{5\,\sqrt{2}}\over{3^{{{3}\over{2}}}}}-{{35}\over{27}}\right)^{{{1
}\over{3}}}\,\left({{\sqrt{3}\,i}\over{2}}-{{1}\over{2}}\right)-{{5
\,\left(-{{\sqrt{3}\,i}\over{2}}-{{1}\over{2}}\right)}\over{9\,
\left({{5\,\sqrt{2}}\over{3^{{{3}\over{2}}}}}-{{35}\over{27}}\right)
^{{{1}\over{3}}}}}-{{2}\over{3}} , x=\left({{5\,\sqrt{2}}\over{3^{{{
3}\over{2}}}}}-{{35}\over{27}}\right)^{{{1}\over{3}}}-{{5}\over{9\,
\left({{5\,\sqrt{2}}\over{3^{{{3}\over{2}}}}}-{{35}\over{27}}\right)
^{{{1}\over{3}}}}}-{{2}\over{3}} \right] $$
(%o10)
false
←この false は無視して下さい
これをコピーして LATEX の原稿ファイルにペーストするだけです.必要ならちょっと編集・整形しましょう.なお,今
までに出てこなかった命令がいくつかあるので説明しておきましょう.
• 式全体が $$と$$で挟んでありますが,これは\begin{equation*}と\end{equation*}で挟むのと同じ意味で,
「別
行立ての数式にせよ」ということです.
• {{1}\over{3}} は \frac{1}{3}と同じで,分数を出力します.
• \, は「小さな空白をあけよ」という命令です.
• \left[ 及び \right] は,カギ括弧 [ ] を,中身の式の大きさに合わせて見栄え良く拡大せよという命令です.
\left と\right は組になっているので,\left[ で始まったら必ず \right] で終わらないといけません.\left(
と \right) も同様です.
2015 年度 数式処理実習 [第 6 回] Maxima による展開・因数分解
2.3
May 14, 2015
[p.5/5]
素数
ある数 n が素数かどうかを判定するには,primep を用います.
primep(判定する数値・変数)
その数が素数なら true(真)が,素数でないなら false(偽)が返ってきます.
(%i11) primep(7);
(%o11)
(%i12) primep(124);
(%o12)
maxima
← 7 が素数かどうかを判定.
true
← 124 が素数かどうかを判定.
false
レポート課題
3
• 講義のページ http://www.cis.fukuoka-u.ac.jp/˜kawakubo/ の今日の所の sm140000 06.pdf の設問に答えよ.
• sm140000 06.tex (sm140000 06.pdf の原稿ファイル) をダウンロードし,˜/su-shiki ディレクトリに保存せよ.
• ファイル名「sm140000 06.tex」の「sm140000」の部分は各自の学籍番号に変更すること.また,Emacs でファイ
ルの中身を編集し,上段の氏名欄に自分の学籍番号と氏名を書くこと.
• Maxima を用いて問題を解け.解答は,原稿ファイルを編集して LATEX で記入せよ.
• PDF ファイルを作成し,印刷したものを提出すること.締切は 5 月 28 日.
• 疑問点等があれば,書いて下さい.
復習:PDF ファイルを作成するために使うもの.Maxima 用の端末とは別に,もう一つ端末を起動します.
LATEX タイプセットなど
[kawakubo@pe5-(~)-112] cd⊔ ~/su-shiki
[kawakubo@pe5-(~/su-shiki)-113] emacs⊔ &
[kawakubo@pe5-(~/su-shiki)-114] platex⊔ sm140000_06.tex
[kawakubo@pe5-(~/su-shiki)-115] dvipdfmx⊔ sm140000_06.dvi
← ˜/su-shiki に移動
← emacs をバックグラウンドで起動
← sm140000 06.tex を platex でタイプセット
← sm140000 06.dvi から sm140000 06.pdf を作成